Как использовать onClickListener на двух объектах CanvasView? - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь сделать игру такой, чтобы, когда пользователь нажимал на стрелок, он менял свою позицию и и стрелял, а если пользователь нажимал на стреляющие шары (или стрелялки, как указано в проекте), они исчезали КОД ЗДЕСЬ

Стрелок. JAVA

public class shooter extends View {

       //Consider all variables are declared
        public shooter(int color, Context c) {
            super(c);
            paint = new Paint();
            paint.setColor(color);
            mContext = c;

        }
        public void move() {
           //Moves Cannon On Click (CODE NOT SHOWN PURPOSELY)  
            invalidate();
        }

        public float getPosition()
        {
            return shootPoint;
        }

        public void draw(Canvas canvas)
        {
            super.draw(canvas);
// simply draws a rectangle (shooter)
            cW=getWidth();
            cH=getHeight();
            center=new Point(cW/2,cH);
             left=0; right=center.x;  shootPoint=right/2;

            canvas.drawRect(left,top,right,bottom,paint);
        }
    }

Другой Java Класс с именованным выстрелом. java также используется для создания стрелковых шаров при нажатии на стрелочную кнопку, но я хочу, чтобы, когда пользователь нажимал на эти шары (нарисованные на холсте), они должен сбросить

Класс просмотра основной игры


public class GameView extends FrameLayout implements View.OnClickListener {
    //Consider all objects and variables are declared as used
    public GameView(Context context, AttributeSet attrs) {
        super(context,attrs);
        //CONTAIN INITIALIZATION OF OBJECTS AS USED  OF OTHER  CLASSES
        bullets = new ArrayList<shoot> ();
        addView(cannon);
        for (int i = 0; i < bullets.size(); i++ ) {
            addView(bullets.get(i));
            bullets.get(i).setOnClickListener(this);// an arrays of objects of shoot class 
        }
        cannon.setOnClickListener(this);
        level=3;level++;
    }

    @Override
    public void onClick(View view) {
       switch()//    Here is the MAIN PROBLEM HOW SHOULD I DIFFERENTIATE THAT CANNON IS CLICKED OR //BULLETS LIKE USING VIEW.GETTAG()
             {
              case ----1:// WHAT CASE SSHOULD I WRITE
              cannon.move();
              break;

              case ----2: // HERE ALSO
              bullets.remove();
              break;


             }
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawGameBoard(canvas);
        try
        {
            Thread.sleep(5);
        } catch (InterruptedException e) {
        }



        invalidate();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        width = w;
        height = h;
        aliens.setBounds(0,0,width,height);
        for (int i = 0; i < bullets.size(); i++ ) {
            bullets.get(i).setBounds(0,0,width,height);

        }

    }

    public void drawGameBoard(Canvas canvas) {
        cannon.draw(canvas);
        for ( int i = bullets.size() - 1; i >= 0; i--) {
            if (bullets.get(i) != null) {
                bullets.get(i).draw(canvas);
             }
        }
        for (int i = explosions.size() - 1; i >= 0; i--) {
            if (explosions.get(i) != null) {
                if (!explosions.get(i).draw(canvas)) {
                    explosions.remove(i);
                }
            }
        }
           if (aliens != null) {
            aliens.draw(canvas);

            RectF guyRect = aliens.getRect();

            for (int i = bullets.size() - 1; i >= 0; i--) {
                if (RectF.intersects(guyRect, bullets.get(i).getRect())) {
                    explosions.add(new explosion(Color.RED,mContext, aliens.getX()-aliens.dst, aliens.getY()-aliens.dst));
                    aliens.reset();
                    bullets.remove(i);
                    break;
                }
            }
            if (!aliens.move()) {
                aliens = null;
            }
        }
    }
    // Whenever the user shoots a bullet, create a new bullet moving upwards
    public void shootCannon() {
        bullets.add(new shoot(Color.RED, mContext, cannon.getPosition(), (float) (height-100)));

    }
}

Я показал ту часть кода, в которой у меня возникла проблема - переопределенная функция ONCLICK в GAMEVIEW. JAVA по комментариям, например, как узнать, что нажимается, чтобы выполнить их уважаемые функции, пожалуйста, сообщите мне, если вы не поняли мой вопрос

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Если я правильно понимаю вопрос, вы хотите использовать одну функцию onClickListener для обработки событий щелчка как для вашей пушки, так и для пуль.

Поскольку оба являются различными классами, вы можете различать их с помощью '' ' instanceof '' '.

Это означает, что ваш onClickListener будет выглядеть примерно так:

@Override
public void onClick(View view) {

    if(view instanceof shooter) {
        cannon.move();
    }
    else if(view instanceof shoot) {
        bullets.remove();
    }
}

Надеюсь, это вам поможет. Если что-то останется неясным, я с удовольствием отвечу:)

0 голосов
/ 16 января 2020

Если вы хотите узнать координаты касания, которые вы можете использовать, чтобы выяснить, если предмет нажат,

рассмотрите возможность использования View.OnTouchListener вместо View.OnClickListener.

View.OnTouchListener имеет эту функцию:

onTouch(View v, MotionEvent event)

Как использовать:

  1. проверить, является ли событие касанием: event.getAction() == MotionEvent.ACTION_DOWN
  2. получить координаты: event.getX() и event.getY()

И после этого заменить cannon.setOnClickListener(this); на cannon.setOnTouchListener(this);

Если есть какие-либо вопросы, не стесняйтесь спрашивать их!

...