第二部分请点这里

下面首先来实现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. OCA读书笔记(12) - 数据库维护

    查询优化器统计信息 搜集统计信息: 不是实时的: SQL> conn /as sysdbaConnected.SQL> grant select on dba_objects to sco ...

  2. listview改变选中行字体颜色

    [android]listview改变选中行字体颜色 目标:选中item,其字体设置为#3197FF,未选中的,其字体为#FFFFFF 与listvew设置选中行item背景图片一样,使用select ...

  3. 基于模糊Choquet积分的目标检测算法

    本文根据论文:Fuzzy Integral for Moving Object Detection-FUZZ-IEEE_2008的内容及自己的理解而成,如果想了解更多细节,请参考原文.在背景建模中,我 ...

  4. achieve aop through xml

    The main way to achive AOP is deploying a xml file. Now a xml file is presented to be a explanation ...

  5. hdu3622(二分+two-sat)

    传送门:Bomb Game 题意:给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围 ...

  6. Servlet:通过初始参数实现权限访问某个文件、页面

    目录结构 src 目录下com.xieyuan包MyServlet.java文件(Servlet文件) package com.xieyuan; import java.awt.Color; impo ...

  7. C#语言实现ArcGIS数据源重置之Set Data Source功能

    1.须要:依据选择的Mxd路径和目标数据源路径进行重置数据源.此处以(.Mdb为例): 主要利用到的接口: (1)IMapDocument    (2)IMapControl2     (3)IWor ...

  8. sqlserver安全加固

      sqlserver2012安装好以后必要的安全加固,不然非常多DBA的信息普通账户登录后都能够读取到.  --use [master] --GO --DENY VIEW SERVER STATE ...

  9. 使用MSPT实现二层冗余

  10. python面向对象具体解释(上)

    创建类 Python 类使用 class 关键字来创建.简单的类的声明能够是关键字后紧跟类名: class ClassName(bases): 'class documentation string' ...