第二部分请点这里

下面首先来实现Bing接口!

实现Bing接口的类取名SimpleBing。

容易发现,SimpleBing类总的来说要向下,但点击一下又得向上,向上到了一定界限又得向下,但我们又只有一个action方法供Game调用。。怎么办??

又向上,又向下的,还互相转换,有没有让你想到什么?

Bingo!状态!这里将使用状态模式来实现SimpleBing类的行为。

下面是类图:

接口State:

interface State {
public void move();
public void changeState();
public void setInit(int speed);
}

move方法好说,你是往上,就往上走;你是往下,就往下走。changeState就是切换状态,下图是状态图:

首先必须明确,当向上执行到一定程度时,需要转换为向下。我采用的方案是,设定一个距离阀值upSpeed,当向上移动了upSpeed的位移之后自动转化为向下状态。

当在Game类中执行fang.beginUp()的时候,状态转移;如果当前状态就是向上,那么重新计算upSpeed(就好像在原位置重新向上一次。);如果当前状态是向下,那么转化为向上。

SimpleBing类需要的实例变量:

0、private static final int WIDTH = 30; // 小鸟的宽
1、private static final int HEIGHT = 30;// 小鸟的高
2、private static final int UP_SPEED = 30;// 往上最多走的位移
3、private int x; // 标记位置的x
4、private int y; // 标记位置的y
5、State nowState; // 当前状态
6、DownState down; // 向下状态
7、UpState up; // 向上状态

action方法和beginUp方法的实现,就比较简单了。

    public void action()
{
nowState.move();
if (this.getY() < 0)
this.setY(0);
} public void beginUp()
{
up.setInit(UP_SPEED);
nowState = up;
}

最后是该类的全部代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*; public interface Bing {
public void beginUp();
public void action();
public int getX();
public int getY();
public void setX(int x);
public void setY(int y);
public int getWidth();
public int getHeight();
} interface State {
public void move();
public void changeState();
public void setInit(int speed);
} class DownState implements State {
SimpleBing bing;
private static final int DOWN_SPEED = 3;
private int downSpeed = 3; DownState(SimpleBing bing)
{
this.bing = bing;
} public void move()
{
bing.setY(bing.getY() + downSpeed);
//downSpeed ++;
//if (downSpeed > DOWN_SPEED)
//downSpeed = DOWN_SPEED;
} public void changeState()
{
bing.setState(bing.getUpState());
} public void setInit(int speed)
{
this.downSpeed = speed;
}
} class UpState implements State {
SimpleBing bing;
private int upSpeed = 30;
private static final int SPEED = 3;
private static final int DES = 1; UpState(SimpleBing bing)
{
this.bing = bing;
} public void move()
{
bing.setY(bing.getY() - SPEED);
upSpeed -= DES;
if (upSpeed <= 0)
this.changeState();
} public void changeState()
{
bing.setState(bing.getDownState());
//bing.getDownState().setInit(0);
} public void setInit(int speed)
{
this.upSpeed = speed;
}
} class SimpleBing extends JPanel implements Bing { private static final int WIDTH = 30;
private static final int HEIGHT = 30;
private static final int UP_SPEED = 30;
private int x;
private int y;
State nowState;
DownState down;
UpState up;
SimpleBing(int x,int y)
{
this.x = x;
this.y = y;
down = new DownState(this);
up = new UpState(this);
nowState = down;
//nowState.setInit(0);
} public void setState(State state)
{
nowState = state;
} public void action()
{
nowState.move();
if (this.getY() < 0)
this.setY(0);
} public void beginUp()
{
up.setInit(UP_SPEED);
nowState = up;
} public State getDownState()
{
return down;
} public State getUpState()
{
return up;
} public int getX()
{
return x;
} public int getY()
{
return y;
} public void setX(int x)
{
this.x = x;
} public void setY(int y)
{
this.y = y;
} public int getWidth()
{
return WIDTH;
} public int getHeight()
{
return HEIGHT;
}
}

