mirror of
https://github.com/Dejvino/roadtrip
synced 2024-12-22 11:48:49 +00:00
Added 1st person camera.
This commit is contained in:
parent
a4f17f414e
commit
66039dfa8e
@ -6,9 +6,9 @@ A game about a journey involving vehicles and obstacles.
|
|||||||
## Status
|
## Status
|
||||||
### DONE
|
### DONE
|
||||||
* Walking
|
* Walking
|
||||||
* Enter / Exit a car (Enter)
|
* Enter / Exit a car (key: Enter)
|
||||||
* Driving
|
* Driving
|
||||||
* Keyboard controls (WASDX)
|
* Keyboard controls (keys: WASDX)
|
||||||
* Physics-based vehicles
|
* Physics-based vehicles
|
||||||
* 1 model, 2 debugs
|
* 1 model, 2 debugs
|
||||||
* Map
|
* Map
|
||||||
@ -25,7 +25,7 @@ A game about a journey involving vehicles and obstacles.
|
|||||||
* Wheel slips
|
* Wheel slips
|
||||||
* Graphics
|
* Graphics
|
||||||
* themeless
|
* themeless
|
||||||
* 3rd person view (following the player)
|
* 1st & 3rd person view (key: V)
|
||||||
* depth-of-field filter
|
* depth-of-field filter
|
||||||
* distance-based hiding of objects
|
* distance-based hiding of objects
|
||||||
* Input
|
* Input
|
||||||
@ -38,7 +38,6 @@ A game about a journey involving vehicles and obstacles.
|
|||||||
|
|
||||||
#### Stage 1 :: Core Game
|
#### Stage 1 :: Core Game
|
||||||
* Joystick controls
|
* Joystick controls
|
||||||
* FPV camera
|
|
||||||
* Main Menu
|
* Main Menu
|
||||||
* Winning condition (location)
|
* Winning condition (location)
|
||||||
* Loading screen
|
* Loading screen
|
||||||
|
@ -4,8 +4,11 @@ import com.jme3.bullet.control.BetterCharacterControl;
|
|||||||
import com.jme3.bullet.control.VehicleControl;
|
import com.jme3.bullet.control.VehicleControl;
|
||||||
import com.jme3.input.ChaseCamera;
|
import com.jme3.input.ChaseCamera;
|
||||||
import com.jme3.input.KeyInput;
|
import com.jme3.input.KeyInput;
|
||||||
|
import com.jme3.input.MouseInput;
|
||||||
import com.jme3.input.controls.ActionListener;
|
import com.jme3.input.controls.ActionListener;
|
||||||
|
import com.jme3.input.controls.AnalogListener;
|
||||||
import com.jme3.input.controls.KeyTrigger;
|
import com.jme3.input.controls.KeyTrigger;
|
||||||
|
import com.jme3.input.controls.MouseAxisTrigger;
|
||||||
import com.jme3.light.AmbientLight;
|
import com.jme3.light.AmbientLight;
|
||||||
import com.jme3.light.DirectionalLight;
|
import com.jme3.light.DirectionalLight;
|
||||||
import com.jme3.material.Material;
|
import com.jme3.material.Material;
|
||||||
@ -22,6 +25,7 @@ import roadtrip.view.GameMenuNode;
|
|||||||
import roadtrip.view.GameWorldView;
|
import roadtrip.view.GameWorldView;
|
||||||
import roadtrip.view.HideControl;
|
import roadtrip.view.HideControl;
|
||||||
import roadtrip.view.VehicleNode;
|
import roadtrip.view.VehicleNode;
|
||||||
|
import roadtrip.view.model.CameraType;
|
||||||
import roadtrip.view.model.GameWorldState;
|
import roadtrip.view.model.GameWorldState;
|
||||||
import roadtrip.view.model.Player;
|
import roadtrip.view.model.Player;
|
||||||
|
|
||||||
@ -29,7 +33,7 @@ import roadtrip.view.model.Player;
|
|||||||
*
|
*
|
||||||
* @author dejvino
|
* @author dejvino
|
||||||
*/
|
*/
|
||||||
public class RoadTrip extends GameApplication implements ActionListener {
|
public class RoadTrip extends GameApplication implements ActionListener, AnalogListener {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
RoadTrip app = new RoadTrip();
|
RoadTrip app = new RoadTrip();
|
||||||
@ -43,6 +47,7 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
|
|
||||||
private GameMenuNode gameMenuNode;
|
private GameMenuNode gameMenuNode;
|
||||||
|
|
||||||
|
private CameraType cameraType = CameraType.FIRST_PERSON;
|
||||||
private ChaseCamera chaseCam;
|
private ChaseCamera chaseCam;
|
||||||
|
|
||||||
private Player player = new Player();
|
private Player player = new Player();
|
||||||
@ -53,6 +58,8 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
|
|
||||||
float inputTurning;
|
float inputTurning;
|
||||||
float inputAccel;
|
float inputAccel;
|
||||||
|
|
||||||
|
float lookX, lookY;
|
||||||
|
|
||||||
int score = 0;
|
int score = 0;
|
||||||
|
|
||||||
@ -68,6 +75,7 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
attachDebugStates();
|
attachDebugStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inputManager.setCursorVisible(false);
|
||||||
setupKeys();
|
setupKeys();
|
||||||
|
|
||||||
//audioRenderer.setEnvironment(Environment.Dungeon);
|
//audioRenderer.setEnvironment(Environment.Dungeon);
|
||||||
@ -142,15 +150,15 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
inputManager.addMapping("Reset", new KeyTrigger(KeyInput.KEY_RETURN));
|
inputManager.addMapping("Reset", new KeyTrigger(KeyInput.KEY_RETURN));
|
||||||
inputManager.addMapping("Esc", new KeyTrigger(KeyInput.KEY_ESCAPE));
|
inputManager.addMapping("Esc", new KeyTrigger(KeyInput.KEY_ESCAPE));
|
||||||
inputManager.addMapping("Pause", new KeyTrigger(KeyInput.KEY_P));
|
inputManager.addMapping("Pause", new KeyTrigger(KeyInput.KEY_P));
|
||||||
inputManager.addListener(this, "Lefts");
|
inputManager.addMapping("View", new KeyTrigger(KeyInput.KEY_V));
|
||||||
inputManager.addListener(this, "Rights");
|
inputManager.addMapping("LookX-", new MouseAxisTrigger(MouseInput.AXIS_X, true));
|
||||||
inputManager.addListener(this, "Ups");
|
inputManager.addMapping("LookX+", new MouseAxisTrigger(MouseInput.AXIS_X, false));
|
||||||
inputManager.addListener(this, "Downs");
|
inputManager.addMapping("LookY-", new MouseAxisTrigger(MouseInput.AXIS_Y, true));
|
||||||
inputManager.addListener(this, "Revs");
|
inputManager.addMapping("LookY+", new MouseAxisTrigger(MouseInput.AXIS_Y, false));
|
||||||
inputManager.addListener(this, "Space");
|
inputManager.addListener(this, new String[] {
|
||||||
inputManager.addListener(this, "Reset");
|
"Lefts", "Rights", "Ups", "Downs", "Revs", "Space", "Reset", "Esc", "Pause", "View",
|
||||||
inputManager.addListener(this, "Esc");
|
"LookX-", "LookX+", "LookY-", "LookY+"
|
||||||
inputManager.addListener(this, "Pause");
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addCar()
|
private void addCar()
|
||||||
@ -196,6 +204,9 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
{
|
{
|
||||||
player.node = addPerson();
|
player.node = addPerson();
|
||||||
player.characterControl = player.node.getControl(BetterCharacterControl.class);
|
player.characterControl = player.node.getControl(BetterCharacterControl.class);
|
||||||
|
player.headNode = new Node("head");
|
||||||
|
player.headNode.setLocalTranslation(0f, 2.5f, 0f);
|
||||||
|
player.node.attachChild(player.headNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addTarget()
|
private void addTarget()
|
||||||
@ -222,10 +233,11 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateGame(float tpf) {
|
public void updateGame(float tpf) {
|
||||||
Vector3f playerLocation = player.node.getWorldTranslation();
|
float focusDist = 20f;
|
||||||
Vector3f newLocation = new Vector3f(playerLocation).add(new Vector3f(-1f, 1.5f, 2.4f).mult(20f));
|
chaseCam.setEnabled(cameraType == CameraType.CHASE);
|
||||||
|
if (cameraType == CameraType.CHASE) {
|
||||||
float focusDist = cam.getLocation().distance(player.node.getWorldTranslation()) / 10f;
|
focusDist = cam.getLocation().distance(player.node.getWorldTranslation()) / 10f;
|
||||||
|
}
|
||||||
dofFilter.setFocusDistance(focusDist * 1.1f);
|
dofFilter.setFocusDistance(focusDist * 1.1f);
|
||||||
dofFilter.setFocusRange(focusDist * 0.9f);
|
dofFilter.setFocusRange(focusDist * 0.9f);
|
||||||
|
|
||||||
@ -240,7 +252,7 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
|
|
||||||
if (player.vehicleNode == null) {
|
if (player.vehicleNode == null) {
|
||||||
player.characterControl.setViewDirection(new Quaternion().fromAngleAxis(inputTurning * tpf, Vector3f.UNIT_Y).mult(player.characterControl.getViewDirection()));
|
player.characterControl.setViewDirection(new Quaternion().fromAngleAxis(inputTurning * tpf, Vector3f.UNIT_Y).mult(player.characterControl.getViewDirection()));
|
||||||
player.characterControl.setWalkDirection(new Vector3f(player.characterControl.getViewDirection()).mult(inputAccel * tpf * 1000f));
|
player.characterControl.setWalkDirection(new Vector3f(player.characterControl.getViewDirection()).mult(inputAccel * tpf * 1000f).multLocal(1f, 0f, 1f));
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3f playerPos2d = new Vector3f(player.node.getWorldTranslation());
|
Vector3f playerPos2d = new Vector3f(player.node.getWorldTranslation());
|
||||||
@ -258,6 +270,23 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
compassNode.setLocalRotation(new Quaternion().fromAngles(0f, (float)Math.atan2(targetDir.x, targetDir.z)/*targetDir.angleBetween(Vector3f.UNIT_Z)*/, 0f));
|
compassNode.setLocalRotation(new Quaternion().fromAngles(0f, (float)Math.atan2(targetDir.x, targetDir.z)/*targetDir.angleBetween(Vector3f.UNIT_Z)*/, 0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updatePreRender(float tpf) {
|
||||||
|
super.updatePreRender(tpf);
|
||||||
|
|
||||||
|
Vector3f playerLocation = player.headNode.getWorldTranslation();
|
||||||
|
Vector3f newLocation = new Vector3f(playerLocation).add(new Vector3f(-1f, 1.5f, 2.4f).mult(20f));
|
||||||
|
|
||||||
|
if (cameraType == CameraType.FIRST_PERSON) {
|
||||||
|
cam.setLocation(new Vector3f().addLocal(playerLocation));
|
||||||
|
Vector3f lookAtDir = new Vector3f((float)Math.cos(lookX), (float)Math.tan(lookY - 1f), (float)Math.sin(lookX)).normalizeLocal();
|
||||||
|
Quaternion camRot = new Quaternion();
|
||||||
|
camRot.lookAt(lookAtDir, Vector3f.UNIT_Y);
|
||||||
|
cam.setRotation(camRot);
|
||||||
|
player.characterControl.setViewDirection(lookAtDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void onReachedTarget()
|
protected void onReachedTarget()
|
||||||
{
|
{
|
||||||
score++;
|
score++;
|
||||||
@ -270,6 +299,11 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAction(String binding, boolean value, float tpf) {
|
public void onAction(String binding, boolean value, float tpf) {
|
||||||
|
if (binding.equals("View")) {
|
||||||
|
if (value) {
|
||||||
|
cameraType = cameraType == CameraType.CHASE ? CameraType.FIRST_PERSON : CameraType.CHASE;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (gamePaused) {
|
if (gamePaused) {
|
||||||
if (binding.equals("Lefts")) {
|
if (binding.equals("Lefts")) {
|
||||||
// meh
|
// meh
|
||||||
@ -444,6 +478,26 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnalog(String name, float value, float tpf) {
|
||||||
|
if (gamePaused) { return; }
|
||||||
|
float speedX = 100f;
|
||||||
|
float speedY = 100f;
|
||||||
|
if ("LookX-".equals(name)) {
|
||||||
|
lookX += -value * tpf * speedX;
|
||||||
|
}
|
||||||
|
if ("LookX+".equals(name)) {
|
||||||
|
lookX += value * tpf * speedX;
|
||||||
|
}
|
||||||
|
if ("LookY-".equals(name)) {
|
||||||
|
lookY += -value * tpf * speedY;
|
||||||
|
}
|
||||||
|
if ("LookY+".equals(name)) {
|
||||||
|
lookY += value * tpf * speedY;
|
||||||
|
}
|
||||||
|
lookY = (float)Math.max(0, Math.min(lookY, 2f));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onGamePause(boolean paused) {
|
protected void onGamePause(boolean paused) {
|
||||||
super.onGamePause(paused);
|
super.onGamePause(paused);
|
||||||
@ -454,5 +508,4 @@ public class RoadTrip extends GameApplication implements ActionListener {
|
|||||||
gameMenuNode.removeFromParent();
|
gameMenuNode.removeFromParent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
12
src/roadtrip/view/model/CameraType.java
Normal file
12
src/roadtrip/view/model/CameraType.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
*/
|
||||||
|
package roadtrip.view.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author dejvino
|
||||||
|
*/
|
||||||
|
public enum CameraType {
|
||||||
|
FIRST_PERSON,
|
||||||
|
CHASE
|
||||||
|
}
|
@ -10,6 +10,7 @@ import roadtrip.view.VehicleNode;
|
|||||||
*/
|
*/
|
||||||
public class Player {
|
public class Player {
|
||||||
public Node node;
|
public Node node;
|
||||||
|
public Node headNode;
|
||||||
public BetterCharacterControl characterControl;
|
public BetterCharacterControl characterControl;
|
||||||
public Vector3f jumpForce = new Vector3f(0, 3000, 0);
|
public Vector3f jumpForce = new Vector3f(0, 3000, 0);
|
||||||
public Vector3f walkDir = new Vector3f();
|
public Vector3f walkDir = new Vector3f();
|
||||||
|
Loading…
Reference in New Issue
Block a user