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

明らかな問題の1つは、最後のタッチからの時間をどこにも考慮していないことです。

-x/+xプレーヤーのタッチをとからのアナログ範囲での目的の動きの表現として扱い、-y/+y時間に基づいて他の場所で実際の動きを実行することをお勧めします。

例えば

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

したがって、オブジェクトの最大速度が10ms-1で、プレーヤーの指がコントロールパッド上で0.5の場合、オブジェクトは毎秒5メートル移動します。ゲームが10fpsで実行されている場合、各フレームでオブジェクトは0.5メートル移動します。

これらの数字は架空のものですが、うまくいけば、制御を動きから分離し、時間を考慮に入れる必要があることを示しています。

于 2009-03-15T02:39:57.217 に答える
2

Windows での「長方形のドラッグ」に似た方法を試すことができます。何かの上でマウス ボタンを押したままにすると、マウスがマウス ダウン位置の周囲の小さな領域の外に移動するまで、ドラッグ操作は開始されません。理由は、クリック中にカーソルを同じピクセルに保つのが非常に難しいからです。

したがって、最初の試行は(int)e.getX() >= this.mTouchX + DEAD_ZONE、他のケースでも同様である可能性があります。ここDEAD_ZONEで、 は小さな整数です。

ただし、これは同じストロークで方向転換することには対応していません。現在の位置が右に曲がった後の最後の位置の左に少なくともピクセルある場合にのみ左に曲がることで対処できDEAD_ZONEます。逆も同様です。

于 2009-03-15T02:24:59.453 に答える