Ich versuche die pixelgenaue Kollision aus Quaxlis Tutorial in meinen Spielprototypen zu implementieren, aber bekomme immer folgende Fehlermeldung wenn mal eine Kollision auftritt:
Exception in thread "Thread-2" java.awt.image.RasterFormatException: (x + width) is outside of Raster
at sun.awt.image.BytePackedRaster.createWritableChild(BytePackedRaster.java:1306)
at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1173)
at Sprite.checkCollision(Sprite.java:78)
at GamePanel.doLogic(GamePanel.java:158)
at GamePanel.run(GamePanel.java:92)
at java.lang.Thread.run(Thread.java:636)
Hat jemand ne Ahnung, woher das kommt? Hier meine Kollisionsmethode und deren Aufruf im GamePanel (da wird für abgegebene Schüsse gecheckt, ob sie mit einem Gegner kollidieren):
Exception in thread "Thread-2" java.awt.image.RasterFormatException: (x + width) is outside of Raster
at sun.awt.image.BytePackedRaster.createWritableChild(BytePackedRaster.java:1306)
at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1173)
at Sprite.checkCollision(Sprite.java:78)
at GamePanel.doLogic(GamePanel.java:158)
at GamePanel.run(GamePanel.java:92)
at java.lang.Thread.run(Thread.java:636)
Hat jemand ne Ahnung, woher das kommt? Hier meine Kollisionsmethode und deren Aufruf im GamePanel (da wird für abgegebene Schüsse gecheckt, ob sie mit einem Gegner kollidieren):
Java:
public boolean checkCollision(Sprite s) { //pixelgenaue Kollision
Rectangle2D.Double cut = (Double) this.createIntersection(s); //Schnittmenge der Sprites
if(cut.width<1 || cut.height<1)
return false; //Prüfung ob wirklich verwertbare Menge kollidiert
//Rechteck in Bezug auf die jeweiligen Images
Rectangle2D.Double sub_me = getSubRec(this,cut);
Rectangle2D.Double sub_him = getSubRec(s,cut);
//geschnittene Bestandteile der Sprites
BufferedImage img_me = pics[currentpic].getSubimage((int) sub_me.x, (int) sub_me.y, (int) sub_me.width, (int) sub_me.height);
BufferedImage img_him = pics[currentpic].getSubimage((int) sub_him.x, (int) sub_him.y, (int) sub_him.width, (int) sub_him.height);
for(int i=0;i<img_me.getWidth();i++) {
for (int j=0;j<img_him.getHeight();j++) {
int rgb1 = img_me.getRGB(i,j);
int rgb2 = img_him.getRGB(i,j);
if(!isOpaque(rgb1) && !isOpaque(rgb2))
return true; //wenn ein Pixel gefunden wurde, der auf beiden Teilbildern nicht transparent ist
}
}
return false;
}
Java:
for(Sprite token:shots) {
token.doLogic(delta);
for (Sprite sprite:enemies) {
if(sprite.checkCollision(token)) {
token.setRemove();
sprite.setRemove();
}
}
}