2015-07-28 30 views
0

所以我正在做一个Android游戏的作业resit。这不是我的第一款应用,但它是我的第一款游戏。我从来没有像这位专家那么熟练,坦率地说,这对我来说很难。我希望这里有人能帮忙。Android中的游戏得分(java)

我其实有两个问题要添加一个分数(我真心希望它不会太多)。事情是,我想在TextView中显示它。当Sprite“bad”被击中时,我希望得分增加1.

我的第一个问题是,即使我没有在其中放入任何其他文本,我的活动中也不会显示该TextView。我试图把它放在LinearLayout中,或者改变它的位置的一些参数,但我没有在互联网上找到任何其他有用的东西。

我的第二个问题是分数,即使我看不到它,可能不起作用。我找到了一些帮助,说要把JPanel或JLabel,但我不认为这是我所需要的。我尝试了一个简单的东西,我只是将它作为一个int,增加了isHit,然后将其显示在页面上。但它没有显示任何内容,而且在程序写入代码之前甚至无法做任何事情之前,该程序就会遭遇崩溃的坏习惯。

我实际上并不知道哪个其他页面会有用,所以这里是我的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。 预先感谢您。

+0

第一眼看起来似乎没问题,但是因为这整个类基本上仍然是一个视图,所以您需要将您的textview添加到SurfaceView旁边,而不是在其内部。你能告诉我你将类GameView(SurfaceView)添加到主布局的类吗? –

+0

你的意思是我的GameActivity? (我今天输了)我将编辑主帖。 – poibhw

+0

嗯,我不知道你给你的“主”类命名。我指的是启动“GameView”的类,并将该实例添加到某个“主”布局,以使其在屏幕上可见=) –

回答

0

我刚刚在制作自己的游戏时检查了一些旧代码,我制作了一个仅有RelativeLayout的虚拟.xml文件。所以,你的`GameActivity会是这个样子:

private TextView tv; 
private GameView gv; 

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

     initializeGameView(); 
} 

从这点上来说,你可以玩弄你的GameView和你TextView。我会给开始的例子:

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的初始化代码示例。如果你想更新你在任何时候加入的TextView,添加强硬类似这样的方法:

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

我做了GameViewTextView变量的全局,因此你可以在你希望的任何方式访问它们。

您可能想要在游戏循环内调用此方法(从而更新文本视图),例如,只要分数改变。

祝你好运!希望这个清理一下。

+0

...对于延迟抱歉。我试过并尝试过(尝试过,甚至尝试了其他的东西,为什么我没有回答那么久)。问题是它不知道你的例子中的“yourTextView”是什么,无论我放置什么来取代它。所以我无法测试任何东西。 – poibhw

+0

更新我的答案,希望额外的信息是有用的,否则我会需要你的“完整的”代码,包括xml和东西。但这个例子应该为你提供足够的知识。请注意,您可能需要向textview和linearlayout添加一些布局参数,因为它们现在可能看起来很乱。 –

+0

不得不适应/添加一些东西,但它的工作!谢谢! :) – poibhw