首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓游戏在启动MatheGame活动后崩溃

安卓游戏在启动MatheGame活动后崩溃
EN

Stack Overflow用户
提问于 2016-12-27 20:09:10
回答 1查看 64关注 0票数 0

我用安卓工作室制作了一个游戏。直到现在,一切都还好,但是今天,在运行我的应用程序之后,它在活动开始后就崩溃了。我找了很长时间的错误,但什么也没找到。

MatheGame.java:

代码语言:javascript
复制
import android.graphics.Point;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;

public class MatheGame extends AppCompatActivity {

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

// Size
private int frameHeight;
private int boxSize;
private int screenWidth;
private int screenHeight;

// Position
private int boxY;
private int orangeX;
private int orangeY;

// Speed
private int boxSpeed;
private int orangeSpeed;


// Score
private int score = 0;


// Initialize Class
private Handler handler = new Handler();
private Timer timer = new Timer();


// Status Check
private boolean action_flg = false;
private boolean start_flg = false;


@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);


    // Get screen size.
    WindowManager wm = getWindowManager();
    Display disp = wm.getDefaultDisplay();
    Point size = new Point();
    disp.getSize(size);

    screenWidth = size.x;
    screenHeight = size.y;


    boxSpeed = Math.round(screenHeight / 60);
    orangeSpeed = Math.round(screenWidth / 60);

    orange.setX(-80);
    orange.setY(-80);


    scoreLabel.setText("Score : 0");

}


public void changePos() {

    hitCheck();

    // Orange
    orangeX -= orangeSpeed;
    if (orangeX < 0) {
        orangeX = screenWidth + 20;
        orangeY = (int) Math.floor(Math.random() * (frameHeight - orange.getHeight()));
    }
    orange.setX(orangeX);
    orange.setY(orangeY);


    // Move Box
    if (action_flg == true) {
        // Touching
        boxY -= boxSpeed;
    } else {
        // Releasing
        boxY += boxSpeed;
    }
    // Check box position.
    if (boxY < 0) boxY = 0;
    if (boxY > frameHeight - boxSize) boxY = frameHeight - boxSize;
    box.setY(boxY);
    scoreLabel.setText("Score : " + score);
}


public void hitCheck() {

    // Orange
    int orangeCenterX = orangeX + orange.getWidth() / 2;
    int orangeCenterY = orangeY + orange.getHeight() / 2;

    if (0 <= orangeCenterX && orangeCenterX <= boxSize &&
            boxY <= orangeCenterY && orangeCenterY <= boxY + boxSize) {
        score += 10;
        orangeX = -10;
    }

}

public boolean onTouchEvent(MotionEvent me) {


    if (start_flg == false) {
        start_flg = true;


        FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
        frameHeight = frame.getHeight();
        boxY = (int)box.getY();
        boxSize = box.getHeight();



        startLabel.setVisibility(View.GONE);


        timer.schedule(new TimerTask() {

            @Override

            public void run() {

                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        changePos();
                    }

                });

            }

        }, 0, 20);

    } else {

        if (me.getAction() == MotionEvent.ACTION_DOWN) {

            action_flg = true;

        } else if (me.getAction() == MotionEvent.ACTION_UP) {

            action_flg = false;
        }
    }
    return true;
}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {

    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (event.getKeyCode()) {

            case KeyEvent.KEYCODE_BACK:
                return true;
        }
    }
    return super.dispatchKeyEvent(event);
}

}

activity_mathe_game.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.eitisoft.mathetrainer.MatheGame">

<TextView
    android:id="@+id/scoreLabel"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:text="Score : 300"
    android:textSize="18sp"
    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:text="Tap to Start"
        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/punkt"/>


</FrameLayout>


</RelativeLayout>

错误:

代码语言:javascript
复制
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setX(float)' on a null object reference
                                                 at com.eitisoft.mathetrainer.MatheGame.onCreate(MatheGame.java:85)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-27 20:11:46

您设置的布局文件错误。所以ImageView是空的,如果您要在空引用上使用任何属性,那么它就会崩溃。更新您的onCreate

代码语言:javascript
复制
setContentView(R.layout.activity_mathe_game);

而不是

代码语言:javascript
复制
setContentView(R.layout.activity_main);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41351586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档