摘要: 好了,代码已经写到这里,基本功能都具备了,下面来进行一些收尾工作吧。1. GameOver的判定。首先在每次消除以后都进行GameOver判定。1 if (game.isOver()) {2 EventDispatcher.send(Event.GAME_OVER);3 }然后实现GameOver判定算法。 1 public boolean isOver() { 2 for (int x = 0; x < ROW_COUNT; x++) { 3 for (int y ... 阅读全文
posted @ 2012-11-27 19:32 史蒂芬.王 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 接上节我们发现的遗留问题。先来解决GridBagLayout的问题。MainFrame.build方法修改如下: 1 public void build() { 2 this.setLayout(null); 3 this.setSize(480, 480); 4 balls = new JButton[12][12]; 5 6 for (int y = 0; y < 12; y++) { 7 for (int x = 0; x < 12; x++) { 8 JBu... 阅读全文
posted @ 2012-11-27 17:41 史蒂芬.王 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 下一步,我们来实现消除。消除分两步,第一步消除选中的小球,第二步,降落。先说消除,在BallActionListener中进行分支处理即可。1 public void actionPerformed(ActionEvent e) {2 Game game = Game.getInstance();3 if (game.isSelectedBall(x, y)) {4 game.destroySelectedBalls();5 } else {6 game.startSelect(x, y);... 阅读全文
posted @ 2012-11-27 16:45 史蒂芬.王 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 然后,我们实现点击小球的动作。点击小球的时候,分为两步,第一步:选中;第二步,清除。本章先研究选中。首先,我们需要了解点击的小球的位置,但是,之前的设计并没有传入相关的参数。所以我们先来重构BallActionListener 1 package org.stephen.bubblebreaker.listener; 2 3 import java.awt.event.ActionEvent; 4 import java.awt.event.ActionListener; 5 6 import org.stephen.bubblebreaker.control.EventDispatche.. 阅读全文
posted @ 2012-11-27 15:38 史蒂芬.王 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 本章,我们来讨论如何为游戏加上动作。先从整体上考虑,很多Java例子程序喜欢直接在代码中加入:button.addActionListener(new ActionListener() { public void performAction(Event e) {}});这样的代码。这是不好的,因为这不符合单一职责原则,ActionListener应该独立出去,单独成类。这样,当发生问题的时候也容易寻找。有两种形式,一种是本文采用的单独成类的形式,另外一种是在对应的对象中声明内部类。例如:class MyButton.ActionListener {}。整体上来讲,我们会加入:StartActi 阅读全文
posted @ 2012-11-27 14:42 史蒂芬.王 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 在写了这么多理论之后,读者都对实践比较感兴趣。那么如何写自表达代码呢?我们跳开理论部分(以后我会补充理论部分),直接进入实践部分,从本章开始,将以消小球这个游戏为例,以Java代码为样本,引导大家一步一步书写自表达式代码。消小球是一款见于Windows Mobile上的游戏,在12x12的方格子里随即放置各种颜色的小球。选中至少两个相邻的同颜色小球,再次点击,就消除选中的小球,消除的小球的个数累加作为得到的分数,消掉小球以后上面的小球会降落,某列被消除以后,会将其左边的列拉过来,直到无法继续消除位置。好了,游戏规则介绍完毕。那么我们开始在Eclipse里建立工程。Java工程,名称Bubble 阅读全文
posted @ 2012-11-27 13:24 史蒂芬.王 阅读(469) 评论(0) 推荐(0) 编辑