本文共 4321 字,大约阅读时间需要 14 分钟。
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!
效果图如下:
孔丘仲尼先生曾经曰过“
斋必变食,居必迁坐。食不厌精,脍不厌细”,被捧上天的圣人尚且如此,游戏中的角色更不例外,在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 ...{