【原创】纯OO:从设计到编码写一个FlappyBird (三)的更多相关文章

  1. 【原创】纯OO:从设计到编码写一个FlappyBird (一)

    说起来,自学计算机也有2年多的时间了,自己还没有从设计到编码,完完整整的设计一个基于面向对象的软件的经历..囧 于是,就有了这个系列.首先选用的语言是Java,没别的原因,HeadFirst设计模式是 ...

  2. 【原创】纯OO:从设计到编码写一个FlappyBird (六)

    第五部分请看这里 终于到了最后一个部分了! 这里使用SimpleJudge类来实现Judge接口. 首先是SimpleJudge需要的实例变量: 0.final LinkedList<Pilla ...

  3. 【原创】纯OO:从设计到编码写一个FlappyBird (五)

    第四部分请点这里 本文将实现DrawBoard. 如前文所述,Obstacle类和Bing类仅仅提供给DrawBoard必要的信息,如何绘制则完全委托给了DrawBoard,也就是说游戏关键类的细节和 ...

  4. 【原创】纯OO:从设计到编码写一个FlappyBird (四)

    第三部分请点这里 这里来实现Obstacle类.其实flappybird的本质就是小鸟原地掉,然后几根柱子在走.这也是在Game类里,用obs.move()来实现游戏逻辑的原因. 我们首先必须确定几个 ...

  5. 【原创】纯OO:从设计到编码写一个FlappyBird (二)

    第一部分请点这里. 续结前文,本文将实现Game类. 首先是实例变量.由上次的类图可以看出,Game类首先得具有如下实例变量: 0.Judge judge;1.SimpleDraw draw; // ...

  6. Qt 利用XML文档,写一个程序集合 三

    接上一篇https://www.cnblogs.com/DreamDog/p/9214052.html 滚动区域实现, 滚动区域可以三成分层 第一层,显示内容 中间层,滚动层 第三层,爸爸层 把我们要 ...

  7. 后端开发实践系列之二——领域驱动设计(DDD)编码实践

    Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there are f ...

  8. 领域驱动设计(DDD)编码实践

    写在前面 Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there ...

  9. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

随机推荐

  1. delphi 文件的读取(二进制文件和文本文件)

    http://blog.csdn.net/earbao/article/details/9174033

  2. sql,nosql

    1. 关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库. 关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成 ...

  3. 获取Jenkins project build结果

    当Jenkins管理的build project越来越多的时候,须要脚本收集每一个project的近期一次build结果,从而集中管理.依据业务规则,决定是否重算和何时重算. 以下的命令是利用curl ...

  4. 【Cocos2d-X开发学习笔记】第01期:PC开发环境的详细搭建

    本文使用的是cocos2d-x-2.1.4版本 ,截至目前为止是最新稳定版 所谓的开发环境就是制作游戏的地方,打个比方读者就会十分清楚了.比如提到做饭,人们都会想到厨房.这是 因为厨房有炉灶.烟机.水 ...

  5. STL__queue_的应用

    转:http://hi.baidu.com/xiaotiandm/item/bda34511cf9e99098fbde41a 调用的时候要有头文件: #include<stdlib.h> ...

  6. adnroid仿miui的dialog

    先来看下效果图: 当中show和dismiss的时候有动画效果. 原先试过使用PopupWindow来做,可是使用的时候不是那么舒服,毕竟不是dialog嘛. 所以这次尝试还是使用dialog来做 , ...

  7. 由“Jasperrpeorts 4.1.2升级到5.1.2对flex项目的解析”到AS3 带命名空间的XML的操作

    原文同步至:http://www.waylau.com/from-jasperrpeorts-4-1-2-upgraded-to-5-1-2-parsing-of-flex-projects-to-t ...

  8. [linux]chown和chmod命令

    chown chown命令是将指定文件的拥有者改为指定的用户或组 例如: chown mail:mail test.log,把test文件指定拥有者和组都为mail chown -R mail:mai ...

  9. TextView中如何支持html标签,放置图片和动作标签

    TextView文本框和输入框几乎是一个正常的带界面的可交互的Android应用的基本组成 TextView主要作用是显示文本内容,其实还可以显示图片,当然有必要的话还可以为文本内容添加动作相应用户的 ...

  10. 2 WAN 和1 Evo/3g Routeros PCC 方法负载平衡

    陕西中际现代包装科技:Routeros  2 WAN 和1 Evo/3g PCC 方法负载平衡 (Routeros多线负载平衡) 我们将要讨论2Wan和1个Evo/3G 的负载平衡.负载平衡就是在不同 ...