added player-node, fixed weaponProjectileControl, added star

This commit is contained in:
Raybz@Raybz 2013-06-21 12:48:46 +02:00
parent a056861e75
commit 63902a9143
5 changed files with 234 additions and 70 deletions

View File

@ -36,7 +36,7 @@ public class PlayerCamControl extends BaseControl {
@Override @Override
public void update(float tpf) { public void update(float tpf) {
if (spatial.getUserData(UserDataKeys.RUNNING)) { if (spatial.getUserData(UserDataKeys.RUNNING)) {
camera.setLocation(spatial.getLocalTranslation()); camera.setLocation(spatial.getLocalTranslation().add(10f,10f,10f));
camera.setRotation(spatial.getLocalRotation()); camera.setRotation(spatial.getLocalRotation());
} }
} }

View File

@ -16,13 +16,6 @@
*/ */
package org.wyrez.shootingstars.controls; package org.wyrez.shootingstars.controls;
import com.jme3.asset.AssetManager;
import com.jme3.input.InputManager;
import com.jme3.input.KeyInput;
import com.jme3.input.MouseInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.math.Quaternion; import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.scene.Node; import com.jme3.scene.Node;
@ -34,18 +27,16 @@ import org.wyrez.shootingstars.helper.UserDataKeys;
* *
* @author Snowsun * @author Snowsun
*/ */
public class WeaponProjectileControl extends BaseControl implements ActionListener { public class WeaponProjectileControl extends BaseControl {
private AssetManager assetManager;
private Node rootNode; private Node rootNode;
private InputManager inputManager;
private Spatial player; private Spatial player;
private boolean isVisible;
public WeaponProjectileControl(AssetManager assetManager, Node rootNode, InputManager inputManager) { public WeaponProjectileControl(Node rootNode, Spatial player) {
this.assetManager = assetManager;
this.rootNode = rootNode; this.rootNode = rootNode;
this.inputManager = inputManager; this.player = player;
initMappings(); this.isVisible = false;
} }
@Override @Override
@ -56,55 +47,40 @@ public class WeaponProjectileControl extends BaseControl implements ActionListen
@Override @Override
protected void controlUpdate(float tpf) { protected void controlUpdate(float tpf) {
if (player.getUserData(UserDataKeys.SHOOTING)) { if (player.getUserData(UserDataKeys.SHOOTING)) {
shoot(); if (!isVisible) {
spatial.setCullHint(Spatial.CullHint.Never);
isVisible = true;
}
// shoot();
} else { } else {
rootNode.detachChild(spatial); if (isVisible) {
spatial.setCullHint(Spatial.CullHint.Always);
isVisible = false;
}
} }
} }
public Control cloneForSpatial(Spatial spatial) { public Control cloneForSpatial(Spatial spatial) {
WeaponProjectileControl control = new WeaponProjectileControl(assetManager, rootNode, inputManager); WeaponProjectileControl control = new WeaponProjectileControl(rootNode, player);
spatial.addControl(control); spatial.addControl(control);
return control; return control;
} }
public void onAction(String name, boolean isPressed, float tpf) {
if (name.equals("PLAYER_Mouse_Left_Click") && isPressed) {
rootNode.attachChild(spatial);
} else if (name.equals("PLAYER_Mouse_Left_Click") && !isPressed) {
rootNode.detachChild(spatial);
}
}
public void setPlayer(Spatial player) {
this.player = player;
}
public Spatial getPlayer() {
return this.player;
}
private void initMappings() {
inputManager.addMapping("PLAYER_Mouse_Left_Click", new MouseButtonTrigger(MouseInput.BUTTON_LEFT),
new KeyTrigger(KeyInput.KEY_DOWN));
inputManager.addListener(this, new String[]{"PLAYER_Mouse_Left_Click"});
}
/* /*
* Fires a projectile * Fires a projectile
*/ */
private void shoot() { // private void shoot() {
spatial.setLocalTranslation(player.getLocalTranslation().add(0, 0, -4)); // spatial.setLocalTranslation(player.getLocalTranslation().add(0, 0, -4));
//
Vector3f vectorDifference = new Vector3f(player.getLocalTranslation().subtract(player.getWorldTranslation())); // Vector3f vectorDifference = new Vector3f(player.getLocalTranslation().subtract(player.getWorldTranslation()));
spatial.setLocalTranslation(vectorDifference.addLocal(player.getLocalTranslation())); // spatial.setLocalTranslation(vectorDifference.addLocal(player.getLocalTranslation()));
//
Quaternion worldDiff = new Quaternion(player.getLocalRotation().subtract(player.getWorldRotation())); // Quaternion worldDiff = new Quaternion(player.getLocalRotation().subtract(player.getWorldRotation()));
spatial.setLocalRotation(worldDiff.addLocal(player.getLocalRotation())); // spatial.setLocalRotation(worldDiff.addLocal(player.getLocalRotation()));
//
spatial.move(player.getLocalRotation().getRotationColumn(2).mult(-3.5f)); // spatial.move(player.getLocalRotation().getRotationColumn(2).mult(3.5f));
// spatial.move(player.getLocalRotation().getRotationColumn(1).mult(0f)); // spatial.move(player.getLocalRotation().getRotationColumn(1).mult(0.1f));
// spatial.move(player.getLocalRotation().getRotationColumn(0).mult(0)); // spatial.move(player.getLocalRotation().getRotationColumn(0).mult(0.1f));
// spatial.rotate(0f, FastMath.PI, 0); //// spatial.rotate(0f, FastMath.PI, 0);
} // }
} }

View File

@ -0,0 +1,89 @@
/*
* Copyright (C) 2013 Darth Affe <http://wyrez.org> and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.wyrez.shootingstars.game;
import com.jme3.asset.AssetManager;
import com.jme3.input.InputManager;
import com.jme3.light.AmbientLight;
import com.jme3.math.ColorRGBA;
import com.jme3.renderer.Camera;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;
import org.wyrez.shootingstars.controls.PlayerCamControl;
import org.wyrez.shootingstars.controls.PlayerMouseControl;
import org.wyrez.shootingstars.controls.PlayerMoveControl;
import org.wyrez.shootingstars.controls.PlayerShootControl;
import org.wyrez.shootingstars.controls.WeaponProjectileControl;
import org.wyrez.shootingstars.data.AudioDataManager;
import org.wyrez.shootingstars.factories.Materials;
import org.wyrez.shootingstars.gui.GameGUI;
import org.wyrez.shootingstars.helper.UserDataKeys;
import org.wyrez.shootingstars.states.StateManager;
/**
*
* @author Darth Affe
*/
public class Player extends Node {
private Spatial weapon;
private Spatial projectile;
public Player(Node rootNode, StateManager stateManager, AssetManager assetManager,
ViewPort viewPort, GameGUI gui, InputManager inputManager, Camera camera,
AudioDataManager audioDataManager) {
super("Player");
initPlayer(inputManager, camera, audioDataManager, gui);
//TODO implement
// initWeapon(assetManager);
// initProjectile(rootNode);
// addLight();
}
private void initPlayer(InputManager inputManager, Camera camera,
AudioDataManager audioDataManager, GameGUI gui) {
this.setUserData(UserDataKeys.RUNNING, false);
this.setUserData(UserDataKeys.SHOOTING, false);
this.addControl(new PlayerMouseControl(inputManager, camera));
this.addControl(new PlayerMoveControl(audioDataManager));
this.addControl(new PlayerShootControl(inputManager, gui));
this.addControl(new PlayerCamControl(camera));
}
private void initWeapon(AssetManager assetManager) {
weapon = assetManager.loadModel("Models/LaserGun.j3o");
weapon.move(10f, 0f, 0f);
this.attachChild(weapon);
}
private void initProjectile(Node rootNode) {
projectile = new Geometry("weapon", new Box(0.01f, 0.01f, 2f));
projectile.addControl(new WeaponProjectileControl(rootNode, this));
projectile.setMaterial(Materials.WEAPON.create());
this.attachChild(projectile);
}
private void addLight() {
AmbientLight ambient = new AmbientLight();
ambient.setColor(ColorRGBA.White);
this.addLight(ambient);
}
}

View File

@ -0,0 +1,111 @@
/*
* Copyright (C) 2013 Darth Affe <http://wyrez.org> and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.wyrez.shootingstars.mesh;
import com.jme3.math.FastMath;
import com.jme3.math.Vector3f;
import com.jme3.scene.Mesh;
import com.jme3.scene.VertexBuffer;
import com.jme3.util.BufferUtils;
/**
*
* @author Darth Affe
*/
public class Star extends Mesh {
private static final short[] GEOMETRY_INDICES_DATA = {
0, 1, 2,/**/ 0, 2, 3,/**/ 0, 3, 4,/**/ 0, 4, 5,/**/ 0, 5, 6,/**/ 0, 6, 7,/**/
0, 7, 8,/**/ 0, 8, 9,/**/ 0, 9, 10,/**/ 0, 10, 11,/**/ 0, 11, 12,/**/ 0, 12, 1,/**/
13, 2, 1,/**/ 13, 3, 2,/**/ 13, 4, 3,/**/ 13, 5, 4,/**/ 13, 6, 5,/**/ 13, 7, 6,/**/
13, 8, 7,/**/ 13, 9, 8,/**/ 13, 10, 9,/**/ 13, 11, 10,/**/ 13, 12, 11,/**/ 13, 1, 12};
//TODO fix
private static final float[] GEOMETRY_TEXTURE_DATA = {
0.5f, 0.5f, /**/ 0.5f, 0f,/**/ 0.75f, 0.25f,/**/ 1f, 0f,/**/ 0.75f, 0.5f,/**/ 1f, 1f,/**/ 0.75f, 0.75f,
1f, 0.5f,/**/ 0.25f, 0.75f,/**/ 0f, 1f,/**/ 0f, 0.5f,/**/ 0f, 0f,/**/ 0.25f, 0.25f,/**/ 0f, 0f
};
private Vector3f center;
private float radius;
private float height;
private float factor;
public Star(float radius, float height, float factor) {
this(Vector3f.ZERO, radius, height, factor);
}
public Star(Vector3f center, float radius, float height, float factor) {
super();
updateGeometry(center, radius, height, factor);
}
/**
* Empty constructor for serialization only. Do not use!
*/
public Star() {
super();
}
@Override
public Star clone() {
return new Star(center.clone(), radius, height, factor);
}
protected final void updateGeometry(Vector3f center, float radius, float height, float factor) {
this.center = center;
this.radius = radius;
this.height = height;
this.factor = factor;
updateGeometryIndices();
updateGeometryVertices();
updateGeometryTextures();
}
protected void updateGeometryIndices() {
if (getBuffer(VertexBuffer.Type.Index) == null) {
setBuffer(VertexBuffer.Type.Index, 3, BufferUtils.createShortBuffer(GEOMETRY_INDICES_DATA));
}
}
protected void updateGeometryTextures() {
if (getBuffer(VertexBuffer.Type.TexCoord) == null) {
setBuffer(VertexBuffer.Type.TexCoord, 2, BufferUtils.createFloatBuffer(GEOMETRY_TEXTURE_DATA));
}
}
protected void updateGeometryVertices() {
Vector3f[] vertices = computeVertices();
setBuffer(VertexBuffer.Type.Position, 3, BufferUtils.createFloatBuffer(vertices));
updateBound();
}
protected Vector3f[] computeVertices() {
Vector3f[] vertices = new Vector3f[14];
vertices[0] = new Vector3f(new Vector3f(center.x, center.y - (height / 2f), center.z));
vertices[13] = new Vector3f(new Vector3f(center.x, center.y + (height / 2f), center.z));;
//outer
for (int i = 0; i < 12; i += 2) {
vertices[i + 1] = new Vector3f(center.x + radius * FastMath.cos(i * FastMath.PI / 6),
center.y, (center.z + radius * FastMath.sin(i * FastMath.PI / 6)));
}
//inner
for (int i = 1; i < 12; i += 2) {
vertices[i + 1] = new Vector3f(center.x + (radius * factor) * FastMath.cos(i * FastMath.PI / 6),
center.y, (center.z + (radius * factor) * FastMath.sin(i * FastMath.PI / 6)));
}
return vertices;
}
}

View File

@ -41,6 +41,7 @@ import org.wyrez.shootingstars.factories.Materials;
import org.wyrez.shootingstars.game.Cinema; import org.wyrez.shootingstars.game.Cinema;
import org.wyrez.shootingstars.game.GameSettings; import org.wyrez.shootingstars.game.GameSettings;
import org.wyrez.shootingstars.game.Ground; import org.wyrez.shootingstars.game.Ground;
import org.wyrez.shootingstars.game.Player;
import org.wyrez.shootingstars.gui.GameGUI; import org.wyrez.shootingstars.gui.GameGUI;
import org.wyrez.shootingstars.gui.listener.GameListener; import org.wyrez.shootingstars.gui.listener.GameListener;
import org.wyrez.shootingstars.helper.UserDataKeys; import org.wyrez.shootingstars.helper.UserDataKeys;
@ -67,8 +68,7 @@ public class GameState extends AbstractAppState implements GameListener, ActionL
private GameGUI gui; private GameGUI gui;
private Cinema cinema; private Cinema cinema;
private Ground ground; private Ground ground;
private Spatial player; private Node player;
private Spatial weapon;
private boolean isRunning = false; private boolean isRunning = false;
public GameState(Node rootNode, Screen screen, StateManager stateManager, public GameState(Node rootNode, Screen screen, StateManager stateManager,
@ -111,18 +111,8 @@ public class GameState extends AbstractAppState implements GameListener, ActionL
} }
public void loadPlayer() { public void loadPlayer() {
player = new Geometry("player", new Box(Vector3f.ZERO, 1f, 1f, 1f)); //TODO start location? player = new Player(rootNode, stateManager, assetManager, viewPort, gui,
player.setMaterial(Materials.UNSHADED.create()); inputManager, camera, audioDataManager);
player.setUserData(UserDataKeys.RUNNING, false);
player.setUserData(UserDataKeys.SHOOTING, false);
player.addControl(new PlayerMouseControl(inputManager, camera));
player.addControl(new PlayerMoveControl(audioDataManager));
player.addControl(new PlayerShootControl(inputManager, gui));
player.addControl(new PlayerCamControl(camera));
weapon = new Geometry("weapon", new Box(0.01f, 0.01f, 2f));
weapon.addControl(new WeaponProjectileControl(rootNode, player));
weapon.setMaterial(Materials.WEAPON.create());
} }
private void setRunning(boolean running) { private void setRunning(boolean running) {
@ -142,7 +132,6 @@ public class GameState extends AbstractAppState implements GameListener, ActionL
rootNode.attachChild(cinema); rootNode.attachChild(cinema);
rootNode.attachChild(ground); rootNode.attachChild(ground);
rootNode.attachChild(player); rootNode.attachChild(player);
rootNode.attachChild(weapon);
gui.setWait(); gui.setWait();
gui.attach(); gui.attach();
} }
@ -150,7 +139,6 @@ public class GameState extends AbstractAppState implements GameListener, ActionL
@Override @Override
public void stateDetached(AppStateManager stateManager) { public void stateDetached(AppStateManager stateManager) {
gui.detach(); gui.detach();
rootNode.detachChild(weapon);
rootNode.detachChild(player); rootNode.detachChild(player);
rootNode.detachChild(ground); rootNode.detachChild(ground);
rootNode.detachChild(cinema); rootNode.detachChild(cinema);