zoukankan      html  css  js  c++  java
  • 2017-2018-1 JaWorld 团队作业--冲刺2

    2017-2018-1 JaWorld 团队作业--冲刺2 (20162314)

    总体架构

    • 我们本次团队项目设定为基于Android系统Java架构下的打飞机小游戏

    • 游戏中所有模型的原型设定是精灵,因此不管是敌机还是战斗机都是精灵类,精灵类是所有类的父类

    • 精灵类(Sprite)下有三个子类,一个是战斗机类,也就是玩家;一个是走直线的精灵类(AutoSprite),也就是对敌机的统称;还有一个是爆炸类,指的是敌机或战斗机被摧毁。

    • 我所负责的是精灵类(Sprite)下的走直线的精灵类(AutoSprite)下的子弹类(Bullet)

    精灵类(Sprite)

    精灵类是所有其他用于绘制(frame)的类的基类。

    整个游戏界面是建立在一张巨大的位图(Bitmap)上的,它的长度和宽度是设定就好的,位图由像素构成,基于像素即可建立笛卡尔直角坐标系。因此战斗机开始,走过,被摧毁爆炸的位置就可以确定,我们通过战斗机走过的距离来为玩家记成绩。

    宽度变量是getWidth,高度是getHeight,x和y分别表示战斗机初始位置的横纵坐标,offsetX和offsetY分别表示战斗机爆炸时的位置的横纵坐标,由此可以计算出战斗机走过的总距离。

    其中,战斗机的横坐标x到位图x坐标中心点的距离显然是x减去宽度的一半,同理y也是减去高度的一半。

     public void centerTo(float centerX, float centerY) {
            float w = getWidth();
            float h = getHeight();
            x = centerX - w / 2;
            y = centerY - h / 2;
        }
    

    x是战斗机左边的长度,y是战斗机的高度,那么右边就是x加上宽度,到底部的长度就是y加上高度。

    public RectF getRectF() {
            float left = x;
            float top = y;
            float right = left + getWidth();
            float bottom = top + getHeight();
            RectF rectF = new RectF( left, top, right, bottom );
            return rectF;
        }
    

    有了java架构下的算法后,接下来的就是把背后的算法表现出来,也就是绘制出来,我们称画(draw)到布(Canvas)上。

    Draw需要三部分,游戏开始前的状态beforeDraw,游戏进行中的onDraw和游戏结束后的afterDraw。每部分都需要三要素布(Canvas),Paint(漆)和游戏视图(gameView)。

    public final void draw(Canvas canvas, Paint paint, GameView gameView) {
            frame++;
            beforeDraw( canvas, paint, gameView );
            onDraw( canvas, paint, gameView );
            afterDraw( canvas, paint, gameView );
        }
    

    onDraw需要三个判定条件以确定是在游戏中,战斗机未被摧毁(!destroyed,位图bitmap不为空null,可见状态getvisible)

    Draw将精灵Sprite绘制到布Canvas上。

    摧毁类包含敌机被摧毁和战斗机被摧毁,摧毁后则位图bitmap为空。

    public boolean isDestroyed() {
            return destroyed;
        }
    
        public int getFrame() {
            return frame;
        }
    

    走直线的精灵类(AutoSprite)

    敌机类,只能沿直线直上直下。

    其速度为每帧移动的像素数,敌机的速度设定为2,即每帧移动的像素数==2.

    战斗机的移动move量=速度speed*Time,Time=gameView。

    public class AutoISprite extends ISprite {
        //每帧移动的像素数,以向下为正
        private float speed = 2;
    
        public AutoISprite(Bitmap bitmap) {
            super( bitmap );
        }
    
        public void setSpeed(float speed) {
            this.speed = speed;
        }
    
        public float getSpeed() {
            return speed;
        }
    

    AutoSprite还内置了一个afterDraw的摧毁方法的扩充,isDestroyed检查Sprite是否超出了Canvas的范围,如果超出,则销毁Sprite。

    protected void afterDraw(Canvas canvas, Paint paint, GameView gameView) {
            if (!isDestroyed()) {
                //检查Sprite是否超出了Canvas的范围,如果超出,则销毁Sprite
                RectF canvasRecF = new RectF( 0, 0, canvas.getWidth(), canvas.getHeight() );
                RectF spriteRecF = getRectF();
                if (!RectF.intersects( canvasRecF, spriteRecF )) {
                    destroy();
    

    子弹类(Bullet)

    子弹是从下向上沿直线移动的。
    前面我们用从上往下的speed为正设定了精灵类的速度,因此从下向上的子弹的速度就是负的。
    负数表示子弹向上飞

    public class Bullet extends AutoISprite {
    
        public Bullet(Bitmap bitmap) {
            super( bitmap );
            setSpeed( -10 );//负数表示子弹向上飞
        }
    

    明日各个成员的任务安排

    • 陈是奇同学进行博客整理,王译潇同学和张师瑜同学帮其他同学查找相关资料以及提供建议,其余同学完成任务并将已完成的内容进行测试。
  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/Java1623/p/7989933.html
Copyright © 2011-2022 走看看