сравнивая значения int в Android - PullRequest
0 голосов
/ 25 марта 2012

Я делаю игру для Android, которая проверяет значение здоровья игроков во время запуска этого метода. Но, однако, это не реагирует. Он ничего не делает, когда значение меньше 3, он не должен ничего делать, но когда он равен 3, он должен запускать метод. Пожалуйста, помогите мне и большое спасибо заранее! Это код, который я использую:

        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)
        {
        }
    }
}
}

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Я согласен с другими, проверьте значение с помощью сообщений в журнале, чтобы вы могли увидеть фактические значения.

Кроме того, проверьте, может ли он превысить 3. Я не знаю, какую игру вы ведете, но, например, скажем, что сейчас liveLeftValue = 2, но что-то происходит, и оно увеличивается на 2, достигая 4, никогда не имея значения 3. Допустим, оно никогда не уменьшится, поэтому вы никогда не достигнете значения 3, таким образом, никогда не вызовете игру поверх thingie, иlifeLeftValue просто увеличится до бесконечности.

0 голосов
/ 25 марта 2012

добавьте туда отладку и посмотрите, действительно ли вы получили правильное значение здесь.

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();
        }
    });
} 
...