第二部分请点这里

下面首先来实现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. wikioi 1014 装箱问题

    来源:http://wikioi.com/problem/1014/ 1014 装箱问题 29人推荐 收藏 发题解 提交代码 报错 题目描写叙述 输入描写叙述 输出描写叙述 例子输入 例子输出 提示 ...

  2. Android比较字符串是空的(isEmpty)

    通常情况下,我们需要去推断一个字符串变量是否为空,今天,我特意做了一个小测试 StringUtils.java: package com.yx.equipment_collection.utils; ...

  3. UVa-Palindromes

    题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. hdu1428之dfs+spfa

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. Spring整合Jms学习(三)_MessageConverter介绍

    1.4     消息转换器MessageConverter MessageConverter的作用主要有双方面,一方面它能够把我们的非标准化Message对象转换成我们的目标Message对象,这主要 ...

  6. SQL Server 2008备份数据库失败,拒绝访问的原因

    原文:SQL Server 2008备份数据库失败,拒绝访问的原因 备份数据到特定目录是出现拒绝访问,然后测试备份到C盘根目录正常. 查了下原因: 是因为那个目录没有Authenticated Use ...

  7. Nutch+HBase

    Nutch+HBase 当我们为nutch的架构发愁的时候,nutch的开发人员送来了nutchbase.我一些简单的测试表明,在hadoop0.20.1和hbase0.20.2上,稍加修改可以运行起 ...

  8. ORACLE 实验二

    实验二:数据操纵 实验学时:4学时 实验类型:综合型 实验要求:必修 一.实验目的 1.掌握SQL数据查询语句: 2.掌握SQL聚集函数的使用. 3.掌握SQL插入.改动.删除语句的使用. 二.实验内 ...

  9. Flash Android ANE打包之基本流程

    搭建环境这里就不详细说明了 一.Android本地库编写 1.从Flash Air SDK中提取需要的jar包 Android下需要的jar包在Flash Air SDK/lib/android目录下 ...

  10. 重写equals()与hashCode()方法

    出自:http://blog.csdn.net/renfufei/article/details/16339351 Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Oj ...