太空大战-GUI实现(1)
1.复习GUI后,第一天实现的效果
2. 项目实现思路
基本的窗口界面实现就不讲了,源码都看得懂的,这里只说其中比较重要的几个功能的实现。
-
面板的绘制(所有图形的绘制)
首先,需要在GamePanel中重写PaintComponent方法,该方法有一个画笔参数,之后所有图形都是在这个方法中进行绘制的;
// 绘制面板,游戏中所有东西都用这支画笔 @Override protected void paintComponent(Graphics g) { super.paintComponent(g);//清屏 //积分板 g.setColor(Color.orange); g.setFont(new Font("黑体", Font.PLAIN, 25)); g.drawString("得分:" + score, 75, 55); g.drawString("生命:" + blood, 300, 55); g.drawString("时间:" + time, 650, 55); GameData.player.paintIcon(this, g, playerX, playerY); }
-
战机的左右移动
1.首先,分析功能需求:战机每隔1秒移动一段距离,当碰到窗口边缘时反向移动。
2.为了实现每隔1秒执行方法,我引入了计时器来绑定事件刷新(即:每隔150毫秒执行一次监听事件)
//定时器,每隔一秒执行一次actionPerformed()事件监听,this实现了监听方法 Timer timer = new Timer(150, this);//100毫秒=1秒
3.在实现的监听方法中,编写左右移动的逻辑
// 事件监听 // 每隔一秒刷新一次 @Override public void actionPerformed(ActionEvent e) { if ("R".equals(fx)){ playerX += 15; }else if ("L".equals(fx)){ playerX -= 15; } // 边界判断 if (playerX>=875){ fx="L"; }else if (playerX<=25){ fx="R"; } repaint();//重绘 //开启定时器 timer.start(); }
4.注意点:
4.1在每次执行方法完后记得重绘并开启计时器
repaint();//重绘 //开启定时器 timer.start();
*4.2 初次创建时也要开启计时器
public GamePanel() { this.setBackground(new Color(94, 63, 107)); //开启定时器,让飞船一秒刷新一次 timer.start(); }
3.总结
好了,今天就做了这么多,还有很多重要功能没有实现,比如,计分板数据更新、射击敌机等。明天先把socket聊天室的界面实现,结合昨天实现的多线程多客户端功能,实现完整聊天室基本功能应该没问题。有空的话继续实现该项目后续功能。加油💪!!!