2012-03-25 118 views
0

我正在製作一個安卓遊戲,它在運行此方法時檢查玩家健康值。但是,它沒有反應。它什麼都不做,當值小於3時,它不應該做任何事情,但是當它等於3時,它應該運行一個方法。請提前幫助我並多謝!這是我使用的代碼:比較Android中的int值

 private void checkLivesLeftValue() { 
     if (livesLeftValue == 3) { 
      //Message to display: "You lost! 
      onMethod(); 
     } 
     else { 
      livesLeftValue = livesLeftValue + 1; 
     } 
    } 

全碼:

package com.mysoftwaremobileapps.ParachuteHunter; 

import java.util.ArrayList; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ExampleView extends SurfaceView implements SurfaceHolder.Callback 
{ 
class ExampleThread extends Thread 
{ 
    private ArrayList<Parachuter> parachuters; 
    private Bitmap parachuter; 
    private Paint black; 

    private boolean running; 

    private SurfaceHolder mSurfaceHolder; 
    private Context mContext; 
    private Handler mHandler; 
    private GameScreenActivity mActivity; 

    private long frameRate; 
    private boolean loading; 
    public float x; 
    public float y; 
    public MediaPlayer mp1; 
    public int parachuterIndexToResetAndDelete; 
    public int canvasGetWidth; 
    public int livesLeftValue; 

    public ExampleThread(SurfaceHolder sHolder, Context context, Handler handler) 
    { 
     mSurfaceHolder = sHolder; 
     mHandler = handler; 
     mContext = context; 
     mActivity = (GameScreenActivity) context; 

     parachuters = new ArrayList<Parachuter>(); 
     parachuter = BitmapFactory.decodeResource(getResources(), R.drawable.parachuteman); 
     black = new Paint(); 
     black.setStyle(Paint.Style.FILL); 
     black.setColor(Color.WHITE); 

     running = true; 

     // This equates to 26 frames per second. 
     frameRate = (long) (1000/26); 
     loading = true; 
    } 

    @Override 
    public void run() 
    { 
     while (running) 
     { 
      Canvas c = null; 
      try 
      { 
       c = mSurfaceHolder.lockCanvas(); 

       synchronized (mSurfaceHolder) 
       { 
        long start = System.currentTimeMillis(); 
        doDraw(c); 
        long diff = System.currentTimeMillis() - start; 

        if (diff < frameRate) 
         Thread.sleep(frameRate - diff); 
       } 
      } catch (InterruptedException e) 
      { 
      } 
      finally 
      { 
       if (c != null) 
       { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 

    protected void doDraw(Canvas canvas) 
    { 
     canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), black); 
     canvasGetWidth = canvas.getWidth(); 

     //Draw 
     for (int i = 0; i < parachuters.size(); i++) 
     { 
      canvas.drawBitmap(parachuter, parachuters.get(i).getX(), parachuters.get(i).getY(), null); 
      parachuters.get(i).tick(); 
     } 

     //Remove 
     for (int i = 0; i < parachuters.size(); i++) 
     { 
     if (parachuters.get(i).getY() > canvas.getHeight()) { 
      parachuters.remove(i); 
      onPlaySound(); 
      checkLivesLeftValue(); 
     } 
    } 
    } 


    public void onPlaySound() 
    { 
     try { 
     mp1 = MediaPlayer.create(getContext(), R.raw.bombsound); 
     mp1.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      mp1.release(); 
     } 
    } 

    public void onMethod() { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getContext(), "You lost!", 15).show(); 
      } 
     }); 
    } 

    private void checkLivesLeftValue() { 
     // TODO Auto-generated method stub 
     if (livesLeftValue == 3) { 
      //Message to display: "You lost! 
      onMethod(); 
     } 
     else { 
      livesLeftValue = livesLeftValue + 1; 
     } 
    } 

    public boolean onTouchEvent(MotionEvent event) 
    { 
     if (event.getAction() != MotionEvent.ACTION_DOWN) 
      return false; 
     float x1 = event.getX(); 
     float y1 = event.getY(); 

     initiateDrawParachuters(); 

     return true; 
    } 

    public void initiateDrawParachuters() 
    { 
     drawParachuter1(); 
    } 

    private void drawParachuter1() { 
     // TODO Auto-generated method stub 
     //Parachuter nr. 1 
     x = 68; 
     y = 40; 

     Parachuter p = new Parachuter(x, y); 
     parachuters.add(p); 
     drawParachuter2(); 
    } 

    private void drawParachuter2() { 
     // TODO Auto-generated method stub 
     //Parachuter nr. 2 
     x = 100; 
     y = 80; 

     Parachuter p = new Parachuter(x, y); 
     parachuters.add(p); 
     drawParachuter3(); 
    } 

    private void drawParachuter3() { 
     // TODO Auto-generated method stub 
     //Parachuter nr. 3 
     x = 150; 
     y = 120; 

     Parachuter p = new Parachuter(x, y); 
     parachuters.add(p); 
     drawParachuter4(); 
    } 

    private void drawParachuter4() { 
     // TODO Auto-generated method stub 
     //Parachuter nr. 4 
     x = 170; 
     y = 150; 

     Parachuter p = new Parachuter(x, y); 
     parachuters.add(p); 
     drawParachuter5(); 
    } 

    private void drawParachuter5() { 
     // TODO Auto-generated method stub 
     //Parachuter nr. 5 
     x = 180; 
     y = 170; 

     Parachuter p = new Parachuter(x, y); 
     parachuters.add(p); 
     drawParachuter6(); 
    } 

    private void drawParachuter6() { 
     // TODO Auto-generated method stub 
     //Parachuter nr. 6 
     x = 200; 
     y = 180; 

     Parachuter p = new Parachuter(x, y); 
     parachuters.add(p); 
    } 

    public void drawParachuters() 
    { 
      Parachuter p = new Parachuter(x, y); 
      parachuters.add(p); 
      Toast.makeText(getContext(), "x=" + x + " y=" + y, 15).show(); 
    } 

    public void setRunning(boolean bRun) 
    { 
     running = bRun; 
    } 

    public boolean getRunning() 
    { 
     return running; 
    } 
} 

