【问题标题】:Using TouchScreens for game control使用触摸屏进行游戏控制
【发布时间】:2010-10-13 10:11:19
【问题描述】:

我正在开发我的第一个 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 开发人员已经弄清楚如何通过触摸屏进行良好的控制,并可以提供一些建议。

【问题讨论】:

  • 你能定义“效果不好”和“太迟钝或太敏感”吗?对其行为方式的描述将很有用
  • 两个敏感意味着我将手指移动了十分之一英寸并且播放器在屏幕上..太滞后意味着我必须在整个屏幕上移动手指才能移动播放器一英寸. :)

标签: iphone android user-interface touchscreen


【解决方案1】:

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

所以第一次尝试可能是(int)e.getX() &gt;= this.mTouchX + DEAD_ZONE,其他情况类似,DEAD_ZONE 是一个小整数。

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

【讨论】:

    【解决方案2】:

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

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

    例如

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      相关资源
      最近更新 更多