2015-07-28 62 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