private void addTiledLayer(TiledLayer layer) { this.tiledLayers.add(layer); this.layers.put(layer.getName(), layer); layer.addPropertyChangeListener(this); Collections.sort(this.tiledLayers, new Layer.NameComparator()); int index = this.tiledLayers.indexOf(layer); this.fireTiledLayerAdded(layer, index); }
public final boolean collidesWith(TiledLayer layer) { if (layer == null) { throw new NullPointerException(); } // only check collision if visible if (!this.isVisible()) return false; // only check collision if both are visible if (!layer.isVisible() || !this.isVisible()) return false; return collidesWith(layer, 0, 0); }
public TiledLayer getBackground2() throws java.io.IOException { // GEN-BEGIN:|2-getter|0|2-preInit if (background2 == null) { // GEN-END:|2-getter|0|2-preInit // write pre-init user code here background2 = new TiledLayer(40, 20, getTileset(), 16, 16); // GEN-BEGIN:|2-getter|1|2-midInit int[][] tiles = { { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }; // GEN-END:|2-getter|1|2-midInit // write mid-init user code here for (int row = 0; row < 20; row++) { // GEN-BEGIN:|2-getter|2|2-postInit for (int col = 0; col < 40; col++) { background2.setCell(col, row, tiles[row][col]); } } } // GEN-END:|2-getter|2|2-postInit // write post-init user code here return background2; // GEN-BEGIN:|2-getter|3| }
public TiledLayer getRoad() throws java.io.IOException { // GEN-BEGIN:|3-getter|0|3-preInit if (road == null) { // GEN-END:|3-getter|0|3-preInit // write pre-init user code here road = new TiledLayer(40, 20, getTileset(), 16, 16); // GEN-BEGIN:|3-getter|1|3-midInit int[][] tiles = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9, 9, 9, 7, 7, 10, 7, 7, 6, 6, 7, 7, 7, 7, 7, 7, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 } }; // GEN-END:|3-getter|1|3-midInit // write mid-init user code here for (int row = 0; row < 20; row++) { // GEN-BEGIN:|3-getter|2|3-postInit for (int col = 0; col < 40; col++) { road.setCell(col, row, tiles[row][col]); } } } // GEN-END:|3-getter|2|3-postInit // write post-init user code here return road; // GEN-BEGIN:|3-getter|3| }
/** * Helper methods that check for collisions They are at the end of the file because of the length * of the code * * <p>For both methods, the second and third parameters are significant only if o is an Bitmap, * otherwise they are ignored */ private synchronized boolean collidesWith(Object o, int oX, int oY) { int tX = 0, tY = 0, tW = 0, tH = 0; int oW = 0, oH = 0; Sprite t = this; boolean another = true; while (another) { int sX, sY, sW, sH; int cX = t.collX; int cY = t.collY; int cW = t.collWidth; int cH = t.collHeight; // if there is a zero in a dimension // then it cannot intersect with anything! if (cW == 0 || cH == 0) { return false; } switch (t.transform) { case TRANS_NONE: sX = (int) (t.getX() + cX); sY = (int) (t.getY() + cY); sW = cW; sH = cH; break; case TRANS_MIRROR_ROT180: sX = (int) (t.getX() + cX); sY = (int) (t.getY() + (t.getHeight() - cY - 1) - cH); sW = cW; sH = cH; break; case TRANS_MIRROR: sX = (int) (t.getX() + (t.getWidth() - cX - 1) - cW); sY = (int) (t.getY() + cY); sW = cW; sH = cH; break; case TRANS_ROT180: sX = (int) (t.getX() + (t.getWidth() - cX - 1) - cW); sY = (int) (t.getY() + (t.getHeight() - cY - 1) - cH); sW = cW; sH = cH; break; case TRANS_MIRROR_ROT270: sX = (int) (t.getX() + cY); sY = (int) (t.getY() + cX); sW = cH; sH = cW; break; case TRANS_ROT90: sX = (int) (t.getX() + (t.getHeight() - cY - 1) - cH); sY = (int) (t.getY() + cX); sW = cH; sH = cW; break; case TRANS_MIRROR_ROT90: sX = (int) (t.getX() + (t.getHeight() - cY - 1) - cH); sY = (int) (t.getY() + (t.getWidth() - cX - 1) - cW); sW = cH; sH = cW; break; case TRANS_ROT270: sX = (int) (t.getX() + cY); sY = (int) (t.getY() + (t.getWidth() - cX - 1) - cW); sW = cH; sH = cW; break; default: // cant really happen, but the return keeps the // compiler happy (otherwise it'll report variable // may not be initialized) return false; } if (o != t) { tX = sX; tY = sY; tW = sW; tH = sH; if (o instanceof Sprite) { // two sprites first round // another = true; t = (Sprite) o; } else if (o instanceof TiledLayer) { another = false; TiledLayer layer = (TiledLayer) o; oX = (int) (layer.getX()); oY = (int) (layer.getY()); oW = (int) (layer.getWidth()); oH = (int) (layer.getHeight()); } else { // o instanceof lcdui.Bitmap another = false; TextureRegion img = (TextureRegion) o; oW = img.getRegionWidth(); oH = img.getRegionHeight(); } } else { another = false; // two sprites // second round oX = sX; oY = sY; oW = sW; oH = sH; } } // if there is no intersection // we know there is no collision if (tX > oX && tX >= oX + oW) return false; else if (tX < oX && tX + tW <= oX) return false; else if (tY > oY && tY >= oY + oH) return false; else if (tY < oY && tY + tH <= oY) return false; if (o instanceof TiledLayer) { // if o is a tiledLayer then // it is possible to have not a // collision if every intersection tile // has a zero value TiledLayer layer = (TiledLayer) o; // this is the intersection of the two rectangles int rX, rY, rW, rH; if (oX > tX) { rX = oX; rW = ((oX + oW < tX + tW) ? oX + oW : tX + tW) - rX; } else { rX = tX; rW = ((tX + tW < oX + oW) ? tX + tW : oX + oW) - rX; } if (oY > tY) { rY = oY; rH = ((oY + oH < tY + tH) ? oY + oH : tY + tH) - rY; } else { rY = tY; rH = ((tY + tH < oY + oH) ? tY + tH : oY + oH) - rY; } int lW = layer.getCellWidth(); int lH = layer.getCellHeight(); int minC = (rX - oX) / lW; int minR = (rY - oY) / lH; int maxC = (rX - oX + rW - 1) / lW; int maxR = (rY - oY + rH - 1) / lH; // travel across all cells in the collision // rectangle for (int row = minR; row <= maxR; row++) { for (int col = minC; col <= maxC; col++) { int cell = layer.getCell(col, row); // if cell is animated get current // associated static tile if (cell < 0) cell = layer.getAnimatedTile(cell); if (cell != 0) return true; } } // if no non zero cell was found // there is no collision return false; } else { // if the other object is an image or sprite // collision happened return true; } }