矩形内的 libgdx 动画 - 碰撞检测 - 矩形

2024-01-04

我正在编写一款类似于口袋妖怪风格的角色扮演游戏(自上而下的视图)。我现在正在研究碰撞检测的问题。我想创建基于矩形的碰撞检测。问题是我很难在之前设置的动画周围绘制矩形。我已经在 Google 和 YouTube 上搜索了如何处理这个问题的答案/教程,但一无所获。

玩家等级

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();
}

}

如果您想检测两个矩形之间的碰撞,可以使用我与精灵一起使用的示例。

public class TestSpriteOne extends Sprite{  
    private Rectangle rectangle;

添加在构造函数.

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

In update Method

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

Is a new nethod

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

其他类

public class TestSpriteTwo extends Sprite{
    private Rectangle rectangle;

In the 构造函数.

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

In update method

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

In new方法

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

// 在TestSpriteOne类中调用

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

//调用GameScreen类

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

如果这个矩形与另一个矩形重叠,则它重叠,因此 hasCollided 变量将变为 true。

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

rectangle.setSize (width, height);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

矩形内的 libgdx 动画 - 碰撞检测 - 矩形 的相关文章

随机推荐

  • 如何拖动旋转的 DragShadow?

    我用 ObjectAnimator 旋转了 TextView 如下所示 ObjectAnimator rotate ObjectAnimator ofFloat aRotatedTextView rotation 0f someAngle
  • 如何在Webfaction上部署Flask应用程序?

    有人知道如何在 Webfaction 上部署一个简单的 Flask 应用程序吗 我知道 Webfaction 支持 mod wsgi 并且我阅读了 Flask 网站上的指南 但我仍然无法使我的应用程序运行 有人有工作配置吗 UPDATE回答
  • SourceForge 的下载页面如何运作?

    在回答其他问题时 有人指出 SourceForge 的下载页面是通过添加隐藏的 来工作的 现在似乎不再是这样了 当前版本的下载页面是如何实现的 我想构建类似的东西 因为我认为 SF 的解决方案非常优雅 好吧 更准确地说 确实 最初的 问题
  • Jasmine js:添加测试执行的源方法

    我有一个简单的 hello world 项目 我想测试著名的 h lloWorld 函数 该项目的结构如下 package json spec helloWorldSpec js support jasmine json src hello
  • 确定 sklearn 中 SVM 分类器最有贡献的特征

    我有一个数据集 我想根据该数据训练我的模型 训练后 我需要了解对 SVM 分类器的分类有主要贡献的特征 森林算法有一种叫做特征重要性的东西 有类似的东西吗 是的 有属性coef 对于 SVM 分类器 但它仅适用于 SVM线性核 对于其他内核
  • 如何在后台线程上执行 WPF 过滤器?

    我在 WPF 中使用过滤器并且遵循建议的模式here http www japf fr 2009 02 very simple mvvm demo application 总而言之 这涉及在 ViewModel 上公开一个文本属性 该属性表
  • 使用 OsmBonusPack 解析和查看 geojson

    我想解析 geojson 并查看 osmbonuspack 和 osmdroid mapview 上的数据 我用了这个教程 https code google com p osmbonuspack wiki Tutorial 4 https
  • 使用 jQuery 验证 RECAPTCHA

    我正在尝试使用 jQuery 验证 Recaptcha 但我不断收到错误消息 访问受限 URI 被拒绝 代码 1012 这是我到目前为止所尝试过的 var challengeVal recaptcha challenge field att
  • 如何在 GitHub Actions 中区分不同事件类型的条件

    我们有一个工作流程文件 name Deploy Test Env on pull request types edited opened synchronize branches develop paths js jobs deploy y
  • AVSpeechSynthesizer 输出为文件?

    AVSpeechSynthesizer 有一个相当简单的 API 不支持保存到内置音频文件 我想知道是否有办法解决这个问题 也许在无声播放时记录输出 以便稍后播放 或者更有效的东西 这在 iOS 13 中终于成为可能AVSpeechSynt
  • 有没有命令可以向群组的所有成员发送私人消息?

    有没有办法让命令使用discord js向discord组的所有成员发送私人消息 示例 private TEST 此消息通过私人聊天而不是频道聊天发送给群组中的每个人 您可以迭代Guild members https discord js
  • Rails 迁移:t.references 具有替代名称?

    所以我有一个像这样的学校课程的 create table create table courses do t t string name t references course t timestamps end 但我想要它参考two其他课程
  • 最好是 Mavenize 项目 jar 文件还是将它们放在 WEB-INF/lib 中?

    我一直在为 Spring MVC 项目所需的所有 jar 文件执行此操作 call mvn install install file DgroupId vegetables DartifactId potatoes Dversion 1 0
  • 如果从文件读取,秒差距失败且没有错误

    我编写了一个小型秒差距解析器来从用户提供的输入字符串或输入文件中读取样本 如果输入以分号分隔的字符串形式提供 则它会在错误输入时正确失败 并显示有用的错误消息 gt readUncalC14String test1 7444 37 6800
  • 无法创建新项目并升级到React Native版本最新0.69.1

    我们无法使用 React Native 最新版本 0 69 1 创建新项目 我用旧版本创建了新项目 然后我升级到0 69 1 npx 反应本机升级 但我无法完全升级 当我跑步时npm i命令 错误来了 npm ERR ERESOLVE co
  • 从键码获取键名称(X11 XGrabKey)

    我在 Linux 中有一个全局按键事件处理程序 如下所示 我需要知道哪个键盘被抓住了 例如 如果按下 P 键 我会得到相应的键代码 有没有办法从这个未签名的密钥代码中获取密钥名称 P include
  • 如何从 firebug 获取 css 源文件路径?

    我需要修改我当前正在工作的网站的 CSS 中的几个类 另一个人在其中工作 所以我真的不知道他把样式放在哪里 我知道 firebug 在角落显示 css 路径 但它只是显示这样的 url http localseo org 3 行 http
  • 扩展上下文无效。 Chrome 扩展程序

    我在开发模式下使用 Chrome 扩展程序并转到 chrome extensions 页面 在这里 我按下 重新加载 按钮并尝试继续使用该扩展 但我看到了以下消息 扩展上下文无效 而且我必须手动重新加载页面 但我如何修复它并自动重新加载扩展
  • 使用 MEF 作为 IoC

    阅读了一些诸如此类的内容后 http mikehadlow blogspot com 2008 09 management extensibility framework why html http mikehadlow blogspot
  • 矩形内的 libgdx 动画 - 碰撞检测 - 矩形

    我正在编写一款类似于口袋妖怪风格的角色扮演游戏 自上而下的视图 我现在正在研究碰撞检测的问题 我想创建基于矩形的碰撞检测 问题是我很难在之前设置的动画周围绘制矩形 我已经在 Google 和 YouTube 上搜索了如何处理这个问题的答案