libgdx动画内部的矩形 – collison检测 – 矩形

我正在写一个类似于口袋妖怪风格的RPG游戏(自上而下的视图)。 我现在正在研究碰撞检测问题。 我想基于矩形创建碰撞检测。 问题是我在绘制我之前设置的动画周围的矩形时遇到了困难。 我在谷歌和YouTube上搜索了如何处理这个问题的答案/教程但却一无所获。

Player.class

public class Player { public Vector2 position; private float moveSpeed; private SpriteBatch batch; //animation public Animation an; private Texture tex; public TextureRegion currentFrame; private TextureRegion[][] frames; private float frameTime; public Player(Vector2 position){ this.position = position; moveSpeed = 5f; createPlayer(); } public void createPlayer(){ tex = new Texture("Sprites/image.png"); frames = TextureRegion.split(tex, tex.getWidth()/3, tex.getHeight()/4); an = new Animation(0.10f, frames[0]); } public void render(float delta){ handleInput(); frameTime += delta; currentFrame = an.getKeyFrame(frameTime, true); } public void handleInput(){ if(Gdx.input.isKeyPressed(Keys.UP)){ an = new Animation(0.10f, frames[3]); position.y += moveSpeed; } if(Gdx.input.isKeyPressed(Keys.DOWN)){ an = new Animation(0.10f, frames[0]); position.y -= moveSpeed; } if(Gdx.input.isKeyPressed(Keys.LEFT)){ an = new Animation(0.10f, frames[1]); position.x -= moveSpeed; } if(Gdx.input.isKeyPressed(Keys.RIGHT)){ an = new Animation(0.10f, frames[2]); position.x += moveSpeed; } if(!Gdx.input.isKeyPressed(Keys.ANY_KEY)){ an = new Animation(0.10f, frames[0]); } } public void dispose(){ batch.dispose(); } public float getX(){ return position.x; } public float getY(){ return position.y; } public int getWidth(){ return 32; } public int getHeight(){ return 32; } } 

WorldRenderer.class

 public class WorldRenderer { private OrthogonalTiledMapRenderer renderer; public OrthographicCamera camera; private Player player; //Tilemap private TiledMapTileLayer collision; private TiledMap map; public WorldRenderer() { map = new TmxMapLoader().load("maps/testMap.tmx"); renderer = new OrthogonalTiledMapRenderer(map); //Tiled layers collision = (TiledMapTileLayer) map.getLayers().get("collision"); player = new Player(new Vector2(100, 100)); camera = new OrthographicCamera(); camera.viewportWidth = Gdx.graphics.getWidth()/2; camera.viewportHeight = Gdx.graphics.getHeight()/2; } public void render (float delta) { camera.update(); renderer.setView(camera); renderer.render(); player.render(delta); // Calculate tile size in pixels MapProperties prop = renderer.getMap().getProperties(); int mapWidth = prop.get("width", Integer.class); //how many tiles in map int mapHeight = prop.get("height", Integer.class); int tilePixelWidth = prop.get("tilewidth", Integer.class); //size of each tile int tilePixelHeight = prop.get("tileheight", Integer.class); // Calculate total map size int worldSizeX = mapWidth * tilePixelWidth; int worldSizeY = mapHeight * tilePixelHeight; // Calculate min/max camera points inside the map float minCameraX = camera.zoom * (camera.viewportWidth / 2); float maxCameraX = worldSizeX - minCameraX; float minCameraY = camera.zoom * (camera.viewportHeight / 2); float maxCameraY = worldSizeY - minCameraY; // set the camera to either the player or the min/max of the camera based on player position camera.position.set( Math.min(maxCameraX, Math.max(player.position.x + 32 / 2, minCameraX)), Math.min(maxCameraY, Math.max(player.position.y + 32 / 2, minCameraY)), 0); camera.update(); renderer.getSpriteBatch().setProjectionMatrix(camera.combined); renderer.getSpriteBatch().begin(); renderer.getSpriteBatch().draw(player.currentFrame, player.position.x, player.position.y); renderer.getSpriteBatch().end(); } } 

如果你想检测两个矩形之间的碰撞,有一个我用sprite的例子。

 public class TestSpriteOne extends Sprite{ private Rectangle rectangle; 

添加构造函数

 rectangle = new Rectangle(getX(), getY(), getWidth(), getHeight()); 

更新方法中

 rectangle.setPosition(getX(), getY()); 

是一个新的方法

 public Rectangle getColliderActor(){ return this.rectangle; } 

其他课程

 public class TestSpriteTwo extends Sprite{ private Rectangle rectangle; 

构造函数中

 rectangle = new Rectangle(getX(), getY(), getWidth(), getHeight()); 

更新方法中

 rectangle.setPosition(getX(), getY()); 

新的方法

 public Rectangle getColliderActor(){ return this.rectangle; } 

//在TestSpriteOne类中调用

 boolean hasCollided = TestSpriteTwo.getColliderActor().overlaps(getColliderActor()); 

//在GameScreen类中调用

 boolean hasCollided = TestSpriteOne.getColliderActor().overlaps(TestSpriteTwo.getColliderActor()); 

它重叠是否该矩形与另一个矩形重叠,因此hasCollided变量将变为true。

编辑:如果动画更改其宽度或高度,您可以在更新方法中调整矩形的大小

 rectangle.setSize (width, height);