【发布时间】:2013-11-26 06:23:28
【问题描述】:
我正在开发一款适用于 Android 的游戏,但在弄清楚这一点时遇到了一些麻烦。
我有一个主要活动,我有一个 GameView (SurfaceView)。我想在 GameView 中执行操作时更改 MainActivity 中按钮的背景图像。
我的 MainActivity 是一个 Activity,但 GameView 不是一个 Activity,它只是在我的 MainActivity 中被调用和显示。
我想过做以下事情:
主要活动:
public void setNumberLivesPicture(final Drawable background){
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
numberLivesPicture.setBackgroundDrawable(background);
}
});
}
游戏视图:
public class GameView extends SurfaceView{
int difficulty = HomePage.getDifficulty();
int player = HomePage.getPlayer();
String direction = MainActivity.getDirection();
boolean audio = HomePage.getAudio();
private Drawable bloodspatterdead;
Button numberLivesPicture;
Button numberLivesButton;
MainActivity mAct;
public GameView(Context context, AttributeSet attributeSet, MainActivity MActivity, Button NumberLives) {
super(context, attributeSet);
gameLoopThread = new GameLoopThread(this);
if (audio == true){
backgroundNoise.start();
}
getHolder().addCallback(new SurfaceHolder.Callback()
{
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
GameLoopThread.setRunning(false);
while (retry) {
try {
gameLoopThread.join();
retry = false;
} catch (InterruptedException e) {}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
createSprites(difficulty);
GameLoopThread.setRunning(true);
gameLoopThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
}
private void checkForEnemyCollision() {
int x = playerSprite.getPlayerX();
int y = playerSprite.getPlayerY();
Rect playerRect = new Rect(x, y, (x + playerSprite.getPlayerWidth()), (y + playerSprite.getPlayerHeight()));
for (int i = 0; i<sprites.size(); i++)
{
Rect zombieSprite = sprites.get(i).getZombieBounds();
if(zombieSprite.intersect(playerRect))
{
if (justDied == true){ // if you just died, we'll give you a break
}
if (justDied == false){
if (NumberOfLives <= 1){ // if you do not have any extra lives.. you die!
if (shieldsActivated >= 1){
shieldsActivated--;
if (audio == true){
shielddestroyed.start();
}
}
if (shieldsActivated == 0)
{
((MainActivity) getContext()).setTextView("THE ZOMBIES ATE YOUR BRAINS!!");
if (audio == true){
backgroundNoise.stop();
youaredeadmessage.start();
}
for (int z = 0; z<playerSprites.size(); z++)
{
playerSprites.remove(z);
}
alive = false;
}
}
if (NumberOfLives > 1){
if (shieldsActivated >= 1){
shieldsActivated--;
if (audio == true){
shielddestroyed.start();
}
}
else if (shieldsActivated == 1){
shieldsActivated=0;
if (audio == true)
{
shielddestroyed.start();
}
}
else if (shieldsActivated == 0){
NumberOfLives = NumberOfLives -1;
justDied = true;
if (NumberOfLives == 4){
//Button numberOfLives2 = (Button) findViewById(R.id.numberLivesPicture);
numberLivesPicture = (Button) findViewById(R.id.numberLivesPicture);
((MainActivity) getContext()).setNumberLivesPicture(R.id.numberLivesPicture); numberLivesPicture.setBackgroundResource(R.drawable.numberlives4);
}
但这不起作用:(
编辑:
我已经成功地使用它来更改 TextView 内的 TEXT,但我不确定如何使用这样的方法来更改背景:
public void setTextView(final String txt){
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
txv.setText(txt);
}
});
}
用于:
((MainActivity) getContext()).setTextView("THE ZOMBIES ATE YOUR BRAINS!!");
任何建议将不胜感激!
【问题讨论】:
-
您的表面视图是在主要活动上还是在不同活动上。
-
我的 SurfaceView 不在我的 MainActivity 中,但它本身不是一个活动。我的 MainActivity 调用 SurfaceView 并将其放在里面(这充当我的游戏表面)。因此,您可以将其视为不同的活动
-
好的,你可以做的是你可以从surfaceview向你的主要活动发送广播,你可以简单地在主要活动中更新你的数据。
-
我不认为这会起作用,因为我的 MainActivity 是我的游戏本身,所以我必须每秒刷新一次(当可能发生变化时)会有点多。我编辑了评论以显示我如何更改文本,这对我来说效果很好,但不确定如何将它用于背景或图像。
-
我给你的建议是一个非常笼统的建议。无论如何,我会尝试找出您代码中的问题。
标签: android button android-activity background drawable