Android游戏得分(java)

时间:2015-07-28 09:01:01

标签: java android

所以我正在为一项任务重新安装Android游戏。这不是我的第一个应用程序,但它是我的第一个游戏。我从来没有那么多专家,坦白说这对我来说很难。我希望这里有人可以提供帮助。

我实际上有两个问题要加分(我真诚地希望它不是太多)。问题是,我想在TextView中显示它。当Sprite“坏”被击中时,我希望得分增加1。

我的第一个问题是,即使我没有在文本中添加任何内容,所以TextView也不会出现在我的活动中。我试着把它放在LinearLayout中,或者为它的位置更改一些参数,但我没有在互联网上找到任何其他有用的东西。

我的第二个问题是得分,即使我看不到它,也许不起作用。我找到一些帮助说放置JPanel或JLabel,但我不认为这是我需要的。我尝试了一个简单的事情,我把它变成了一个在isHit中增加的int,然后在页面上显示它。但它没有显示任何内容,并且当我在代码中编写这些内容之前,我甚至无法做任何事情之前,该程序已经养成了崩溃的坏习惯。

我实际上并不知道哪个页面会有用,所以这是我的GameView.java,如果需要其他任何页面,请告诉我。

package com.example.proprietaire.assignmentna2;
import com.example.proprietaire.assignmentna2.R;
import com.example.proprietaire.assignmentna2.Sprite;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

public class GameView extends SurfaceView implements Runnable {

private SurfaceHolder holder;
private int x = 0, xSpeed = 1;
private Bitmap bmp;
Thread thread = null;
volatile boolean running = false;
static final long FPS = 10;
private long lastClick;
private List<Sprite> sprites = new ArrayList<Sprite>();
private List<Sprite> sprites2 = new ArrayList<Sprite>();
private List<TempSprite> temps = new ArrayList<TempSprite>();
private Bitmap bmpSmoke;
int score = 0;


public GameView(Context context) {
    super(context);
    thread = new Thread(this);
    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {


        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            running = false;
            while (retry) {
                try {
                    thread.join();
                    retry = false;
                } catch (InterruptedException e) {
                }
            }
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            createSprites();
            running = true;
            thread.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format,
                                   int width, int height) {
        }
    });

    bmpSmoke = BitmapFactory.decodeResource(getResources(), R.drawable.smoke);
}

private void createSprites() {
    sprites.add(createSprite(R.drawable.bad));
    sprites2.add(createSprite(R.drawable.good));
}

private Sprite createSprite(int resource) {
    bmp = BitmapFactory.decodeResource(getResources(), resource);
    return new Sprite(this, bmp);
}

@Override
protected void onDraw(Canvas canvas) {
   canvas.drawColor(Color.WHITE);
    for (int i = temps.size() - 1; i>= 0; i--) {
        temps.get(i).onDraw(canvas);
    }
    for (Sprite sprite : sprites) {
        sprite.onDraw(canvas);
    }
    for (Sprite sprite : sprites2) {
        sprite.onDraw(canvas);
    }
}

@Override
public void run() {
    long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;

    while (running) {

        Canvas c = null;
        startTime = System.currentTimeMillis();
        try {
            c = getHolder().lockCanvas();
            synchronized (getHolder()) {
                onDraw(c);
            }
        } finally {
            if (c != null) {
                getHolder().unlockCanvasAndPost(c);
            }
        }
        sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
        try {
            if (sleepTime > 0)
                thread.sleep(sleepTime);
            else
                thread.sleep(10);
            } catch (Exception e) {
        }
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (System.currentTimeMillis() - lastClick> 300) {
        lastClick = System.currentTimeMillis();
        float x = event.getX();
        float y = event.getY();
        synchronized (getHolder()) {
            for (int i = sprites.size() - 1; i >= 0; i--) {
                Sprite sprite = sprites.get(i);
                if (sprite.isHit(event.getX(), event.getY())) {

                    sprites.remove(sprite);
                    temps.add(new TempSprite(temps, this, x, y, bmpSmoke));
                    sprites.add(createSprite(R.drawable.bad));
                    sprites.add(createSprite(R.drawable.bad));
                    sprites2.add(createSprite(R.drawable.good));

                    score++;

                    break;
                }

                //TextView textView = (TextView)findViewById(R.id.textView);
                //String s = "" + score;
                //textView.setText((new Integer(score)).toString(Integer.parseInt(s)));
            }
        }
    }
    return true;
}
}

这是GameActivity.java

package com.example.proprietaire.assignmentna2;

import android.app.Activity;
import android.os.Bundle;


public class GameActivity extends Activity {
    GameView GV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GV = new GameView(this);
        setContentView(GV);
    }
}

游戏的xml是一个简单的TextView,没有添加任何特殊内容。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我在制作自己的游戏时只检查了一些旧代码,我制作了一个虚拟.xml文件,其中只有一个RelativeLayout。所以你的`GameActivity看起来像这样:

private TextView tv;
private GameView gv;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dummyXml);

        initializeGameView();
}

从现在开始,您可以使用GameViewTextView。我将举一个例子:

private void initializeGameView(){    
    RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl_dummy_xml);

    LinearLayout ll = new LinearLayout(this);

    //Layout stuff
    ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    ll.setOrientation(LinearLayout.VERTICAL);
    ll.setGravity(Gravity.CENTER_HORIZONTAL);

    //add more stuff, play around with whatever you want to do here
    gv = new GameView();
    ll.addView(gv);

    tv = new TextView(this);
    tv.setText(gv.getScore());
    ll.addView(tv);

    //Finally, don't forget to add the linear layout to the relative layout
    rl.addView(ll);
}

在您的getScore()课程中添加GameView方法,或者在更优雅的位置添加{P

如果您仍有疑问(经过尝试和尝试后),请随时提出问题! =)

修改 使用TextView tv的init更新了代码示例。如果要更新随时添加的textview,请添加一个与此类似的方法:

public void updateTextViewScore(){
    tv.setText(gv.getScore());
}

我将GameViewTextView变量设为全局变量,因此您可以使用任何方法访问它们。

您可能希望在游戏循环中调用此方法(从而更新textview),例如每当分数改变时。

祝你好运!希望这有点清除它。