Java来做马里奥 2 —食不厌精

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

                效果图如下:


孔丘仲尼先生曾经曰过“ 斋必变食,居必迁坐。食不厌精,脍不厌细”,被捧上天的圣人尚且如此,游戏中的角色更不例外,在ACT游戏中举凡加分、恢复体力、发动必杀技种种,都离不开“食物”的伟大功绩。

我们大家都知道,在典型的平面2D ACT游戏中,是使用层级的概念来描绘整个画面的,最底层的背景一般不参与游戏进程,而由再上一级的前景来承载角色及限制角色活动区域。所有置于前景之上的本质上都是活动精灵,只是扮演的角色不同,才会发生不同的作用与效果。

比如,在本例中我将Sprite抽象出来,而由Role及Food分别继承,他们的命运就变成了吃与被吃的关系……

代码如下:

Sprite.java
package  org.test.mario;

import  java.awt.Graphics;
import  java.awt.Image;
import  java.awt.Rectangle;

import  org.loon.framework.game.image.Bitmap;

/** */ /**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:精灵类(为了批量制造角色,将Role中通用设定抽象成此类)
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * <p>
 * License: http://www.apache.org/licenses/LICENSE-2.0
 * </p>
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */

public   abstract   class  Sprite  ... {
    // 坐标
    protected double _x;

    protected double _y;

    // 宽
    protected int width;

    // 高
    protected int height;

    // 图像
    protected Image _image;

    // 步数
    protected int _count;

    // 地图
    protected Map _map;

    /** *//**
     * 构造函数,以角色图位置,初始的x、y坐标,地图四项参数创建一个可用的角色
     *  
     * @param fileName
     * @param _x
     * @param _y
     * @param map
     */

    public Sprite(String fileName,double _x, double _y, Map map) ...{
        this._x = _x;
        this._y = _y;
        this._map = map;

        width = 32;
        height = 32;

        loadImage(fileName);

        _count = 0;

        AnimationThread thread = new AnimationThread();
        thread.start();
    }


    public abstract void update();

    public void draw(Graphics g, int offsetX, int offsetY) ...{
        g.drawImage(_image, (int) _x + offsetX, (int) _y + offsetY, (int) _x
                + offsetX + width, (int) _y + offsetY + height, _count * width,
                0, _count * width + width, height, null);
    }


    public boolean isHit(Sprite sprite) ...{
        Rectangle playerRect = new Rectangle((int) _x, (int) _y, width, height);
        Rectangle spriteRect = new Rectangle((int) sprite.getX(), (int) sprite
                .getY(), sprite.getWidth(), sprite.getHeight());
        // 判定两者边框是否相交
        if (playerRect.intersects(spriteRect)) ...{
            return true;
        }


        return false;
    }


    public double getX() ...{
        return _x;
    }


    public double getY() ...{
        return _y;
    }


    public int getWidth() ...{
        return width;
    }


    public int getHeight() ...{
        return height;
    }


    private void loadImage(String filename) ...{
        _image = new Bitmap(filename).getImage();
    }


    private class AnimationThread extends Thread ...{
        public void run() ...{
            while (true) ...{
                // 换算步数
                if (_count == 0) ...{
                    _count = 1;
                }
 else if (_count == 1) ...{
                    _count = 0;
                }

                // 动作更替延迟
                try ...{
                    Thread.sleep(300);
                }
 catch (InterruptedException e) ...{
                    e.printStackTrace();
                }

            }

        }

    }


}


Food.java
package  org.test.mario;

/** */ /**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:兵粮丸
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * <p>
 * License: http://www.apache.org/licenses/LICENSE-2.0
 * </p>
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */

public   class  Food  extends  Sprite  ... {

    public Food(String fileName, double x, double y, Map map) ...{
        super(fileName, x, y, map);
    }


    public void update() ...{
        
    }


}


Role.java
package  org.test.mario;

import  java.awt.Graphics;
import  java.awt.Point;


/** */ /**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:角色描述及绘制用类
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */

public   class  Role  extends  Sprite ... {



    private double _vx;

    private double _vy;

    private boolean isFlat;

    private int _dir;

    final static public int WIDTH = 40;

    final static public int HEIGHT = 40;

    final static private int SPEED = 6;

    final static private int JUMP_SPEED = 16;

    final static private int RIGHT = 0;

    final static private int LEFT = 1;

    /** *//**
     * 构造函数,以角色图位置,初始的x、y坐标,地图四项参数创建一个可用的角色
     * 
     * @param filename
     * @param x
     * @param y
     * @param map
     */

    public Role(String filename,double x, double y, Map map) ...{
        super(filename,x, y, map);
        _vx = 0;
        _vy = 0;
        isFlat = false;
        _dir = RIGHT;
    }


    public void stop() ...{
        _vx = 0;
    }


    public void left() ...{
        _vx = -SPEED;
        _dir = LEFT;
    }


    public void right() ...{
        _vx = SPEED;
        _dir = RIGHT;
    }


    public void jump() ...{
        if (isFlat) ...{
            _vy = -JUMP_SPEED;
            isFlat = false;
        }

    }


    public void update() ...{
        //0.6为允许跳跃的高度限制,反值效果
        _vy += 0.6;

        double newX = _x + _vx;

        Point tile = _map.getTileHit(this, newX, _y);
        if (tile == null) ...{
            _x = newX;
        }
 else ...{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值