使用TouchScreens进行游戏控制

时间:2009-03-15 02:05:14

标签: iphone android user-interface touchscreen

我正在为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开发人员已经想出如何通过触摸屏进行良好的控制,并可以给出一些建议。

2 个答案:

答案 0 :(得分:2)

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

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

然而,这并不涉及在同一行程中转身。只有在当前位置在向右转弯后最后一个位置左侧至少DEAD_ZONE像素时向左转,才可以处理,反之亦然。

答案 1 :(得分:2)

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

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

E.g。

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

因此,如果物体的最大速度为10ms-1且玩家手指在控制板上为0.5,那么物体将每秒移动5米。如果你的游戏以10fps的速度运行,那么每个帧都会移动0.5米。

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