【问题标题】:OnTouch not working in Player classOnTouch 在 Player 类中不起作用
【发布时间】:2018-01-23 14:52:17
【问题描述】:

我正在创建一个游戏,并且想读取角色类中角色的玩家输入。我不知道这是否是游戏开发的好习惯,但这似乎是合乎逻辑的事情。

我的 Player 类中有以下代码(包括相关代码),但我怀疑它不能正常工作,因为它不是主要视图类或其他什么?感谢所有帮助。 播放器

public class Player implements View.OnTouchListener{

    private static Player instance = null;

    int x, y;
    boolean moveRight = false;
    Bitmap sprite;

    public Player (Context context){

        sprite = BitmapFactory.decodeResource(context.getResources(), R.drawable.test_sprite);
        x = 300;
        y = 0;
    }

    public void Update(){
        if (moveRight){
            x += 3;
        } else {
            x -= 3;
        }
    }

    public static Player getInstance(Context context) {
        if (instance == null){
            instance = new Player(context);
        }
        return instance;
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        float x = motionEvent.getX(), y = motionEvent.getY();
        switch (motionEvent.getAction() & motionEvent.getActionMasked()){
            case MotionEvent.ACTION_DOWN:
                moveRight = true;
                break;
            case MotionEvent.ACTION_UP:
                moveRight = false;
                break;
        }
        return true;
    }
}

游戏视图

public class GameView extends SurfaceView implements Runnable {

    private boolean running = true;

    SurfaceHolder surfaceHolder = getHolder();

    SimpleTurret simpleTurret;
    Player player;

    private Thread thread = new Thread(this);

    public GameView (Context context){
        super(context);

        simpleTurret = SimpleTurret.getInstance(context);
        player = Player.getInstance(context);

        thread.start();
    }

    @Override
    public void run() {
        while (running){
            DrawCanvas();
            Control();
        }
    }

    public void DrawCanvas(){
        Canvas canvas = surfaceHolder.lockCanvas();
        if (surfaceHolder.getSurface().isValid()){
            canvas.drawColor(Color.RED);
            canvas.drawBitmap(simpleTurret.getSprite(), simpleTurret.getX(), simpleTurret.getY(), null);
            canvas.drawBitmap(player.getSprite(), player.getX(), player.getY(), null);
            surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }

    public void Control(){
        try{
            thread.sleep(17);
        } catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 你是对的。它不起作用的原因是因为您的Player 类不是视图
  • 那么,将需要触摸的类作为 View 类的子类是游戏开发的标准做法吗?
  • 不一定,但View.onTouchListener 只能在视图上实现。播放器类的目的是什么?只是实现View.onTouchListener 只提供了一个函数但是你需要将监听器绑定到一个View
  • 如果可行的话,我可以将监听器绑定到我的 GameView 类,该类将我的所有精灵都绘制到屏幕上?我的玩家类拥有自己的信息,例如健康、速度、x/y 位置、用于碰撞的矩形等。我还想用它来注册玩家的玩家输入。
  • 是的,onTouchListener 将进入 GameView 类,然后您将其绑定到其中的视图。如果您可以显示该代码,那么我可以提供帮助

标签: java android view ontouch


【解决方案1】:
public class GameView extends SurfaceView implements Runnable, OnTouchListener {

  public GameView(Context context) {
    super(context);
    this.setOnTouchListener(this);
  }

  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
    return false;
  } ...

this.setOnTouchListener(this); 行将OnTouchListener 放在扩展SurfaceViewGameView 类上。所以现在只要你的SurfaceView有触摸,onTouch方法就会被调用

【讨论】:

  • 然后我可以从我的播放器类调用 onTouch 还是必须通过 GameView 类调用它才能从播放器调用它。
  • 不,您将在 GameView 类中收到 onTouch 更新,并基于此更新对象 Player
  • 我希望使用 GameView 纯粹用于将视图呈现到屏幕上,我会更乐意在 GameView 上创建一个视图以获取屏幕尺寸并将用户输入传递给相关类 - 可以这样做吗?
【解决方案2】:

您可以使用 ImageView 代替 Bitmap 并使用 setOnTouchListener 方法设置 View.OnTouchListener 的实现:

ImageView sprite;

public Player (Context context){
    sprite = new ImageView(context);
    sprite.setBackgroundResource(R.drawable.monkey);
    sprite.setOnTouchListener(this);
    x = 300;
    y = 0;
}

【讨论】:

  • 我知道这是如何工作的,但是我希望接受来自整个屏幕的触摸输入,而不仅仅是在播放器上。
  • 使用你的 GameView 的 setOnTouchListener 并传递玩家。 public GameView (Context context){ super(context); simpleTurret = SimpleTurret.getInstance(context); player = Player.getInstance(context); this.setOnTouchListener(player); thread.start(); }
  • 我希望使用 GameView 纯粹用于将视图呈现到屏幕上,我会更乐意在 GameView 上创建一个视图以获取屏幕尺寸并将用户输入传递给相关类 - 可以这样做吗?
  • 是的,你可以,但正确的形式是只使用 GameView。 - 您不使用 onTouch 进​​入播放器类。 - 你必须在 GameView 中使用 onTouch - GameView 的高度和宽度必须是 match_parent 你听说过 ViewDragHelper 吗?这可以帮助你。 link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多