【问题标题】:Java: Breakout game, move player as I swipe?Java:突围游戏,在我滑动时移动玩家?
【发布时间】:2013-01-31 00:10:01
【问题描述】:

我正在制作一个简单的 Breakout 游戏,到目前为止,我已经创建了球和球员。我让球移动到你触摸的位置,但我宁愿让它朝着我滑动的方向移动。如,玩家随着我的手指移动。这是我在 MainActivity 中的代码:

package com.example.breakout;

import android.os.Bundle;
import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class MainActivity extends Activity implements OnTouchListener, OnGestureListener{

    BreakoutView bv;
    GestureDetector gs;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bv = new BreakoutView(this);
        setContentView(bv);
        bv.setOnTouchListener(this);


        gs = new GestureDetector(MainActivity.this, this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);

        return true;
    }

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        /*if(arg1.getY()<600){
            bv.p1.x = arg1.getX();
            bv.p1.y = 600;
        }*/
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent me){
        return gs.onTouchEvent(me);
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        /*if(e2.getX()>e1.getX()){
            //Move right
            bv.p1.x = e2.getX();

        }*/

        return false;
    }

    @Override
    public void onLongPress(MotionEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
            float arg3) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onShowPress(MotionEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSingleTapUp(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
    }

}

所以,我尝试过的两种方法是 onTouch 和 onFling 。 onTouch 将我的玩家“传送”到我触摸的地方,这不是我想要的。 onFling 仅在我完成滑动时移动我的播放器,所以这也不起作用。我的问题是,我怎样才能让它在我滑动手指时移动?我使用 onDown 吗?任何帮助表示赞赏。

谢谢!

【问题讨论】:

  • 游戏入门项目的不错选择。 :-) 我发现“传送”桨的问题是它可能最终“进入”球“内部”并混淆碰撞检测。否则,快速挥动我的手指并查看输入落后于游戏多远有点有趣,所以我不理会它。如果您想比较,请点击此处的代码 + APK:code.google.com/p/android-breakout

标签: java android onfling breakout


【解决方案1】:

假设您设置了某种游戏循环,其中 UI 会定期更新:

/**
 * Onclick event for Touch Screen
 */
@Override
public boolean onTouchEvent(MotionEvent input) {
    if (input.getAction() == MotionEvent.ACTION_MOVE) {
        float currX = input.getX();
        float currY = input.getY();

        if (!swiping) {
            swiping = true;
            swipeStartY = currY;
            swipeStartX = currX;
        }

        if (swiping) {          
            double newDirection = Math.atan2((currY-ball.getY()),currX-ball.getX());
            ball.setDirection(newDirection);
        }

    } else if (input.getAction() == MotionEvent.ACTION_UP) {
        if (swiping) {
            swiping = false;
        }
    }
}

这样,球的方向会在游戏线程的每个滴答声中更新并移向您的手指(触摸事件 X/Y 位置)。我不确定您是如何设置绘图/物理/等的。所以我不能在这里提供有意义的函数调用。如果您需要修改它,使其在您抬起手指后沿直线滑动,然后存储初始 X/Y 点(在本例中为 swipeStartX/swipeStartY)并仅在您停止 后设置新方向刷卡。

编辑:

我应该提一下,包含此代码的类定义如下:

public class GameView extends SurfaceView implements SurfaceHolder.Callback {
  ....
}

【讨论】:

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