如何将FlappyBird游戏界面与登录界面分离,避免流程干扰
解决方案:分离登录与游戏初始化流程
核心思路是先启动登录界面,等用户完成账号创建/登录操作后,再初始化游戏组件,通过回调机制实现两个流程的顺序执行,彻底避免两者相互干扰。
步骤1:给登录界面添加回调接口
先给LoginScreen增加一个回调机制,用来通知主程序用户已完成登录:
// 自定义登录完成的回调接口 public interface LoginCompleteListener { void onLoginComplete(); } // 修改LoginScreen类,添加回调支持 public class LoginScreen extends JFrame { private LoginCompleteListener loginListener; // 设置回调的方法 public void setLoginCompleteListener(LoginCompleteListener listener) { this.loginListener = listener; } // 假设这是用户点击"创建账号/登录"按钮的事件处理方法 private void onLoginBtnClicked() { // 这里写账号创建/登录的业务逻辑 // ... // 登录完成后触发回调,通知主程序启动游戏 if (loginListener != null) { loginListener.onLoginComplete(); } // 关闭登录界面 this.dispose(); } }
步骤2:重构FlappyBird类,分离登录与游戏初始化
把原来构造函数里的游戏初始化代码抽成单独方法,只在登录完成后执行:
private LoginScreen log; private Timer timer; private FlappyBirdUI1 render; private JFrame jframe; private Rectangle bird; private ArrayList<Rectangle> pipes; public FlappyBird() { // 只初始化并显示登录界面 log = new LoginScreen(); // 设置登录完成后的回调逻辑 log.setLoginCompleteListener(new LoginCompleteListener() { @Override public void onLoginComplete() { // 登录成功后才初始化游戏 initGame(); } }); log.setVisible(true); } // 抽离游戏初始化逻辑到单独方法 private void initGame() { timer = new Timer(20, this); render = new FlappyBirdUI1(); jframe = new JFrame(); jframe.add(render); jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jframe.setResizable(false); jframe.setSize(new java.awt.Dimension(WIDTH, HEIGHT)); jframe.setLocationRelativeTo(null); jframe.addMouseListener(this); jframe.setVisible(true); // 初始化游戏元素 bird = new Rectangle(WIDTH / 2 - 10, HEIGHT / 2 - 10, 20, 20); pipes = new ArrayList<Rectangle>(); addpipe(true); addpipe(true); addpipe(true); addpipe(true); timer.start(); }
关键说明
- 彻底分离了登录流程与游戏流程:程序启动后只显示登录界面,游戏的定时器、窗口、元素都不会提前初始化,完全避免干扰。
- 职责划分清晰:
LoginScreen专注处理账号相关逻辑,FlappyBird专注游戏运行逻辑。 - 确保登录界面在完成操作后关闭,避免多个窗口同时存在。
内容的提问来源于stack exchange,提问作者user22293208
相关产品推荐
相关产品推荐

