8

我正在为 Android 平台开发我的第一个视频游戏,作为一个晚上和周末的项目。

它进展顺利,但我对控制灵敏度非常不满意。

在这个游戏中,您在屏幕上左右移动一个对象。屏幕底部是一个“触摸板”,是你的手指应该休息的地方。

/-------------------------\
|                         |
|                         |
|                         |
|       Game Area         |
|                         |
|                         |
|                         |
|                         |
|                         |
/-------------------------\
|                         |
|       Touch Area        |
|                         |
\-------------------------/

我目前正在使用状态变量来保存“MOVING_LEFT,MOVING_RIGHT,NOT_MOVING”,并根据该变量更新每帧播放器对象的位置。

但是,我读取触摸屏输入并设置此状态变量的代码要么过于敏感,要么过于滞后,具体取决于我如何调整它:

public void doTouch (MotionEvent e) {
    int action = e.getAction();

    if (action == MotionEvent.ACTION_DOWN) {
        this.mTouchX = (int)e.getX();
        this.mTouchY = (int)e.getY();           
    } 
    else if (action == MotionEvent.ACTION_MOVE) {
        if ((int)e.getX() >= this.mTouchX) {
            this.mTouchX = (int)e.getX();
            this.mTouchY = (int)e.getY();   
            if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {              
                this.mTouchDirection = MOVING_RIGHT;
            }
        } 
        else if ((int)e.getX() <= this.mTouchX) {
            this.mTouchX = (int)e.getX();
            this.mTouchY = (int)e.getY();
            if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {              
                this.mTouchDirection = MOVING_LEFT;
            }
        }
        else {
            this.mTouchDirection = NOT_MOVING;
        }               
    } 
    else if (action == MotionEvent.ACTION_UP) {
        this.mTouchDirection = NOT_MOVING;
    }       
}

这个想法是,当有任何移动时,我会检查用户手指的先前位置,然后找出移动玩家的方向。

这不太好用,我想这里有一些 iPhone/Android 开发人员已经弄清楚如何通过触摸屏进行良好的控制,并可以提供一些建议。

4

2 回答 2

2

您可以在 Windows 上尝试类似于“拖动矩形”的操作。当您在某物上按住鼠标按钮时,您不会开始拖动操作,直到鼠标移出鼠标按下位置周围的一个小区域。原因是单击时很难将光标保持在同一像素上。

因此,第一次尝试可能(int)e.getX() >= this.mTouchX + DEAD_ZONE与另一种情况类似,其中DEAD_ZONE是一个小整数。

然而,这并不涉及在同一笔划中转身。您可以通过仅在右转后当前位置距最后一个位置的左侧至少DEAD_ZONE像素时左转来处理该问题,反之亦然。

于 2009-03-15T02:24:59.453 回答
2

一个明显的问题是,您没有考虑自上次触摸以来的时间。

我建议您将玩家触摸视为在 和 的模拟范围内所需运动的表达-x/+x-y/+y然后根据时间在其他地方执行实际运动。

例如

objectPos += objectPos + (joyPos * timeDelta * maxSpeed);

因此,如果您的对象的最大速度为 10ms-1 并且玩家的手指在控制板上的位置为 0.5,那么该对象将每秒移动 5 米。如果您的游戏以 10fps 的速度运行,那么每帧对象将移动 0.5 米。

这些数字是虚构的,但希望证明需要将控制与运动分开,然后及时考虑。

于 2009-03-15T02:39:57.217 回答