libgdx [TiledMap Objects]

本文深入探讨了游戏开发过程中的关键技术和游戏引擎的应用,包括Unity、Unreal Engine等主流引擎的特点与使用方法。

坐标系问题:
libgdx 笛卡尔坐标系 原点坐标右下角
TiledMap 原点坐标左上角

package com.mygdx.game;

import com.badlogic.gdx.Application;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.maps.MapLayer;
import com.badlogic.gdx.maps.MapObject;
import com.badlogic.gdx.maps.MapObjects;
import com.badlogic.gdx.maps.MapProperties;
import com.badlogic.gdx.maps.objects.EllipseMapObject;
import com.badlogic.gdx.maps.objects.PolygonMapObject;
import com.badlogic.gdx.maps.objects.RectangleMapObject;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TiledMapRenderer;
import com.badlogic.gdx.maps.tiled.TiledMapTileLayer;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.objects.TiledMapTileMapObject;
import com.badlogic.gdx.maps.tiled.renderers.IsometricTiledMapRenderer;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;
import com.badlogic.gdx.maps.tiled.tiles.AnimatedTiledMapTile;
import com.badlogic.gdx.math.Ellipse;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Polygon;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.badlogic.gdx.utils.viewport.Viewport;

import org.w3c.dom.css.Rect;

public class MyGdxGame extends ApplicationAdapter {
    private static final float SCALE = 0.2963f;
    private static final int VIRTUAL_WIDTH = (int)(1920 * SCALE);
    private static final int VIRTUAL_HEIGHT = (int)(1080 * SCALE);

    private static final float CAMERA_SPEED = 100.0f;

    private OrthographicCamera camera;
    private Viewport viewport;
    private SpriteBatch batch;

    private TiledMap map;
    private TmxMapLoader loader;
    private OrthogonalTiledMapRenderer renderer;

    private Vector2 direction;

    private Array<Sprite> triggers;

    private Music song;

    @Override
    public void create() {
        camera = new OrthographicCamera();
        viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera);
        batch = new SpriteBatch();
        loader = new TmxMapLoader();
        map = loader.load("data/maps/tiled/tiles.tmx");
        renderer = new OrthogonalTiledMapRenderer(map, batch);
        direction = new Vector2();

        processMapMetadata();
    }

    @Override
    public void dispose() {
        map.dispose();
        renderer.dispose();
        batch.dispose();
        song.dispose();
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        updateCamera();

        renderer.setView(camera);
        renderer.render();

        batch.begin();

        for (Sprite trigger : triggers) {
            trigger.draw(batch);
        }

        batch.end();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
    }

    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.25f)) {
            direction.x = -20;
        }
        else if (Gdx.input.isKeyPressed(Input.Keys.RIGHT) || (Gdx.input.isTouched() && mouseX > width * 0.75f)) {
            direction.x = 20;
        }

        if (Gdx.input.isKeyPressed(Input.Keys.UP) || (Gdx.input.isTouched() && mouseY < height * 0.25f)) {
            direction.y = 20;
        }
        else if (Gdx.input.isKeyPressed(Input.Keys.DOWN) || (Gdx.input.isTouched() && mouseY > height * 0.75f)) {
            direction.y = -20;
        }

        //direction.nor().scl(CAMERA_SPEED).scl(Gdx.graphics.getDeltaTime());;

        camera.position.x += direction.x;
        camera.position.y += direction.y;

        TiledMapTileLayer layer = (TiledMapTileLayer)map.getLayers().get(0);

        float cameraMinX = viewport.getWorldWidth() * 0.5f;
        float cameraMinY = viewport.getWorldHeight() * 0.5f;
        float cameraMaxX = layer.getWidth() * layer.getTileWidth() - cameraMinX;
        float cameraMaxY = layer.getHeight() * layer.getTileHeight() - cameraMinY;

        camera.position.x = MathUtils.clamp(camera.position.x, cameraMinX, cameraMaxX);
        camera.position.y= MathUtils.clamp(camera.position.y, cameraMinY, cameraMaxY);

        camera.update();
    }

    private void processMapMetadata() {
        // Load music
        String songPath = map.getProperties().get("music", String.class);
        song = Gdx.audio.newMusic(Gdx.files.internal(songPath));
        song.setLooping(true);
        song.play();

        // Load entities
        System.out.println("Searching for game entities...\n");

        triggers = new Array<Sprite>();

        MapObjects objects = map.getLayers().get("objects").getObjects();

        for (MapObject object : objects) {
            String name = object.getName();
            String[] parts = name.split("[.]");
            TiledMapTileMapObject rectangleObject = (TiledMapTileMapObject)object;

            TextureRegion textureRegion = rectangleObject.getTextureRegion();
            System.out.println("Objectfound- textureRegion: " + textureRegion);

            MapProperties mapProperties = object.getProperties();
            int id = (Integer)mapProperties.get("gid");
            System.out.println("Objectfound- gid: " + id);
            Rectangle rectangle = new Rectangle();
            rectangle.setX(Float.parseFloat(mapProperties.get("x").toString()));
            float y = Float.parseFloat(mapProperties.get("y").toString());
            rectangle.setY(y);
            rectangle.setWidth(Float.parseFloat(mapProperties.get("width").toString()));
            float height= Float.parseFloat(mapProperties.get("height").toString());
            rectangle.setHeight(height);

            System.out.println("Objectfound- y: " + y+ " heght:"+height);

            System.out.println("Objectfound- name: " + name);

            if (parts.length > 0 && parts[0].equals("trigger")) {

                Sprite trigger = new Sprite(textureRegion);

                //trigger.setColor(1.0f, 1.0f, 1.0f, 0.5f);
                //trigger.setScale(rectangle.width, rectangle.height);
                trigger.setPosition(rectangle.x, rectangle.y + height);
                triggers.add(trigger);
            }
        }
    }
}

效果图:
这里写图片描述

tiles.tmx:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="45" height="10" tilewidth="32" tileheight="32">
 <properties>
  <property name="music" value="data/music/song_1.mp3"/>
 </properties>
 <tileset firstgid="1" name="tukuai1" tilewidth="32" tileheight="32" spacing="1" margin="1">
  <image source="tiles.png" width="512" height="256"/>
 </tileset>
 <layer name="块层 1" width="45" height="10">
  <data encoding="csv">
6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,
21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,
21,22,51,51,51,81,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,81,81,51,51,51,51,51,51,51,51,51,51,51,51,51,81,81,81,51,51,51,22,23,
21,22,51,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,51,22,23,
21,22,51,22,46,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,48,22,51,22,23,
21,22,51,22,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,22,51,22,23,
21,22,51,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,51,22,23,
21,22,51,51,51,81,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,81,81,51,51,51,51,51,51,51,51,51,51,51,51,51,81,81,81,51,51,51,22,23,
21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,
36,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,38
</data>
 </layer>
 <imagelayer name="图像图层 1" x="224" y="192">
  <image source="1.png"/>
 </imagelayer>
 <objectgroup name="objects">
  <object name="trigger.num1" gid="52" x="384" y="96" width="32" height="32"/>
  <object name="trigger.num2" gid="52" x="384" y="256" width="32" height="32"/>
  <object name="trigger.num3" gid="52" x="0" y="320" width="32" height="32"/>
  <object name="trigger.num4" gid="52" x="0" y="32" width="32" height="32"/>
  <object name="trigger.num5" gid="52" x="1408" y="32" width="32" height="32"/>
  <object name="trigger.num6" gid="52" x="1408" y="320" width="32" height="32"/>
 </objectgroup>
</map>

tiles.png:
这里写图片描述
1.png:
这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值