在安卓游戏循环 [英] Game loop in android
问题描述
我努力学习游戏开发的机器人。首先我想出现,并使用游戏循环每五个第二导屏幕上消失的对象。但我没有得到成功。我已阅读不同的教程和论坛。我应用了所有的东西作为教程,但仍对象连续绘制。它不消失。我一没有得到我缺少的是什么?请指引我。
完整的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屋!