我正在开发一款小型游戏,其中我有更改的图像和一个控制面板(一些按钮),用户可以根据显示的图像按下它们。 GameView类扩展了SurfaceView,因此当活动开始时它只是创建游戏并设置内容视图(使用SurfaceView和相对布局中的一些按钮的布局)。游戏在setSurfaceSize回调期间调用loadGameObjects如下:
public void setSurfaceSize(int width, int height)
{
synchronized (holder)
{
canvasWidth = width;
canvasHeight = height;
GameView.this.postInvalidate();
loadGameObjects(getResources());
}
}
在loadGameObjects方法中,我保持对游戏pojo对象的引用,该对象不是视图(但保存对图像的引用),如下所示:
public void loadGameObjects(Resources resouces)
{
List<GameObject> gameObjects = new LinkedList<GameObject>();
int middleX = getWidth()/2;
int middleY = getHeight()/2;
//Create the backgroung game object
BitmapDrawable background = (BitmapDrawable)resouces.getDrawable(R.drawable.g_monitor);
Bitmap bitmap = Bitmap.createScaledBitmap(background.getBitmap(), getWidth(),
getHeight(), true);
background = new BitmapDrawable(bitmap);
gameObjects.add(new GameObject(this, getContext(), background, new Point(0,0)));
//Create the game object with all its images.
Map<RunningGoblinResourceEnum, BitmapDrawable> goblinImgs = new HashMap<RunningGoblinResourceEnum, BitmapDrawable>();
goblinImgs.put(RunningGoblinResourceEnum.greenGoblinUp, (BitmapDrawable)resouces.getDrawable(R.drawable.goblin_up_green));
//This map get more entries like this...
//ourGoblin is a member var that later will be null in onClick
ourGoblin = new RunningGoblinObject(this, getContext(), goblinImgs,
new Point(middleX, middleY));
gameObjects.add(ourGoblin);
setGameObjects(gameObjects);
}
在doDraw期间,调用游戏对象“draw”方法在画布上绘制自己 我的问题是,当我点击按钮时,对 ourGoblin 游戏对象的引用为null,尽管它在loadGameObjects方法中有效。 有人可以告诉我我错过了什么吗?
答案 0 :(得分:1)
我有一些类似的东西。 在loadGameObjects方法中,使用new运算符创建ourGoblin实例。但是,如果这是与setContentView一起使用的布局中的视图,则系统不会将您的视图与布局中的视图相关联,因此从系统的角度来看,布局中的视图仍然为null,直到将调用findViewById这个观点id。尝试在该id上调用findViewById并查看myGoblin是否仍为null,如果没有,请记住,您仍然有两个该对象的实例,一个使用new运算符创建,另一个使用系统创建。
答案 1 :(得分:0)
当然,
您可以看到它是一个非常简单直接的onClick实现:
public void onClick(View v)
{
Log.d(getClass().getName() + "onClick", "ourGoblin = " + ourGoblin);
if(ourGoblin == null)
return;
Log.d(getClass().getName() + "onClick", "ourGoblin = " + ourGoblin.getCurrentImageEnum().toString());
int id = v.getId();
switch(id)
{
case R.id.greenUp:
if(RunningGoblinResourceEnum.greenGoblinUp.equals(ourGoblin.getCurrentImageEnum()))
{
//Do something to statistics
}
break;
}
}
以及我的布局xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gameFrame"
android:layout_width="match_parent" android:layout_height="match_parent">
<com.test.game.GameView android:id="@+id/gameView"
android:layout_width="match_parent" android:layout_height="match_parent" />
<RelativeLayout android:id="@+id/controlPanel"
android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:id="@+id/greenUp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_centerInParent="true"
android:text="up"/>
</RelativeLayout>
</FrameLayout>