当前位置: 首页 > 面试题库 >

从libgdx中的集合检测触摸的对象(移动)的最佳方法

施阎宝
2023-03-14
问题内容

这是我在游戏开发中的首次尝试。我刚刚开始尝试libgdx,并了解了游戏编程的不同方面。我查看了示例项目,我可以了解libgdx游戏的整体架构。但是为了掌握游戏动力学的基础知识,我开始玩一些低级的东西,例如如何绘制简单的形状,如何移动它们,如何处理类似的碰撞。

所以我打算写一个死人的简单android游戏(肯定不是一个游戏)。这是主意

1. Create random shapes and make it fly (move)
2. When user touches the shape, it ll explode or hide or play simple animation
3. Has to show Hit & Miss count

最初,我想到要尝试libgdx舞台和演员概念,但排除了不使用场景API的情况。我从此开始尝试基本游戏的各个方面,并更好地了解libgdx背后的概念。所以我做了这个简单的应用程序,我能够使对象随机掉落。

public class A1GameScreen implements Screen {

    OrthographicCamera camera;
    ShapeRenderer debugRenderer = new ShapeRenderer();
    Array<Rectangle> boxes;   
    long lastFlew;
    int fliesCaught;

    A1GameScreen(){

         camera = new OrthographicCamera();
         camera.setToOrtho(false, 800, 480);       
         boxes=new Array<Rectangle>();
         throwboxes();
    }
@Override
public void render(float delta) {

    Gdx.gl.glClearColor(0, 0, 0.2f, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);


          camera.update();


    debugRenderer.setProjectionMatrix(camera.combined);
    debugRenderer.begin(ShapeType.Line);

    for (Rectangle fly : boxes) {
        debugRenderer.rect(fly.x, fly.y, fly.width, fly.height);
    }
    debugRenderer.end();

    //Handle the user input

    if (Gdx.input.isTouched()){          
        hit(Gdx.input.getX(),Gdx.input.getY());
    }

    if (TimeUtils.nanoTime() - lastFlew > 1000000000)
        throwboxes();


    Iterator<Rectangle> iter = boxes.iterator();
    while (iter.hasNext()) {
        Rectangle fly = iter.next();        
        fly.x -= 2;
        if (fly.x + 32 < 0)
            iter.remove();

    }

}

//Method to create flies at random interval
private void throwBoxes(){

    Rectangle fly = new Rectangle();
    fly.y = MathUtils.random(0, 480 - 32);
    fly.x = 800;
    fly.width = 32;
    fly.height = 32;
    boxes.add(fly);

    lastFlew = TimeUtils.nanoTime();

}

private boolean hit (float x, float y) {
    boolean found=false;

    for (Rectangle fly : boxes) {
        found = fly.contains(x,y);
        if (found){
            found = true;
            fly.width=100;
            break;
        }


    }

    return found;

}

}

但是我无法从掉落的物体中找到被触摸的物品。这就是我要找出包装盒是否在接触范围内的方法

  1. 遍历数组中的所有框
  2. 检查触摸坐标是否在方框坐标内
  3. 我通过触摸坐标到 contains所述的方法Rectangle(框)弄清楚,

像这样的东西

  for (Rectangle fly : boxes) {
        found = fly.contains(x,y);
        if (found){
            found = true;
            fly.width=100;
            break;
        }


    }

但是它不起作用。我想我知道了问题。它的

  1. 框每帧在x轴上移动2px,以产生飞行效果
  2. 但我想,自触摸事件以来已经过了一些帧。那就是为什么我没有得到预期的结果

我的问题是

  1. 如何解决这个问题?
  2. 在libgdx中检测冲突的最佳方法是什么?

更新资料

我发现触摸坐标和框坐标之间存在很多不匹配。触摸范围内没有框。那怎么可能。在样本迹线下方

Touch coords: x-651.0 y-362.0

Fly coords: x-384.0 y-277.0
Fly coords: x-504.0 y-34.0
Fly coords: x-624.0 y-103.0
Fly coords: x-744.0 y-238.0



Touch coords: x-441.0 y-193.0

Fly coords: x-52.0 y-34.0
Fly coords: x-172.0 y-103.0
Fly coords: x-292.0 y-238.0
Fly coords: x-414.0 y-261.0
Fly coords: x-534.0 y-109.0
Fly coords: x-656.0 y-283.0
Fly coords: x-776.0 y-323.0


Touch coords: x-568.0 y-162.0

