我正在为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开发人员已经想出如何通过触摸屏进行良好的控制,并可以给出一些建议。
答案 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米。
这些数字是虚构的,但希望证明需要将控制与运动分开,然后考虑时间因素。