onTouchEvent () в игре - PullRequest
       37

onTouchEvent () в игре

0 голосов
/ 15 марта 2019

Я занимаюсь разработкой игрового приложения с использованием Android.

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

Там также будут черные шары (выстрел с правого конца экран), который он должен избегать удара.


enter image description here

У меня проблема с

onTouchEvent(MotionEvent me)

функция при реализации кода.

Я следую этому учебнику в этой серии учебников .


Мои вопросы:

  1. Чтобы использовать функцию onTouchEvent(MotionEvent me), нужно ли импортировать какой-либо класс?

  2. В руководстве объявлено onTouchEvent(MotionEvent me) вне метода onCreate. Что хорошо. Но программа нигде не назвала это. Как это работает тогда?

  3. После написания кода, упомянутого в руководстве, программа не работает должным образом. Окно появляется, когда начинается действие. Тем не менее, он исчезает, как только я нажимаю на экран. В чем может быть проблема?

ActivityMain.XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/scoreLabel"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text=" : 300"
        android:paddingLeft="10dp"
        android:gravity="center_vertical"  />

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/startLabel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30sp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="130dp"/>

        <ImageView

            android:id="@+id/box"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/box"
            android:layout_gravity="center_vertical" />

        <ImageView
            android:id="@+id/orange"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@drawable/orange" />

        <ImageView
            android:id="@+id/black"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:src="@drawable/black" />

        <ImageView
            android:id="@+id/pink"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:src="@drawable/pink" />



    </FrameLayout>

</RelativeLayout>

MainActivity.java

package com.example.catcheggs1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView scoreLabel;
    private TextView startLabel;
    private ImageView box;
    private ImageView orange;
    private ImageView black;
    private ImageView pink;

    //Position
    private int boxY;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        scoreLabel=(TextView)findViewById(R.id.scoreLabel);
        startLabel=(TextView)findViewById(R.id.startLabel);
        box=(ImageView)findViewById(R.id.box);
        orange=(ImageView)findViewById(R.id.orange);
        pink=(ImageView)findViewById(R.id.pink);
        black=(ImageView)findViewById(R.id.black);

        //Move To Out of Screen
        orange.setX(-80);
        orange.setY(-80);
        pink.setX(-80);
        pink.setY(-80);
        black.setX(-80);
        black.setY(-80);


        //Temporary
        startLabel.setVisibility(View.INVISIBLE);
        boxY=500;


    }

    public boolean onTouchEvent(MotionEvent me)
    {
       if(me.getAction()==MotionEvent.ACTION_DOWN)
       {
           boxY -= 1 ;
       }
       box.setY(boxY);

       return true;
    }
}

1 Ответ

0 голосов
/ 15 марта 2019

1.) Нет, вам не нужно ничего импортировать.

2.) Для получения подробной информации вы можете увидеть ссылку.Это событие метод, он вызывается автоматически, вам не нужно его вызывать.https://developer.android.com/guide/topics/ui/ui-events#java

3.) При касании вы используете переменную boxY, которой назначается произвольное число.Ваша проблема, скорее всего, будет вызвана этим.Вместо этого вы должны сначала получить текущую позицию, а не настраивать ее.Вы можете получить текущую позицию с помощью этого метода.

int[] location = new int[2];
imageView.getLocationOnScreen(location);

https://developer.android.com/reference/android/view/View.html#getLocationOnScreen(int[])

Bonus.) OnTouchEvent - это метод действия, поэтому вы должны использовать собственные прослушиватели событий представления для конкретных задач, а не onTouchEvent.

imageView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {   
        return true;
    }
});
...