/** Handle to the application context, used to e.g. fetch Drawables. */ 
private Context mContext; 

/** Pointer to the text view to display "Paused.." etc. */ 
private TextView mStatusText; 

/** The thread that actually draws the animation */ 
private ExampleThread eThread; 

public ExampleView(Context context) 
{ 
    super(context); 

    // register our interest in hearing about changes to our surface 
    SurfaceHolder holder = getHolder(); 
    holder.addCallback(this); 

    // create thread only; it's started in surfaceCreated() 
    eThread = new ExampleThread(holder, context, new Handler() 
    { 
     @Override 
     public void handleMessage(Message m) 
     { 
      // mStatusText.setVisibility(m.getData().getInt("viz")); 
      // mStatusText.setText(m.getData().getString("text")); 
     } 
    }); 

    setFocusable(true); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    return eThread.onTouchEvent(event); 
} 

public ExampleThread getThread() 
{ 
    return eThread; 
} 

@Override 
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) 
{ 
    // TODO Auto-generated method stub 
} 

public void surfaceCreated(SurfaceHolder holder) 
{ 
    if (eThread.getState() == Thread.State.TERMINATED) 
    { 
     eThread = new ExampleThread(getHolder(), getContext(), getHandler()); 
     eThread.start(); 
    } 
    else 
    { 
     eThread.start(); 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) 
{ 
    boolean retry = true; 
    eThread.setRunning(false); 

    while (retry) 
    { 
     try 
     { 
      eThread.join(); 
      retry = false; 
     } 
     catch (InterruptedException e) 
     { 
     } 
    } 
} 
} 
+0

它現在如何行事? – 2012-03-25 16:57:04

+0

嘗試使用'equals()'方法,就像這樣'if(livesLeftValue.equals(3))',你需要在你的代碼片段中包含一些額外的部分。 – Lion 2012-03-25 16:57:17

+1

@Lion,這不應該是'int'比較所必需的。但是,是的,我假設livesleftValue是一個'int' .. @OP是否有可能'livesLeftValue'高於3?也許它開始/得到高於3,所以這種方法是「錯過」。或者,正如@Lion指出的那樣,你可以發佈更多的代碼嗎?像聲明的lifeLeftValue在哪裏,以及在哪裏使用? – edthethird 2012-03-25 17:03:38

回答

0

把一些調試在那裏,看看是否你真的在這裏得到正確的值。

private void checkLivesLeftValue() { 
    Log.d("checkLivesLeftValue", "lives = " + livesLeftValue); 
    if (livesLeftValue == 3) { 
     Log.d("checkLivesLeftValue", "calling onMethod now"); 
     onMethod(); 
    } else { 
     livesLeftValue = livesLeftValue + 1; 
     Log.d("checkLivesLeftValue", "increased lives to " + livesLeftValue); 
    } 
} 

public void onMethod() { 
    Log.d("onMethod", "in onMethod"); 
    mHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      Log.d("onMethod", "showing Toast now"); 
      Toast.makeText(getContext(), "You lost!", 15).show(); 
     } 
    }); 
} 
+0

我這樣做了,它的工作方式就像計劃:value:0,增加到1,值1,增加到2,值2,增加到3,值3,調用onMethod現在 – user1183066 2012-03-25 17:42:20

1

我同意其他人通過日誌消息檢查值,所以你可以看到實際值。

此外,檢查它是否可能結束3.我不知道你在做什麼樣的遊戲,但例如,說現在生命值爲2,但是發生了一些事情,它增加了2,達到4,沒有永遠具有價值3.讓我們說它永遠不會減少,所以你永遠不會達到價值3,因此永遠不會調用遊戲而不是物品,生命值將會增加到無窮大。