Guten Tag,
ich übe mich gerade in der 2D Programmierung in Java.
Bei einem kleinen Testprogramm soll im Moment ein Viereck von oben nach unten fallen.
Der Hintergrund der Anwendung wird durch ein Bild dargestellt, welches komplett transparent ist, nur ganz unten einen schwarzen Balken hat. Wenn sich das Viereck auf dem transparenten Hintergrund bewegt, soll keine Kollision auslösen, bei dem schwarzen Balken am unteren Ende jedoch schon.
Doch leider kommt er nicht so weit, denn es fliegt eine "outside of Raster" Exception.
Hier der Code:
(Fehler liegt bei der Erzeugung des Subimiges: BufferedImage srcSub = srcImg.getSubimage[...])
Die Ausgabe inklusive Exception:
Es scheint mit der Veränderung des Y-Wertes des Vierecks zutun zu haben. Aber wo genau liegt der Fehler?
Wenn der Code nicht auf Anhieb verständlich ist, einfach nachfragen und ich werde ihn genauer erläutern!
Wenn sonst noch Fragen sind, bitte einfach melden.
Mit freundlichem Gruß,
Letavino
ich übe mich gerade in der 2D Programmierung in Java.
Bei einem kleinen Testprogramm soll im Moment ein Viereck von oben nach unten fallen.
Der Hintergrund der Anwendung wird durch ein Bild dargestellt, welches komplett transparent ist, nur ganz unten einen schwarzen Balken hat. Wenn sich das Viereck auf dem transparenten Hintergrund bewegt, soll keine Kollision auslösen, bei dem schwarzen Balken am unteren Ende jedoch schon.
Doch leider kommt er nicht so weit, denn es fliegt eine "outside of Raster" Exception.
Hier der Code:
(Fehler liegt bei der Erzeugung des Subimiges: BufferedImage srcSub = srcImg.getSubimage[...])
Java:
public void move()
{
boolean[] collision = Tools.collision((int)this.x,(int)this.y,this.img,0,0,backgroundImg);
if(!collision[2])
{
inAir = true;
timeInAir += Main.sleep;
}
else
{
inAir = false;
timeInAir = 0;
}
if(collision[0])
speedY = 0;
if(collision[1])
speedX = 0;
if(collision[3])
speedX = 0;
if(collision[4])
System.out.println("Inner Collision");
//v += g * t
speedY = Main.forceOfGravity * timeInAir /1000;
//s = v * t
this.x += speedX * Main.sleep/1000;
this.y += speedY * Main.sleep/1000;
}
Java:
public static boolean[] collision(int srcX, int srcY, BufferedImage srcImg, int refX, int refY, BufferedImage refImg)
{
boolean[] b = new boolean[5];
Rectangle srcRect = new Rectangle(srcX,srcY,srcImg.getWidth(),srcImg.getHeight());
Rectangle refRect = new Rectangle(refX,refY,refImg.getWidth(),refImg.getHeight());
Rectangle intRect = new Rectangle();;
intRect = srcRect.intersection(refRect);
System.out.println(
srcX+","+srcY+","+srcImg.getWidth()+","+srcImg.getHeight()+" "+
(int)intRect.getX()+","+(int)intRect.getY()+","+(int)intRect.getWidth()+","+ (int)intRect.getHeight());
BufferedImage srcSub = srcImg.getSubimage((int)intRect.getX(), (int)intRect.getY(), (int)intRect.getWidth(), (int)intRect.getHeight());
BufferedImage refSub = srcImg.getSubimage((int)intRect.getX(), (int)intRect.getY(), (int)intRect.getWidth(), (int)intRect.getHeight());
for(int i=0;i<intRect.getWidth()-1;i++)
for(int j=0;j<intRect.getHeight()-1;j++)
if(!isTransparent(i,j,srcSub)&&!isTransparent(i,j,refSub))
{
if(intRect.getY()+j==srcY)
b[0] = true; //oben
if(intRect.getX()+i==srcX+srcImg.getWidth()-1)
b[1] = true; //rechts
if(intRect.getY()+j==srcY+srcImg.getHeight()-1)
b[2] = true; //unten
if(intRect.getX()+i==srcX)
b[3] = true; //links
if(!(b[0]||b[1]||b[2]||b[3])) // mitte
b[4] = true;
}
return b;
}
Java:
0,0,10,30 0,0,10,30
0,0,10,30 0,0,10,30
0,0,10,30 0,0,10,30
0,0,10,30 0,0,10,30
0,0,10,30 0,0,10,30
0,0,10,30 0,0,10,30
0,0,10,30 0,0,10,30
0,0,10,30 0,0,10,30
Exception in thread "Thread-4" java.awt.image.RasterFormatException: (y + height) is outside of Raster
at sun.awt.image.ByteInterleavedRaster.createWritableChild(Unknown Source)
at java.awt.image.BufferedImage.getSubimage(Unknown Source)
at Tools.collision(Tools.java:48)
at Sprite.move(Sprite.java:73)
at Main.moveObjects(Main.java:107)
at Main.run(Main.java:54)
at java.lang.Thread.run(Unknown Source)
0,1,10,30 0,1,10,30
Es scheint mit der Veränderung des Y-Wertes des Vierecks zutun zu haben. Aber wo genau liegt der Fehler?
Wenn der Code nicht auf Anhieb verständlich ist, einfach nachfragen und ich werde ihn genauer erläutern!
Wenn sonst noch Fragen sind, bitte einfach melden.
Mit freundlichem Gruß,
Letavino