分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!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 ...{

孔丘仲尼先生曾经曰过“ 斋必变食,居必迁坐。食不厌精,脍不厌细”,被捧上天的圣人尚且如此,游戏中的角色更不例外,在ACT游戏中举凡加分、恢复体力、发动必杀技种种,都离不开“食物”的伟大功绩。
我们大家都知道,在典型的平面2D ACT游戏中,是使用层级的概念来描绘整个画面的,最底层的背景一般不参与游戏进程,而由再上一级的前景来承载角色及限制角色活动区域。所有置于前景之上的本质上都是活动精灵,只是扮演的角色不同,才会发生不同的作用与效果。
比如,在本例中我将Sprite抽象出来,而由Role及Food分别继承,他们的命运就变成了吃与被吃的关系……
代码如下:
Sprite.java


























































































































































Food.java







































Role.java











































































































