public static void convertMap( World box2dWorld, TiledMap map, float PPM, float playfieldOffsetX, float playfieldOffsetY, int defaultID) { TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0); for (int y = 0; y <= layer.getHeight() - 1; y++) { for (int x = 0; x <= layer.getWidth() - 1; x++) { Cell cell = layer.getCell(x, y); if (cell != null) { PhysicsBodyFactory.addStaticTileBodyAndFixture( defaultID, box2dWorld, playfieldOffsetX + ((x + 1) * layer.getTileWidth() / PPM), playfieldOffsetY + ((y + 1) * layer.getTileHeight() / PPM), layer.getTileWidth() / PPM, layer.getTileHeight() / PPM, 0, 0); } } } }
public void LoadTilesWithoutBody(TiledMap tileMap, World world) { TiledMapTileLayer layer = (TiledMapTileLayer) tileMap.getLayers().get("Empty"); float tileSize = layer.getTileHeight(); for (int row = 0; row < layer.getHeight(); row++) { for (int col = 0; col < layer.getWidth(); col++) { Cell cell = layer.getCell(col, row); if (cell == null || cell.getTile() == null) continue; // create float x = col * tileSize / B2D.PPM; float y = row * tileSize / B2D.PPM; int tileType = cell.getTile().getId(); tileType--; if (tileType == 15) { GameStats.GameSpawnPosition = new Vector2(x, y); Cell c = new Cell(); layer.setCell(col, row, c); } if (tileType <= 14) { // e element normal int id = tileType; GameTileRenderer.tlz[col][row] = id; } } } }
private boolean isCellBlocked(float x, float y) { Vector2 newCoords = UtilityMethods.screenToMapCoordinate(new Vector2(x, y)); // System.out.println("Player: x" + sprite.getX() + " y " + sprite.getY()); // System.out.println("Tile: x" + newCoords.x + " y " + newCoords.y); // sprite.setPosition(newCoords.x, newCoords.y); Cell cell = collisionLayer.getCell( (int) (newCoords.x / collisionLayer.getTileWidth()), (int) (newCoords.y / collisionLayer.getTileHeight())); // System.out.println(cell); return cell != null && cell.getTile() != null && cell.getTile().getProperties().containsKey("blocked"); }
private void updateCamera() { direction.set(0.0f, 0.0f); int mouseX = Gdx.input.getX(); int mouseY = Gdx.input.getY(); int width = Gdx.graphics.getWidth(); int height = Gdx.graphics.getHeight(); if (Gdx.input.isKeyPressed(Input.Keys.LEFT) || (Gdx.input.isTouched() && mouseX < width * 0.75f)) { direction.x = -1; } else if (Gdx.input.isKeyPressed(Input.Keys.RIGHT) || (Gdx.input.isTouched() && mouseX > width * 0.75f)) { direction.x = 1; } if (Gdx.input.isKeyPressed(Input.Keys.UP) || (Gdx.input.isTouched() && mouseY < height * 0.75f)) { direction.y = 1; } else if (Gdx.input.isKeyPressed(Input.Keys.DOWN) || (Gdx.input.isTouched() && mouseY > height * 0.75f)) { direction.y = -1; } direction.nor().scl(CAMERA_SPEED * Gdx.graphics.getDeltaTime()); camera.position.x += direction.x; camera.position.y += direction.y; TiledMapTileLayer layer = (TiledMapTileLayer) tiledMap.getLayers().get(0); float cameraMinX = viewport.getWorldWidth() * 0.5f; float cameraMinY = viewport.getWorldHeight() * 0.5f; float cameraMaxX = layer.getWidth() * layer.getTileWidth() + (playerWidth - cameraMinX); float cameraMaxY = layer.getHeight() * layer.getTileHeight() - cameraMinY; camera.position.x = MathUtils.clamp(sprite.getX(), cameraMinX, cameraMaxX); camera.position.y = MathUtils.clamp(sprite.getY(), cameraMinY, cameraMaxY); camera.update(); }
private void generatePlatforms(String LayerName) { TiledMapTileLayer layer = (TiledMapTileLayer) tileMap.getLayers().get(LayerName); tileSize = layer.getTileHeight(); BodyDef bdef = new BodyDef(); FixtureDef fdef = new FixtureDef(); // iterate over tiles and build box2d objects and chaining them together for (int row = 0; row < layer.getHeight(); row++) { for (int col = 0; col < layer.getWidth(); col++) { Cell cell = layer.getCell(col, row); if (cell == null) continue; if (cell.getTile() == null) continue; bdef.type = BodyType.StaticBody; bdef.position.set((col + 0.5f) * tileSize / PPM, (row + 0.5f) * tileSize / PPM); ChainShape cs = new ChainShape(); Vector2[] v = new Vector2[3]; v[0] = new Vector2(-tileSize / 2 / PPM, -tileSize / 2 / PPM); v[1] = new Vector2(-tileSize / 2 / PPM, +tileSize / 2 / PPM); v[2] = new Vector2(+tileSize / 2 / PPM, +tileSize / 2 / PPM); cs.createChain(v); fdef.friction = 0; fdef.shape = cs; fdef.filter.categoryBits = B2DVars.BIT_BLOCKS; fdef.filter.maskBits = B2DVars.BIT_PLAYER; fdef.isSensor = false; world.createBody(bdef).createFixture(fdef); } } }
public void LoadTilesWithBody(TiledMap tileMap, World world) { TiledMapTileLayer layer = (TiledMapTileLayer) tileMap.getLayers().get("Body"); BodyDef def = new BodyDef(); FixtureDef fdef = new FixtureDef(); def.type = BodyType.StaticBody; FixtureDef sensorDef = new FixtureDef(); sensorDef.isSensor = true; int coinID = 0; int starID = 0; float tileSize = layer.getTileHeight(); GameTileRenderer.width = layer.getWidth(); GameTileRenderer.height = layer.getHeight(); GameTileRenderer.tlz = new int[GameTileRenderer.width][GameTileRenderer.height]; for (int[] row : GameTileRenderer.tlz) Arrays.fill(row, -1); for (int row = 0; row < layer.getHeight(); row++) { for (int col = 0; col < layer.getWidth(); col++) { Cell cell = layer.getCell(col, row); if (cell == null || cell.getTile() == null) continue; // create def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); float x = col * tileSize / B2D.PPM; float y = row * tileSize / B2D.PPM; int tileType = cell.getTile().getId(); tileType--; if (tileType <= 14) { // e element normal int id = tileType; GameTileRenderer.tlz[col][row] = id; ChainShape shape = new ChainShape(); Vector2[] v = new Vector2[5]; if (tileType < 14) { v[0] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[1] = new Vector2(-tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[2] = new Vector2(tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[3] = new Vector2(tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[4] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); } else { v[0] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[1] = new Vector2(-tileSize / 2 / B2D.PPM, 0 / B2D.PPM); v[2] = new Vector2(tileSize / 2 / B2D.PPM, 0 / B2D.PPM); v[3] = new Vector2(tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[4] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); } shape.createChain(v); fdef.friction = 0; fdef.shape = shape; if (tileType < 14) world.createBody(def).createFixture(fdef).setUserData("tile"); else world.createBody(def).createFixture(fdef).setUserData("die"); } if (tileType == 16) { // coin Cell c = new Cell(); layer.setCell(col, row, c); if (GameStats.AddTheCoin(coinID)) { GameWorld.cr.coins.add(new Vector2(x, y)); def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); ChainShape shape = new ChainShape(); Vector2[] v = new Vector2[5]; v[0] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[1] = new Vector2(-tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[2] = new Vector2(tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[3] = new Vector2(tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[4] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); shape.createChain(v); sensorDef.shape = shape; TileData tmp = new TileData(coinID, "coin"); coinID++; world.createBody(def).createFixture(sensorDef).setUserData(tmp); } else { GameWorld.cr.coins.add(null); coinID++; } } if (tileType == 17) { Cell c = new Cell(); layer.setCell(col, row, c); GameWorld.cr.stars.add(new Vector2(x, y)); def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); ChainShape shape = new ChainShape(); Vector2[] v = new Vector2[5]; v[0] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[1] = new Vector2(-tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[2] = new Vector2(tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[3] = new Vector2(tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[4] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); shape.createChain(v); sensorDef.shape = shape; TileData tmp = new TileData(starID, "star"); starID++; world.createBody(def).createFixture(sensorDef).setUserData(tmp); } if (tileType == 18) { Cell c = new Cell(); layer.setCell(col, row, c); GameMap.flagposition = new Vector2(x, y); def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); ChainShape shape = new ChainShape(); Vector2[] v = new Vector2[5]; v[0] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[1] = new Vector2(-tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[2] = new Vector2(tileSize / 2 / B2D.PPM, tileSize / 2 / B2D.PPM); v[3] = new Vector2(tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); v[4] = new Vector2(-tileSize / 2 / B2D.PPM, -tileSize / 2 / B2D.PPM); shape.createChain(v); sensorDef.shape = shape; world.createBody(def).createFixture(sensorDef).setUserData("finish"); } // tiles.add(new Vector2(x, y)); } } }
public void LoadGameTiles(TiledMap tileMap, World world) { TiledMapTileLayer layer = (TiledMapTileLayer) tileMap.getLayers().get("Tiles"); BodyDef def = new BodyDef(); FixtureDef fdef = new FixtureDef(); def.type = BodyType.StaticBody; FixtureDef sensorDef = new FixtureDef(); sensorDef.isSensor = true; int coinID = 0; int starID = 0; float tileSize = layer.getTileHeight(); GameTileRenderer.width = layer.getWidth(); GameTileRenderer.height = layer.getHeight(); GameTileRenderer.tlz = new int[GameTileRenderer.width][GameTileRenderer.height]; for (int[] row : GameTileRenderer.tlz) Arrays.fill(row, -1); for (int row = 0; row < layer.getHeight(); row++) { for (int col = 0; col < layer.getWidth(); col++) { Cell cell = layer.getCell(col, row); if (cell == null || cell.getTile() == null) continue; // create def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); float x = col * tileSize / B2D.PPM; float y = row * tileSize / B2D.PPM; int tileType = cell.getTile().getId(); tileType--; if (tileType == 11) { GameStats.GameSpawnPosition = new Vector2(x, y); Cell c = new Cell(); layer.setCell(col, row, c); } if (tileType == 12) { Cell c = new Cell(); layer.setCell(col, row, c); GameMap.flagposition = new Vector2(x, y); def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); sensorDef.shape = createShape(tileSize); world.createBody(def).createFixture(sensorDef).setUserData("finish"); } if (tileType == 8) { // e spike int id = tileType; GameTileRenderer.tlz[col][row] = id; fdef.friction = 0; fdef.shape = createSpikeShape(tileSize); world.createBody(def).createFixture(fdef).setUserData("die"); } if (tileType == 0 || tileType == 4) { // e element normal int id = tileType; GameTileRenderer.tlz[col][row] = id; fdef.friction = 0; fdef.shape = createShape(tileSize); world.createBody(def).createFixture(fdef).setUserData("tile"); } if ((tileType >= 1 && tileType <= 3) || (tileType >= 5 && tileType <= 7)) { // e bara int id = tileType; GameTileRenderer.tlz[col][row] = id; fdef.friction = 0; fdef.shape = createShape(tileSize); world.createBody(def).createFixture(fdef).setUserData("rail"); } if (tileType == 10) { // coin Cell c = new Cell(); layer.setCell(col, row, c); if (GameStats.AddTheCoin(coinID)) { GameWorld.cr.coins.add(new Vector2(x, y)); def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); sensorDef.shape = createShape(tileSize); TileData tmp = new TileData(coinID, "coin"); coinID++; world.createBody(def).createFixture(sensorDef).setUserData(tmp); } else { GameWorld.cr.coins.add(null); coinID++; } } if (tileType == 9) { // coin Cell c = new Cell(); layer.setCell(col, row, c); GameWorld.cr.stars.add(new Vector2(x, y)); def.position.set((col + 0.5f) * tileSize / B2D.PPM, (row + 0.5f) * tileSize / B2D.PPM); sensorDef.shape = createShape(tileSize); TileData tmp = new TileData(starID, "star"); starID++; world.createBody(def).createFixture(sensorDef).setUserData(tmp); } } } }
@Override public void renderTileLayer(TiledMapTileLayer layer) { final float color = Color.toFloatBits(1, 1, 1, layer.getOpacity()); final int layerWidth = layer.getWidth(); final int layerHeight = layer.getHeight(); final float layerTileWidth = layer.getTileWidth() * unitScale; final float layerTileHeight = layer.getTileHeight() * unitScale; final float layerTileWidth25 = layerTileWidth * 0.25f; final float layerTileWidth50 = layerTileWidth * 0.50f; final float layerTileWidth75 = layerTileWidth * 0.75f; final float layerTileHeight50 = layerTileHeight * 0.50f; final float layerTileHeight150 = layerTileHeight * 1.50f; final int col1 = Math.max(0, (int) (((viewBounds.x - layerTileWidth25) / layerTileWidth75))); final int col2 = Math.min( layerWidth, (int) ((viewBounds.x + viewBounds.width + layerTileWidth75) / layerTileWidth75)); final int row1 = Math.max(0, (int) ((viewBounds.y / layerTileHeight150))); final int row2 = Math.min( layerHeight, (int) ((viewBounds.y + viewBounds.height + layerTileHeight150) / layerTileHeight)); final float[] vertices = this.vertices; for (int row = row1; row < row2; row++) { for (int col = col1; col < col2; col++) { float x = layerTileWidth75 * col; float y = (col % 2 == (yDown ? 0 : 1) ? 0 : layerTileHeight50) + (layerTileHeight * row); final TiledMapTileLayer.Cell cell = layer.getCell(col, row); if (cell == null) { x += layerTileWidth; continue; } final TiledMapTile tile = cell.getTile(); if (tile != null) { if (tile instanceof AnimatedTiledMapTile) continue; final boolean flipX = cell.getFlipHorizontally(); final boolean flipY = cell.getFlipVertically(); final int rotations = cell.getRotation(); TextureRegion region = tile.getTextureRegion(); float x1 = x; float y1 = y; float x2 = x1 + region.getRegionWidth() * unitScale; float y2 = y1 + region.getRegionHeight() * unitScale; float u1 = region.getU(); float v1 = region.getV2(); float u2 = region.getU2(); float v2 = region.getV(); vertices[X1] = x1; vertices[Y1] = y1; vertices[C1] = color; vertices[U1] = u1; vertices[V1] = v1; vertices[X2] = x1; vertices[Y2] = y2; vertices[C2] = color; vertices[U2] = u1; vertices[V2] = v2; vertices[X3] = x2; vertices[Y3] = y2; vertices[C3] = color; vertices[U3] = u2; vertices[V3] = v2; vertices[X4] = x2; vertices[Y4] = y1; vertices[C4] = color; vertices[U4] = u2; vertices[V4] = v1; if (flipX) { float temp = vertices[U1]; vertices[U1] = vertices[U3]; vertices[U3] = temp; temp = vertices[U2]; vertices[U2] = vertices[U4]; vertices[U4] = temp; } if (flipY) { float temp = vertices[V1]; vertices[V1] = vertices[V3]; vertices[V3] = temp; temp = vertices[V2]; vertices[V2] = vertices[V4]; vertices[V4] = temp; } if (rotations == 2) { float tempU = vertices[U1]; vertices[U1] = vertices[U3]; vertices[U3] = tempU; tempU = vertices[U2]; vertices[U2] = vertices[U4]; vertices[U4] = tempU; float tempV = vertices[V1]; vertices[V1] = vertices[V3]; vertices[V3] = tempV; tempV = vertices[V2]; vertices[V2] = vertices[V4]; vertices[V4] = tempV; break; } spriteBatch.draw(region.getTexture(), vertices, 0, 20); } } } }
@Override public void renderTileLayer(TiledMapTileLayer layer) { final Color batchColor = batch.getColor(); final float color = Color.toFloatBits( batchColor.r, batchColor.g, batchColor.b, batchColor.a * layer.getOpacity()); final int layerWidth = layer.getWidth(); final int layerHeight = layer.getHeight(); final float layerTileWidth = layer.getTileWidth() * unitScale; final float layerTileHeight = layer.getTileHeight() * unitScale; final float layerTileWidth50 = layerTileWidth * 0.50f; final float layerTileHeight50 = layerTileHeight * 0.50f; final int minX = Math.max(0, (int) (((viewBounds.x - layerTileWidth50) / layerTileWidth))); final int maxX = Math.min( layerWidth, (int) ((viewBounds.x + viewBounds.width + layerTileWidth + layerTileWidth50) / layerTileWidth)); final int minY = Math.max(0, (int) (((viewBounds.y - layerTileHeight) / layerTileHeight))); final int maxY = Math.min( layerHeight, (int) ((viewBounds.y + viewBounds.height + layerTileHeight) / layerTileHeight50)); for (int y = maxY - 1; y >= minY; y--) { float offsetX = (y % 2 == 1) ? layerTileWidth50 : 0; for (int x = maxX - 1; x >= minX; x--) { final TiledMapTileLayer.Cell cell = layer.getCell(x, y); if (cell == null) continue; final TiledMapTile tile = cell.getTile(); if (tile != null) { final boolean flipX = cell.getFlipHorizontally(); final boolean flipY = cell.getFlipVertically(); final int rotations = cell.getRotation(); TextureRegion region = tile.getTextureRegion(); float x1 = x * layerTileWidth - offsetX + tile.getOffsetX() * unitScale; float y1 = y * layerTileHeight50 + tile.getOffsetY() * unitScale; float x2 = x1 + region.getRegionWidth() * unitScale; float y2 = y1 + region.getRegionHeight() * unitScale; float u1 = region.getU(); float v1 = region.getV2(); float u2 = region.getU2(); float v2 = region.getV(); vertices[X1] = x1; vertices[Y1] = y1; vertices[C1] = color; vertices[U1] = u1; vertices[V1] = v1; vertices[X2] = x1; vertices[Y2] = y2; vertices[C2] = color; vertices[U2] = u1; vertices[V2] = v2; vertices[X3] = x2; vertices[Y3] = y2; vertices[C3] = color; vertices[U3] = u2; vertices[V3] = v2; vertices[X4] = x2; vertices[Y4] = y1; vertices[C4] = color; vertices[U4] = u2; vertices[V4] = v1; if (flipX) { float temp = vertices[U1]; vertices[U1] = vertices[U3]; vertices[U3] = temp; temp = vertices[U2]; vertices[U2] = vertices[U4]; vertices[U4] = temp; } if (flipY) { float temp = vertices[V1]; vertices[V1] = vertices[V3]; vertices[V3] = temp; temp = vertices[V2]; vertices[V2] = vertices[V4]; vertices[V4] = temp; } if (rotations != 0) { switch (rotations) { case Cell.ROTATE_90: { float tempV = vertices[V1]; vertices[V1] = vertices[V2]; vertices[V2] = vertices[V3]; vertices[V3] = vertices[V4]; vertices[V4] = tempV; float tempU = vertices[U1]; vertices[U1] = vertices[U2]; vertices[U2] = vertices[U3]; vertices[U3] = vertices[U4]; vertices[U4] = tempU; break; } case Cell.ROTATE_180: { float tempU = vertices[U1]; vertices[U1] = vertices[U3]; vertices[U3] = tempU; tempU = vertices[U2]; vertices[U2] = vertices[U4]; vertices[U4] = tempU; float tempV = vertices[V1]; vertices[V1] = vertices[V3]; vertices[V3] = tempV; tempV = vertices[V2]; vertices[V2] = vertices[V4]; vertices[V4] = tempV; break; } case Cell.ROTATE_270: { float tempV = vertices[V1]; vertices[V1] = vertices[V4]; vertices[V4] = vertices[V3]; vertices[V3] = vertices[V2]; vertices[V2] = tempV; float tempU = vertices[U1]; vertices[U1] = vertices[U4]; vertices[U4] = vertices[U3]; vertices[U3] = vertices[U2]; vertices[U2] = tempU; break; } } } batch.draw(region.getTexture(), vertices, 0, 20); } } } }