【问题标题】:Can I switch activities from a SurfaceView?我可以从 SurfaceView 切换活动吗?
【发布时间】:2021-10-25 00:54:33
【问题描述】:

我正在尝试在 Android Studio 中调整蛇游戏,以便游戏结束触发 GameOverActivity。问题是游戏文本当前是在 redrawCanvas() 函数中写入屏幕的:

public void redrawCanvas(Canvas canvas) {
        if (this.snake.isEnabled()) {
            this.snake.draw(canvas);
            this.apple.draw(canvas);
            this.score.draw(canvas);
        } else {
            Paint p = getPaint();
            p.setTextSize(50);
            p.setColor(Color.BLACK);
            canvas.drawText("Game over!", 100, 100, p);

            // LAUNCH PLAY AGAIN ACTIVITY HERE?
        }
    }

并且这个redrawCanvas 代码包含在一个扩展SurfaceView 的类中。我通常会调用一个意图,但我不能从 SurfaceView 类中调用 startActivity()。我的 SnakeGameActivity 只是设置了内容视图,所有代码都发生在这个表面视图中。这是SnakeGameActivity中的代码:

public class SnakeGameActivity extends com.codepath.simplegame.GameActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        
        //before activity is created : cold start
        //switch back to original Theme (App Theme)
        setTheme(R.style.AppTheme);

        switchFullscreen();
        setContentView(new SnakeGamePanel(this));
    }
}

这是 SnakeGamePanel 中的完整代码:

public class SnakeGamePanel extends AbstractGamePanel {

    public SnakeGamePanel(Context context) {
        super(context);
    }

    private SnakeActor snake;
    private AppleActor apple ;
    private ScoreBoard score;
    private boolean isPaused = false;

    @Override
    public void onStart() {
        this.snake = new SnakeActor(100, 100);
        this.apple = new AppleActor(200, 50);
        this.score = new ScoreBoard(this);
    }

    @Override
    public void onTimer() {
        if (!isPaused) {
            if (this.snake.checkBoundsCollision(this)) {
                this.snake.setEnabled(false);
            }
            this.snake.move();
            if (this.apple.intersect(this.snake)) {
                this.snake.grow();
                this.score.earnPoints(50);
                this.apple.reposition(this);
            }
        }
    }

    @Override
    public void redrawCanvas(Canvas canvas) {
        if (this.snake.isEnabled()) {
            this.snake.draw(canvas);
            this.apple.draw(canvas);
            this.score.draw(canvas);
        } else {
            Paint p = getPaint();
            p.setTextSize(50);
            p.setColor(Color.BLACK);
            canvas.drawText("Game over!", 100, 100, p);

            // LAUNCH PLAY AGAIN ACTIVITY?
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        this.snake.handleKeyInput(keyCode);
        if (keyCode == KeyEvent.KEYCODE_G) {
            this.onStart();
        }
        if (keyCode == KeyEvent.KEYCODE_P) {
            isPaused = !isPaused;
        }
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            this.snake.handleTouchInput(event);
            return true;
        }
        return false;
    }

}

游戏结束时有什么方法可以开始活动吗?

【问题讨论】:

  • 什么是SnakeGamePanel?你会展示这个类的相关部分,特别是它的声明和构造函数。

标签: android android-studio surfaceview start-activity


【解决方案1】:

内部类解决方案的一种替代方法是将Context 对象传递给SurfaceView 子类的构造函数。然后您可以在该上下文中调用startActivity()

【讨论】:

  • 这是一个更清洁的解决方案,谢谢! SnakeGamePanel 已经在其构造函数中获取了一个 Context 对象,但它没有存储它,所以我只是添加了它并且它可以工作。
【解决方案2】:

到目前为止,我找到了一个似乎是解决方案的方法。我刚刚使 SurfaceView 扩展类成为我活动中的内部类。这样,它就有一个作为包含类的活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多