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 + -
显示快捷键?