Fly coords: x-42.0 y-267.0
Fly coords: x-162.0 y-166.0
Fly coords: x-282.0 y-266.0
Fly coords: x-404.0 y-52.0
Fly coords: x-526.0 y-296.0
Fly coords: x-646.0 y-64.0
Fly coords: x-766.0 y-16.0

问题答案:
public static boolean pointInRectangle (Rectangle r, float x, float y) {
    return r.x <= x && r.x + r.width >= x && r.y <= y && r.y + r.height >= y;
}

在您的更新中-

if(pointInRectangle(flyRectangle, Gdx.input.getX(), Gdx.input.getY())){
  // Do whatever you want to do with the rectangle. maybe register them for effect
}

您也可以查看Intersector类。

现在要进行碰撞,如果您的游戏节奏快,并且有很多敌人可以与玩家碰撞,那么您迟早会使用box2d类型库,因为如果移动速度很高,您可能不会得到任何碰撞回调。事情可能会相互贯穿。您可以使用速度和deltaTime尝试在碰撞发生之前进行预测,但是仍然远远不够,最终将需要重新设计轮子。

Mario的SuperJumper是启动libGDX的绝佳演示。试试吧。

编辑:

有一个实例成员-

Vector3 touchPoint;

在创建时

touchPoint = new Vector3();

更新时

camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));

if (Gdx.input.justTouched()) {
    if (pointInRectangle(rectangle, touchPoint.x, touchPoint.y)) {
    }
}

请注意libGDX中的坐标系。为了进行测试,请在屏幕上创建一个矩形。单击时,打印/调试矩形和touchPoint的坐标。



 类似资料:
  • 这是我第一次尝试游戏开发。我刚开始尝试libgdx,了解游戏编程的不同方面。我看了示例项目,我可以理解libgdx游戏的整体架构。但是为了掌握游戏动力学的基础知识,我开始玩一些低级的东西,比如如何画简单的形状,如何移动它们,如何处理这样的碰撞。 所以我计划写一个死的简单Android游戏(它甚至不是一个游戏肯定)。这就是我们的想法 最初我想去试试libgdx stage } 但是我无法从坠落的物体

  • 我刚刚开始尝试libgdx并理解...我查看了示例项目...我的问题 : 原始球编号1和6。其他球,球的(1和6)将随机去其他地方。(速度1)。例如,如果一个i是任何球上的火炬,它的速度最高可达3…游戏对象应该在while循环中。球图像有时(随机),球应该返回自己的360度。并在TecureRegion上获取图片。有类似的例子吗?或者我该怎么做? (抱歉英语不好) 谢谢。。。

  • 我有一架飞机。我使用来限定这架飞机,以检测碰撞,效果很好。当飞机开始降落时,我旋转飞机的纹理,但矩形保持不变。我不知道如何旋转它。我需要用飞机的纹理旋转它,因为我的外壳不会碰撞飞机的尾部和驾驶室。 如何旋转矩形或创建多边形形状来包裹所有飞机?任何帮助都将不胜感激!

  • 所以我有一个角色,我做了一个矩形来遮盖他的身体,以便与敌人交叉,这样当他与敌人相交时,他会受伤。我遇到的问题是,他有一把剑,剑在他身后以一个角度,因为他随身携带它,当玩家攻击时,动画被播放,剑摆动,越过他的头,落在他面前。我有一个多边形,在空闲/运行位置勾勒出剑的轮廓,但我不知道是否值得尝试在攻击动画的每一帧中手动移动多边形,然后检查动画每一帧的重叠ConvexPolygons,看看剑是否击中了敌

  • 问题内容: 我已经编写了一个可在台式机和移动设备上使用的jQuery插件。我想知道JavaScript是否可以检测设备是否具有触摸屏功能。我正在使用jquery- mobile.js来检测触摸屏事件,它可以在iOS,Android等系统上运行,但我也想根据用户设备是否具有触摸屏来编写条件语句。 那可能吗? 问题答案: 更新: 在将整个功能检测库引入项目之前,请阅读下面的blmstr答案。检测实际的

  • 问题内容: 我有一个自定义类,它是一个SKNode,而其中又包含几个SKSpriteNodes。有什么方法可以从我的游戏场景中检测到这些子SKSpriteNode上的触摸? 我工作很快 问题答案: 资料来源:http : //www.raywenderlich.com/84434/sprite-kit-swift-tutorial- beginners