纯OO:从设计到编码写一个FlappyBird (四)
第三部分请点这里
这里来实现Obstacle类。其实flappybird的本质就是小鸟原地掉,然后几根柱子在走。这也是在Game类里,用obs.move()来实现游戏逻辑的原因。
我们首先必须确定几个数据。
0、柱子之间的间隙
1、柱子的最小值和最大值
2、柱子之间的间距
3、柱子的宽度
在屏幕高度确定的情况下,只要我们确定了上半部分的柱子的高度,那么根据间隙,就能画出两个柱子。(tip:做个减法而已)
因此,一个障碍需要两个数据来标示:
0、x值
1、高度
而move的实现,就是x的递减。
还需要实现一个重要的功能,就是 柱子的添加和删除。我们必须要决定,何时删除一个既有的柱子,并且何时添加一个新的柱子。
但是在那以前,我们必须要决定使用什么数据结构来储存柱子。
容易发现,柱子的动态添加和删除有先进先出的性质,那么自然就是实现了Queue接口的LinkedList了。
那么我们何时添加一个柱子?
答:当最后一个柱子,和最右距离差一个柱子间间隙的时候。
何时删除一个柱子:
答:当第一个柱子的x值加宽度小于0时。
注意:Judge类需要和Obstacle公用LinkedList,要不然没法算分。。这个耦合度还得在下一次重构中好好想想怎么解决。。
Obstacle类的全部代码:
import javax.swing.*; import java.util.LinkedList; import java.awt.*; import java.awt.event.*; public interface Obstacle { public void move(); public LinkedList<Pillar> getObstacles(); } class SimpleObstacle implements Obstacle { private static final int SPEED = 2; public LinkedList<Pillar> pillar = new LinkedList<Pillar> (); int border; SimpleObstacle(int border) { this.border = border; init(); } private static int getRandomHeight() { int res = (int)(Math.random() * (Pillar.getHeiLmt() - 100) + 100); return res; } private void init() { pillar.add(new Pillar(this.border,getRandomHeight())); } public LinkedList<Pillar> getObstacles() { return pillar; } public void move() { boolean del = false; for (Pillar p : pillar) { p.setX(p.getX() - SPEED); if (p.getX() + Pillar.getWidLmt() <= 0) del = true; } if (del) pillar.remove(); Pillar tmp = pillar.getLast(); if (tmp.getX() + Pillar.getWidLmt() + Pillar.getWidGap() <= border) pillar.add(new Pillar(this.border,getRandomHeight())); } } class Pillar { int height; int x; private static final int WIDGAP = 200; private static final int HEIGAP = 150; private static final int WIDLMT = 100; private static final int HEILMT = 300; Pillar(int x,int height) { this.x = x; this.height = height; } public void setX(int x) { this.x = x; } public int getX() { return x; } public int getHeight() { return height; } public static int getWidGap() { return WIDGAP; } public static int getHeiGap() { return HEIGAP; } public static int getWidLmt() { return WIDLMT; } public static int getHeiLmt() { return HEILMT; } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。