效果图如下:
在ACT类游戏中,你所扮演的角色时常会与各种杂兵发生这样或者那样的冲突,以此来增强游戏性。本回将例举一种Java游戏的杂兵制造方式。
在此例中将原来的
getTileHit改为注入Sprite,以此统一处理角色及杂兵的碰撞。
public Point getTileHit(Sprite sprite, double newX, double newY)
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() ...{
}

}

Sandaime.java(扮演杂兵的角色)
package org.test.mario;

import java.awt.Point;


/** *//**
* <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 Sandaime extends Sprite ...{

private static final double SPEED = 1;

private double _vx;

private double _vy;


public Sandaime(String filename, double x, double y, Map map) ...{

super(filename, x, y, map);
width = 80;
height = 75;
_vx = -SPEED;
_vy = 0;
}


public void update() ...{
_vy += 0.1;

double newX = _x + _vx;

Point tile = _map.getTileHit(this, newX, _y);

if (tile == null) ...{
_x = newX;

} else ...{

if (_vx > 0) ...{
_x = Map.tilesToPixels(tile.x) - width;

} else if (_vx < 0) ...{
_x = Map.tilesToPixels(tile.x + 1);
}
_vx = -_vx;
}

double newY = _y + _vy;
tile = _map.getTileHit(this, _x, newY);

if (tile == null) ...{
_y = newY;

} else ...{

if (_vy > 0) ...{
_y = Map.tilesToPixels(tile.y) - height;
_vy = 0;

} else if (_vy < 0) ...{
_y = Map.tilesToPixels(tile.y + 1);
_vy = 0;
}
}
}

}

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;

// 强制跳跃
private boolean _forceJump;

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);
width=40;
height=40;
_vx = 0;
_vy = 0;
_isFlat = false;
_forceJump = false;
_dir = RIGHT;
}


public void setJump(boolean forceJump) ...{
_forceJump = forceJump;
}


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


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


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


public void jump() ...{

if (_isFlat || _forceJump) ...{
_vy = -JUMP_SPEED;
_isFlat = false;
_forceJump = 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 ...{

if (_vx > 0) ...{
_x = Map.tilesToPixels(tile.x) - width;

} else if (_vx < 0) ...{
_x = Map.tilesToPixels(tile.x + 1);
}
_vx = 0;
}

double newY = _y + _vy;
tile = _map.getTileHit(this, _x, newY);

if (tile == null) ...{
_y = newY;
_isFlat = false;

} else ...{

if (_vy > 0) ...{
_y = Map.tilesToPixels(tile.y) - height;
_vy = 0;
_isFlat = true;

} else if (_vy < 0) ...{
_y = Map.tilesToPixels(tile.y + 1);
_vy = 0;
}
}
}


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,
_dir * height, _count * width + width, _dir * height + height,
null);
}
}

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;
