在安卓游戏循环 [英] Game loop in android

查看:131
本文介绍了在安卓游戏循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我努力学习游戏开发的机器人。首先我想出现,并使用游戏循环每五个第二导屏幕上消失的对象。但我没有得到成功。我已阅读不同的教程和论坛。我应用了所有的东西作为教程,但仍对象连续绘制。它不消失。我一没有得到我缺少的是什么?请指引我。

完整的code是在这里:

MainGameActivity.java

 包com.example.showandhideobject;

进口android.app.Activity;
进口android.os.Bundle;
进口android.view.Window;
进口android.view.WindowManager;

公共类MainGameActivity延伸活动{

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow()setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN)。
        的setContentView(新MainGamePanel(本));
    }
}
 

MainGamePanel的.java

 包com.example.showandhideobject;

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

公共类MainGamePanel延伸SurfaceView工具
        SurfaceHolder.Callback {

    私人MainGameThread线;
    私人ImageObject形象;

    //专用长gameStartTime;

    公共MainGamePanel(上下文的背景下){
        超(上下文);
        //添加回调(这)在表面持有者拦截事件
        。getHolder()的addCallback(本);
        //创建游戏循环线程
        线程=新MainGameThread(getHolder(),这一点);

        位图imageBitMap = BitmapFactory.de codeResource(getResources()
                R.drawable.rose);
        图像=新ImageObject(imageBitMap,100,150);
        image.setAppeared(假);
        image.setDisappearTime(System.currentTimeMillis的());

        //做出的GamePanel可获得焦点,因此它可以处理事件
        setFocusable(真正的);
    }

    @覆盖
    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
            INT高度){
    }

    @覆盖
    公共无效surfaceCreated(SurfaceHolder持有者){
        //在这一点上的表面被创建并
        //我们可以放心地开始游戏循环

        thread.setRunning(真正的);
        thread.start();

    }

    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder持有者){
    }

    公共无效更新(){

        Log.i(图像状态:::::::::::::
                。通过Boolean.valueOf(image.isAppeared())的toString());

        如果(!image.isAppeared()
                &功放;&安培; System.currentTimeMillis的() -  image.getDisappearTime()> = 5000){

            Log.i(图像对象:::::::,显示);
            image.setAppeared(真正的);
            image.setAppearTime(System.currentTimeMillis的());

        }
        如果(image.isAppeared()
                &功放;&安培; (System.currentTimeMillis的() -  image.getAppearTime()> = 5000)){

            Log.i(图像对象:::::::,不显示);
            image.setAppeared(假);
            image.setDisappearTime(System.currentTimeMillis的());
        }
    }

    公共无效渲染(帆布油画){

        如果(image.isAppeared()){
            image.draw(画布);
        }
    }

}
 

MainGameThread.java

 包com.example.showandhideobject;

进口android.graphics.Canvas;
进口android.util.Log;
进口android.view.SurfaceHolder;

公共类MainGameThread继承Thread {

    //可以访问物理曲面的曲面保持器
    私人SurfaceHolder surfaceHolder;

    //处理输入的实际看法
    //并绘制到表面
    私人MainGamePanel的GamePanel;

    //标志保持比赛状态
    私人布尔运行;

    公共布尔isRunning(){
        返回运行;
    }

    公共无效setRunning(布尔运行){
        this.running =运行;
    }

    公共MainGameThread(SurfaceHolder surfaceHolder,MainGamePanel的GamePanel){
        超();
        this.surfaceHolder = surfaceHolder;
        this.gamePanel =的GamePanel;
    }

    @覆盖
    公共无效的run(){
        帆布油画;

        而(isRunning()){
            帆布= NULL;
            //尝试锁定画布独家像素编辑
            //在表面
            尝试 {
                画布= this.surfaceHolder.lockCanvas();
                同步(surfaceHolder){
                    Log.i(随着:::::::::,游戏圈);
                    //更新游戏状态
                    gamePanel.update();
                    //渲染状态在屏幕上,并在画布上绘制的
                    // 面板

                    gamePanel.render(画布);
                    // gamePanel.onDraw(画布);
                }
            } 最后 {
                //在发生异常的表面不留在
                //不一致的状态
                如果(帆布!= NULL){
                    surfaceHolder.unlockCanvasAndPost(画布);
                }
            } // end最后
        }
    }
}
 

ImageObject.java

 包com.example.showandhideobject;

进口android.graphics.Bitmap;
进口android.graphics.Canvas;

公共类ImageObject {

    私人位图位图; //实际的位图
    私人诠释X; // X坐标
    私人诠释Ÿ; // Y坐标
    私人布尔isAppeared;
    专用长appearTime;
    专用长disappearTime;

    //构造这个类
    公共ImageObject(位图位图,诠释的x,int y)对{
        this.bitmap =位图;
        this.x = X;
        this.y = Y;
    }

    公共位图getBitmap(){
        返回的位图;
    }

    公共无效setBitmap(位图位图){
        this.bitmap =位图;
    }

    公众诠释的getX(){
        返回X;
    }

    公共无效setX的(INT X){
        this.x = X;
    }

    公众诠释getY()以{
        返回是;
    }

    公共无效塞蒂(int y)对{
        this.y = Y;
    }

    公共布尔isAppeared(){
        返回isAppeared;
    }

    公共无效setAppeared(布尔isAppeared){
        this.isAppeared = isAppeared;
    }

    众长getAppearTime(){
        返回appearTime;
    }

    公共无效setAppearTime(长appearTime){
        this.appearTime = appearTime;
    }

    众长getDisappearTime(){
        返回disappearTime;
    }

    公共无效setDisappearTime(长disappearTime){
        this.disappearTime = disappearTime;
    }

    / *方法绘制在画布上的图像* /
    公共无效画(油画画布){
        canvas.drawBitmap(位图中,x  - (bitmap.getWidth()/ 2),
                Ÿ - (bitmap.getHeight()/ 2),NULL);
    }
}
 

解决方案

在此部分

 如果(image.isAppeared()){
    image.draw(画布);
}
 

你永远不清除你的画布。你在做什么实际绘制图像一遍又一遍在同一地点。

您可能需要重新绘制在中科院背景 isAppeared()

修改

您也可以使用canvas.save()绘制图像之前,和canvas.restore(),当你不想要的图像了。

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.

The complete code is here:

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

解决方案

in this part

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.

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

Edit

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

这篇关于在安卓游戏循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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