botcontroller.java
来自「一个JAVA程序员的游戏」· Java 代码 · 共 126 行
JAVA
126 行
/*
* BotController.java
*
* Created on 16. Dezember 2006, 17:15
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package kanjitori.graphics.bot;
import com.jme.animation.SpatialTransformer;
import com.jme.math.Vector3f;
import com.jme.scene.Controller;
import com.jme.scene.Node;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import kanjitori.event.EntrySolvedEventManager;
import kanjitori.lesson.Entry;
import kanjitori.event.BotKilledEventManager;
import kanjitori.event.PlayerHurtEventManager;
import kanjitori.util.Randomizer;
import kanjitori.graphics.bot.Bot;
import kanjitori.map.Content;
import kanjitori.map.Map;
import kanjitori.Player;
/**
*
* @author Pirx
*/
public class BotController extends Controller {
//private final static Random RANDOM = new Random();
private final static Point[] DIRS = new Point[]
{ new Point(1, 0), new Point(-1, 0), new Point(0, 1), new Point(0, -1)};
private Point oldDir = DIRS[0];
private Map levelMap;
private Point oldPos;
private Point newPos;
private Bot bot;
private SpatialTransformer st;
/** Creates a new instance of BotController */
public BotController(Bot bot, Map levelMap) {
this.levelMap = levelMap;
this.bot = bot;
newPos = levelMap.findFreePos();
oldPos = newPos;
levelMap.setContent(newPos.x, newPos.y, Content.BOT);
}
public void update(float time) {
if (bot.checkPlayerCollision()) {
collide();
}
if (st == null || st.getCurTime() == 1) {
if (st == null) {
bot.getNode().setLocalTranslation(new Vector3f(2 * oldPos.x, 0, 2 * oldPos.y));
st = new SpatialTransformer(1);
st.setObject(bot.getNode(), 0, -1);
st.setRepeatType(Controller.RT_CLAMP);
bot.getNode().addController(st);
} else {
levelMap.setContent(oldPos.x, oldPos.y, Content.EMPTY);
}
Point newDirection = findFreeDirection(newPos, oldDir);
if (newDirection == null) {
return;
}
oldPos = newPos;
newPos = new Point(newPos.x + newDirection.x,
newPos.y + newDirection.y);
oldDir = newDirection;
levelMap.setContent(newPos.x, newPos.y, Content.BOT);
Vector3f newVector = new Vector3f(2 * newPos.x, 0, 2 * newPos.y);
st.setPosition(0, 0, bot.getNode().getLocalTranslation());
st.setPosition(0, 1, newVector);
st.setNewAnimationTimes(0, 1);
st.setCurTime(0);
st.interpolateMissing();
}
}
public void collide() {
Entry playerEntry = Player.getPlayer().getEntry();
if (playerEntry == null || ! playerEntry.accept(bot.getValue())) {
PlayerHurtEventManager.getManager().fireEvent(bot);
} else {
st.setActive(false);
bot.getNode().removeController(st);
bot.getNode().removeController(this);
bot.die();
BotKilledEventManager.getManager().fireEvent(bot);
if (playerEntry.isSolved()) {
EntrySolvedEventManager.getManager().fireEvent(playerEntry);
}
}
}
public Point findFreeDirection(Point point, Point direction) {
Randomizer<Point> rand = new Randomizer<Point>();
for (int i = 0; i < 4; i++) {
int x = point.x + DIRS[i].x;
int y = point.y + DIRS[i].y;
if (! levelMap.isValidPos(x, y) || levelMap.getContent(x, y) != Content.EMPTY) {
continue;
}
rand.add(DIRS[i], DIRS[i].equals(direction) ? 4 : 1);
}
return rand.size() == 0 ? null : rand.get();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?