如何每隔五秒钟使用游戏循环在屏幕上显示和消失一个对象 [英] How to appear and disappear an object on screen using game loop for every five second

查看:70
本文介绍了如何每隔五秒钟使用游戏循环在屏幕上显示和消失一个对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试学习Android中的游戏开发.首先,我尝试每隔五秒钟使用游戏循环在屏幕上显示和消失一个对象.但是我没有成功.我阅读了不同的教程和论坛.我按照教程中的说明应用了所有内容,但对象仍在不断绘制.它并没有消失.我没有得到我想念的东西吗?请指导我.

I am trying to learn game development in android. First I am trying to appear and disappear an object on screen using game loop for every five second. But I did not get succeed. I have read different tutorials and forums. I applied all things as in tutorials but still object is drawing continuously. It is not disappearing. I a not getting what I am missing? Please guide me.

完整的代码在这里:

MainGameActivity.java

package com.example.showandhideobject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainGameActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new MainGamePanel(this));
    }  
}

MainGamePanel .java

package com.example.showandhideobject;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainGamePanel extends SurfaceView implements
        SurfaceHolder.Callback {

    private MainGameThread thread;
    private ImageObject image;

    // private long gameStartTime;

    public MainGamePanel(Context context) {
        super(context);
        // adding the callback (this) to the surface holder to intercept events
        getHolder().addCallback(this);
        // create the game loop thread
        thread = new MainGameThread(getHolder(), this);

        Bitmap imageBitMap = BitmapFactory.decodeResource(getResources(),
                R.drawable.rose);
        image = new ImageObject(imageBitMap, 100, 150);
        image.setAppeared(false);
        image.setDisappearTime(System.currentTimeMillis());

        // make the GamePanel focusable so it can handle events
        setFocusable(true);
    }

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

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // at this point the surface is created and
        // we can safely start the game loop

        thread.setRunning(true);
        thread.start();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    public void update() {

        Log.i("Image Status:::::::::::::    ",
                Boolean.valueOf(image.isAppeared()).toString());

        if (!image.isAppeared()
                && System.currentTimeMillis() - image.getDisappearTime() >= 5000) {

            Log.i("Image Object:::::::  ", "Showing");
            image.setAppeared(true);
            image.setAppearTime(System.currentTimeMillis());

        }
        if (image.isAppeared()
                && (System.currentTimeMillis() - image.getAppearTime() >= 5000)) {

            Log.i("Image Object:::::::  ", "Not Showing");
            image.setAppeared(false);
            image.setDisappearTime(System.currentTimeMillis());
        }
    }

    public void render(Canvas canvas) {

        if (image.isAppeared()) {
            image.draw(canvas);
        }
    }

}

MainGameThread.java

package com.example.showandhideobject;

import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;

public class MainGameThread extends Thread {

    // Surface holder that can access the physical surface
    private SurfaceHolder surfaceHolder;

    // The actual view that handles inputs
    // and draws to the surface
    private MainGamePanel gamePanel;

    // flag to hold game state
    private boolean running;

    public boolean isRunning() {
        return running;
    }

    public void setRunning(boolean running) {
        this.running = running;
    }

    public MainGameThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel) {
        super();
        this.surfaceHolder = surfaceHolder;
        this.gamePanel = gamePanel;
    }

    @Override
    public void run() {
        Canvas canvas;

        while (isRunning()) {
            canvas = null;
            // try locking the canvas for exclusive pixel editing
            // in the surface
            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized (surfaceHolder) {
                    Log.i("With in :::::::::", "Game Loop");
                    // update game state
                    gamePanel.update();
                    // render state to the screen and draw the canvas on the
                    // panel

                    gamePanel.render(canvas);
                    // gamePanel.onDraw(canvas);
                }
            } finally {
                // in case of an exception the surface is not left in an
                // inconsistent state
                if (canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            } // end finally
        }
    }
}

ImageObject.java

package com.example.showandhideobject;

import android.graphics.Bitmap;
import android.graphics.Canvas;

public class ImageObject {

    private Bitmap bitmap; // the actual bitmap
    private int x; // the X coordinate
    private int y; // the Y coordinate
    private boolean isAppeared;
    private long appearTime;
    private long disappearTime;

    // Constructor for this class
    public ImageObject(Bitmap bitmap, int x, int y) {
        this.bitmap = bitmap;
        this.x = x;
        this.y = y;
    }

    public Bitmap getBitmap() {
        return bitmap;
    }

    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public boolean isAppeared() {
        return isAppeared;
    }

    public void setAppeared(boolean isAppeared) {
        this.isAppeared = isAppeared;
    }

    public long getAppearTime() {
        return appearTime;
    }

    public void setAppearTime(long appearTime) {
        this.appearTime = appearTime;
    }

    public long getDisappearTime() {
        return disappearTime;
    }

    public void setDisappearTime(long disappearTime) {
        this.disappearTime = disappearTime;
    }

    /* Method to draw images on Canvas */
    public void draw(Canvas canvas) {
        canvas.drawBitmap(bitmap, x - (bitmap.getWidth() / 2),
                y - (bitmap.getHeight() / 2), null);
    }
}

推荐答案

在此部分

if (image.isAppeared()) {
    image.draw(canvas);
}

您永远不会清除画布.实际上,您实际上是在同一地点一遍又一遍地绘制图像.

you never clear your canvas. What you are doing is actually drawing your image over and over on the same spot.

您可能需要在cas中重绘背景 isAppeared() false

You probably need to redraw a background in cas isAppeared() is false

您还可以在绘制图像之前使用canvas.save(),而当您不再需要图像时可以使用canvas.restore().

you can also use canvas.save() before drawing the image, and canvas.restore() when you don't want the image anymore.

这篇关于如何每隔五秒钟使用游戏循环在屏幕上显示和消失一个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