分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
效果图如下:
孔丘仲尼先生曾经曰过“ 斋必变食,居必迁坐。食不厌精,脍不厌细”,被捧上天的圣人尚且如此,游戏中的角色更不例外,在ACT游戏中举凡加分、恢复体力、发动必杀技种种,都离不开“食物”的伟大功绩。
我们大家都知道,在典型的平面2D ACT游戏中,是使用层级的概念来描绘整个画面的,最底层的背景一般不参与游戏进程,而由再上一级的前景来承载角色及限制角色活动区域。所有置于前景之上的本质上都是活动精灵,只是扮演的角色不同,才会发生不同的作用与效果。
比如,在本例中我将Sprite抽象出来,而由Role及Food分别继承,他们的命运就变成了吃与被吃的关系……
代码如下:
Sprite.java
Food.java
Role.java
孔丘仲尼先生曾经曰过“ 斋必变食,居必迁坐。食不厌精,脍不厌细”,被捧上天的圣人尚且如此,游戏中的角色更不例外,在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();
}
}
}
}
}
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() ...{
}
}
/** */ /**
* <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 ...{
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 ...{