纯OO:从设计到编码写一个FlappyBird (二)

第一部分请点这里

 

续结前文,本文将实现Game类。

 

首先是实例变量。由上次的类图可以看出,Game类首先得具有如下实例变量:

0、Judge judge;
1、SimpleDraw draw; // 为什么不是接口类型?因为需要addMouseListener,而DrawBoard接口没有这个方法。。期待下一个版本的改进
2、Bing fang;
3、Obstacle obs;

 

我们需要控制游戏中帧变换的速度,因此,需要加入一个变量来标示速度:(帧变换的速度是什么?参见这篇文章

0、private static final int TIME = 10;

 

最后,我们还需要一个变量来标示得分:

0、private int score;

 

由于DrawBoard的实现类需要在发生鼠标事件时通知Game类,因此,Game类还应该实现MouseListener接口。

我们也需要一个setup方法,来初始化全部的变量。同时需要一个start方法来开始游戏,最后需要一个end方法来打印游戏结束后的得分。

 

接下来讲讲start方法和MousePressed方法的实现。

start方法:

    public void start()
    {
        int flag = 1;
        while (flag > 0)
        {
            fang.action();
            obs.move();
            flag = judge.isGameOver(fang,obs);
            if (flag == 2)
                score ++;
            draw.draw();
            try 
            {
                Thread.sleep(TIME);
            } catch (Exception e)
            {}
        }
    }

很简单,典型的游戏逻辑。judge接口实现的类提供一个判断游戏是否结束的方法,当其返回1时,没死,也没得分;当其返回2时,得分;当其返回0时,方sir就。。了

fang.action();让小鸟开始自己往下掉(摁一下就上升了)。obs.move();让障碍自己动起来,draw.draw();则是将更新后的图像重新画出来。那个try其实就是暂停下程序的运行而已。

 

然后是mousePressed方法:

    public void mousePressed(MouseEvent e) 
    {
        fang.beginUp();
    }

更加简单,也好理解。点一下方sir就飞啦 

 

Game类的全部代码:

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Game implements MouseListener {
    Judge judge;
    SimpleDraw draw;
    Bing fang;
    Obstacle obs;

    private static final int TIME = 10;
    private int score;
    
    public Game()
    {
        score = 0;
    }
    
    public static void main(String [] args)
    {
        Game game = new Game();
        game.setup();
        game.start();
        game.end();
    }
    
    public void setup()
    {
        JFrame frame = new JFrame();
        
        
        fang = new SimpleBing(200,200);
        obs  = new SimpleObstacle(600);
        judge = new SimpleJudge(fang,obs);
        draw = new SimpleDraw(fang,obs);
        
        frame.getContentPane().add(draw);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        draw.addMouseListener(this);
        frame.setSize(600,600);
        frame.setVisible(true);
    }
    
    public void start()
    {
        int flag = 1;
        while (flag > 0)
        {
            fang.action();
            obs.move();
            flag = judge.isGameOver(fang,obs);
            if (flag == 2)
                score ++;
            draw.draw();
            try 
            {
                Thread.sleep(TIME);
            } catch (Exception e)
            {}
        }
    }
    
    public void end()
    {
        System.out.println("Your score is " + score);
    }
    
    public void mouseClicked(MouseEvent e)
    {
    
    }
    
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) 
    {
        fang.beginUp();
    }
    public void mouseReleased(MouseEvent e) {}
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。