⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 player.java.svn-base

📁 一个JAVA程序员的游戏
💻 SVN-BASE
字号:
/*
 * Player.java
 *
 * Created on 16. Dezember 2006, 18:35
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package kanjitori;

import com.jme.bounding.BoundingBox;
import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jme.renderer.ColorRGBA;
import com.jme.scene.CameraNode;
import com.jme.scene.Node;
import com.jme.scene.shape.Box;
import com.jme.system.DisplaySystem;
import java.awt.Point;
import java.util.List;
import kanjitori.event.BotKilledEventManager;
import kanjitori.event.AbstractEventManager;
import kanjitori.event.EntrySolvedEventManager;
import kanjitori.event.EventManager;
import kanjitori.event.ItemCollectedEventManager;
import kanjitori.event.Listener;
import kanjitori.event.PlayerHurtEventManager;
import kanjitori.event.PlayerRelocateEventManager;
import kanjitori.graphics.Thing;
import kanjitori.graphics.bot.Bot;
import kanjitori.graphics.hud.AbstractHud;
import kanjitori.graphics.hud.Hud;
import kanjitori.graphics.item.Item;
import kanjitori.lesson.Entry;
import kanjitori.map.Map;
import kanjitori.util.Boom;
import kanjitori.util.SkyboxProvider;

/**
 *
 * @author Pirx
 */
public class Player implements Thing {
    
    private static Player INSTANCE;

    private Node playerNode;
    private Node collisionNode;
    private CameraNode camNode;
    private Entry entry;
    private Map map;
    private int health = 100;
    private int teleporter = 0;
    private int defChange = 0;
    
    /** Creates a new instance of Player */
    public Player(Node rootNode, Map map) {
        this.map = map;
        INSTANCE = this;
        DisplaySystem display = DisplaySystem.getDisplaySystem();
        Camera cam = display.getRenderer().getCamera();
        cam.setFrustumPerspective(50.0f, (float) display.getWidth() / (float) display.getHeight(), 0.25f, 500);
        camNode = new CameraNode("camera", cam);
        camNode.updateWorldData( 0 );

        playerNode = new Node();
        rootNode.attachChild(playerNode);
        
        Box collisionBox = new Box("pbox", new Vector3f(), 0.5f, 0.5f, 0.5f);
        collisionBox.setCullMode(Box.CULL_ALWAYS);
        collisionBox.setModelBound(new BoundingBox());
        collisionBox.updateModelBound();
        collisionNode = new Node("collisionNode");
        collisionNode.attachChild(collisionBox);
                
        playerNode.attachChild(SkyboxProvider.getProvider().getSkybox(map.getSkyboxTextures()));
        playerNode.attachChild(camNode);
        playerNode.attachChild(collisionNode);
        
        Boom.setExplosion(playerNode, new ColorRGBA(0.5f, 0.3f, 0.3f, 0.8f), new ColorRGBA(1f, 0f, 0f, 0.4f), 15f, 20f, 50f, 80);
        
        relocate();
        AbstractHud.getHud().showHealth(health);
        AbstractHud.getHud().showTeleporters(teleporter);
        AbstractHud.getHud().showChange(defChange);
        
        ItemCollectedEventManager.getManager().register(new Listener<Item>(){
            public void notify(Item item) {
                itemCollected(item);
            }
        });
        PlayerHurtEventManager.getManager().register(new Listener<Bot>(){
            public void notify(Bot bot) {
                playerHurt(bot);
            }
        });
        BotKilledEventManager.getManager().register(new Listener<Bot>(){
            public void notify(Bot bot) {
                botKilled();
            }
        });
    }
    
    public Entry getEntry() {
        return entry;
    }
    
    public void setEntry(Entry entry) {
        this.entry = entry;
        Hud hud = AbstractHud.getHud();
        if (hud != null) {
            hud.showDefinition(entry.getKey());
        }
    }
    
    public CameraNode getCamNode() {
        return camNode;
    }
    
    public Node getCollisionNode() {
        return collisionNode;
    }
    
    private void relocate() {
       Point freePos = map.findFreePos();
       Vector3f position = new Vector3f(freePos.x*2, 0, freePos.y*2);
       playerNode.setLocalTranslation(position);
       playerNode.updateWorldVectors();
       playerNode.updateRenderState();
       PlayerRelocateEventManager.getManager().fireEvent(this);
       Boom.explode(playerNode);
    }
    
    private void die() {
        Main.getMain().die();
    }
    
    public void itemCollected(Item item) {
        switch (item.getType()) {
            case HEALTH : changeHealth(5); break;
            case TELEPORT: changeTeleporters(1); break;
            case DEF_CHANGE: changeDef(1); break;
        }
    }

    public void useItem(Item.Type type) {
        switch (type) {
            case TELEPORT: 
                if (teleporter > 0) {
                    changeTeleporters(-1); 
                    relocate();
                }    
                break;
            case DEF_CHANGE: 
                if (defChange > 0) {
                    if (entry.isDirty()) {
                        break;
                    }
                    Entry newEntry = entry;
                    List<Entry> activeEntries = Level.getLevel().getActiveEntries();
                    if (activeEntries.size() == 1) {
                        break;
                    }
                    changeDef(-1); 
                    while(newEntry.equals(entry)) {
                       newEntry = activeEntries.get(Level.RANDOM.nextInt(activeEntries.size()));
                    }
                    entry = newEntry;
                    AbstractHud.getHud().showDefinition(entry.getKey());
                }    
                break;
        }
    }    
    
    public void changeTeleporters(int amount) {
        teleporter += amount;
        if (teleporter > 3) {
            teleporter = 3;
        }
        if (teleporter < 0) {
            teleporter = 0;
        }
        AbstractHud.getHud().showTeleporters(teleporter);
    }
    
    public void changeDef(int amount) {
        defChange += amount;
        if (defChange > 3) {
            defChange = 3;
        }
        if (defChange < 0) {
            defChange = 0;
        }
        AbstractHud.getHud().showChange(defChange);
    }    
    
    public void changeHealth(int amount) {
        health += amount;
        if (health > 100) {
            health = 100;
        }
        if (health < 0) {
            die();
        } 
        AbstractHud.getHud().showHealth(health);
    }
    
    private void playerHurt(Bot bot) {
        changeHealth(-15);
        if (health >= 0) {
           relocate();
        }
    }
    
    private void botKilled() {
        changeHealth(2);
    }
    
    public void entrySolved() {
        setEntry(Level.getLevel().getNextEntry());
    }
    
    public static Player getPlayer() {
        return INSTANCE;
    }

    public Node getNode() {
        return playerNode;
    }

    public boolean checkPlayerCollision() {
        return false;
    }
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -