/* * Copyright (c) 2009-2012 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'jMonkeyEngine' nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package jme3test.input.combomoves; import com.jme3.app.SimpleApplication; import com.jme3.font.BitmapText; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.math.ColorRGBA; import java.util.ArrayList; import java.util.HashSet; import java.util.List; public class TestComboMoves extends SimpleApplication implements ActionListener { private HashSet<String> pressedMappings = new HashSet<String>(); private ComboMove fireball; private ComboMoveExecution fireballExec; private BitmapText fireballText; private ComboMove shuriken; private ComboMoveExecution shurikenExec; private BitmapText shurikenText; private ComboMove jab; private ComboMoveExecution jabExec; private BitmapText jabText; private ComboMove punch; private ComboMoveExecution punchExec; private BitmapText punchText; private ComboMove currentMove = null; private float currentMoveCastTime = 0; private float time = 0; public static void main(String[] args){ TestComboMoves app = new TestComboMoves(); app.start(); } @Override public void simpleInitApp() { setDisplayFps(false); setDisplayStatView(false); // Create debug text BitmapText helpText = new BitmapText(guiFont); helpText.setLocalTranslation(0, settings.getHeight(), 0); helpText.setText("Moves:\n" + "Fireball: Down, Down+Right, Right\n"+ "Shuriken: Left, Down, Attack1(Z)\n"+ "Jab: Attack1(Z)\n"+ "Punch: Attack1(Z), Attack1(Z)\n"); guiNode.attachChild(helpText); fireballText = new BitmapText(guiFont); fireballText.setColor(ColorRGBA.Orange); fireballText.setLocalTranslation(0, fireballText.getLineHeight(), 0); guiNode.attachChild(fireballText); shurikenText = new BitmapText(guiFont); shurikenText.setColor(ColorRGBA.Cyan); shurikenText.setLocalTranslation(0, shurikenText.getLineHeight()*2f, 0); guiNode.attachChild(shurikenText); jabText = new BitmapText(guiFont); jabText.setColor(ColorRGBA.Red); jabText.setLocalTranslation(0, jabText.getLineHeight()*3f, 0); guiNode.attachChild(jabText); punchText = new BitmapText(guiFont); punchText.setColor(ColorRGBA.Green); punchText.setLocalTranslation(0, punchText.getLineHeight()*4f, 0); guiNode.attachChild(punchText); inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_LEFT)); inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_RIGHT)); inputManager.addMapping("Up", new KeyTrigger(KeyInput.KEY_UP)); inputManager.addMapping("Down", new KeyTrigger(KeyInput.KEY_DOWN)); inputManager.addMapping("Attack1", new KeyTrigger(KeyInput.KEY_Z)); inputManager.addListener(this, "Left", "Right", "Up", "Down", "Attack1"); fireball = new ComboMove("Fireball"); fireball.press("Down").notPress("Right").done(); fireball.press("Right", "Down").done(); fireball.press("Right").notPress("Down").done(); fireball.notPress("Right", "Down").done(); fireball.setUseFinalState(false); // no waiting on final state shuriken = new ComboMove("Shuriken"); shuriken.press("Left").notPress("Down", "Attack1").done(); shuriken.press("Down").notPress("Attack1").timeElapsed(0.11f).done(); shuriken.press("Attack1").notPress("Left").timeElapsed(0.11f).done(); shuriken.notPress("Left", "Down", "Attack1").done(); jab = new ComboMove("Jab"); jab.setPriority(0.5f); // make jab less important than other moves jab.press("Attack1").done(); punch = new ComboMove("Punch"); punch.press("Attack1").done(); punch.notPress("Attack1").done(); punch.press("Attack1").done(); fireballExec = new ComboMoveExecution(fireball); shurikenExec = new ComboMoveExecution(shuriken); jabExec = new ComboMoveExecution(jab); punchExec = new ComboMoveExecution(punch); } @Override public void simpleUpdate(float tpf){ time += tpf; // check every frame if any executions are expired shurikenExec.updateExpiration(time); shurikenText.setText("Shuriken Exec: " + shurikenExec.getDebugString()); fireballExec.updateExpiration(time); fireballText.setText("Fireball Exec: " + fireballExec.getDebugString()); jabExec.updateExpiration(time); jabText.setText("Jab Exec: " + jabExec.getDebugString()); punchExec.updateExpiration(time); punchText.setText("Punch Exec: " + punchExec.getDebugString()); if (currentMove != null){ currentMoveCastTime -= tpf; if (currentMoveCastTime <= 0){ System.out.println("DONE CASTING " + currentMove.getMoveName()); currentMoveCastTime = 0; currentMove = null; } } } public void onAction(String name, boolean isPressed, float tpf) { if (isPressed){ pressedMappings.add(name); }else{ pressedMappings.remove(name); } // the pressed mappings was changed. update combo executions List<ComboMove> invokedMoves = new ArrayList<ComboMove>(); if (shurikenExec.updateState(pressedMappings, time)){ invokedMoves.add(shuriken); } if (fireballExec.updateState(pressedMappings, time)){ invokedMoves.add(fireball); } if (jabExec.updateState(pressedMappings, time)){ invokedMoves.add(jab); } if (punchExec.updateState(pressedMappings, time)){ invokedMoves.add(punch); } if (invokedMoves.size() > 0){ // choose move with highest priority float priority = 0; ComboMove toExec = null; for (ComboMove move : invokedMoves){ if (move.getPriority() > priority){ priority = move.getPriority(); toExec = move; } } if (currentMove != null && currentMove.getPriority() > toExec.getPriority()){ return; } currentMove = toExec; currentMoveCastTime = currentMove.getCastTime(); //System.out.println("CASTING " + currentMove.getMoveName()); } } }