0

我正在尝试创建一个简单的 Android 游戏,一个 2D 动作射击游戏,屏幕上有 2 个控制杆(圆圈),左侧是运动控制,右侧是武器控制。方向由拇指相对于圆心的位置控制。

我一直在关注这个网站上的教程:http ://www.kilobolt.com/day-7-creating-an-android-game-from-start-to-finish.html但它只给了我基础从事于。我没有编程经验,所以我现在很迷茫。

我的移动只在 TOUCH_DOWN 事件上起作用,英雄移动到它应该移动的位置,但要改变方向,我必须抬起拇指并再次触摸圆圈。TOUCH_DRAGGED(或 ACTION_MOVE)坏了,因为如果我将手指拖过圆圈,角色移动得非常快。我想问题是正在处理太多的触摸事件,但我不知道如何解决它。

我怎样才能改变这一点,以便我可以在圆圈周围拖动我的拇指,英雄会立即改变它的方向,并始终保持它的速度不变?此外,无论您触摸的圆心有多近或多远,速度都应该相同。

private void updateRunning(List<TouchEvent> touchEvents, float deltaTime) {

    int len = touchEvents.size();

    for (int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);  
        if (event.type == TouchEvent.TOUCH_DOWN || event.type == TouchEvent.TOUCH_DRAGGED) {

            if (inBounds(event, 50, 300, 150, 150, 'c')) {
                ctrl.setX(event.x);
                ctrl.setY(event.y);
                ctrl.direction();
                hero.move(ctrl.getDirX(), ctrl.getDirY());
            }
        }

        if (event.type == TouchEvent.TOUCH_UP) {

            if (inBounds(event, 0, 0, 35, 35,'r')) {
                pause();
            }
            hero.stopMove();
        }   
    }

    hero.update();  

移动: hero 的 speedX 和 speedY 在每次 hero.update() 调用时被添加到 hero 的 centerX 和 centerY 中。

public void move(float x, float y) {

    speedX += x * MOVESPEED;
    speedY += y * MOVESPEED;

}

此方法处理 x 和 y 速度。在 stackoverflow 上找到它,并且因为 touch_down 事件运行正常,我想它正在做它的工作。虽然我觉得这不完全是它应该的样子。L_STICK_C 是一个常数,值为 100 和 350(圆心)。

public void direction() {

        dir.x = x - L_STICK_C.x;
        dir.y = y - L_STICK_C.y;
        double hyp = Math.sqrt(dir.x * dir.x + dir.y * dir.y);
        dir.x = (float) (dir.x / hyp);
        dir.y = (float) (dir.y / hyp);
}
4

1 回答 1

1

我建议您查看一些游戏编程教程。您通常不会直接从触摸输入移动角色。您将在游戏循环中设置一个游戏状态变量,该变量对应于拇指输入的位置。然后,您只需根据这些输入在每个游戏循环中更新一次英雄。这允许您将游戏输入控制代码和英雄代码分开,并使其可重用于游戏的其他部分。

编辑:

根据您的代码,每次拖动手指时,都会生成一堆拖动事件。所以你正在为每个事件增加你的角色速度。您可能应该只查看上次触摸事件中到中心的距离和输入的 x / y,而不是全部。

于 2013-02-18T21:36:00.763 回答