198 lines
7.3 KiB
Java
198 lines
7.3 KiB
Java
package org.atriasoft.gameengine;
|
|
|
|
import org.atriasoft.etk.math.Vector2f;
|
|
import org.atriasoft.etk.math.Vector3f;
|
|
import org.atriasoft.gale.Gale;
|
|
import org.atriasoft.gale.event.EventEntry;
|
|
import org.atriasoft.gale.event.EventInput;
|
|
import org.atriasoft.gale.event.EventTime;
|
|
import org.atriasoft.gale.key.KeyKeyboard;
|
|
import org.atriasoft.gale.key.KeyStatus;
|
|
import org.atriasoft.gameengine.camera.Camera;
|
|
import org.atriasoft.gameengine.internal.Log;
|
|
import org.atriasoft.gameengine.components.ComponentPlayer;
|
|
import org.atriasoft.gameengine.components.ComponentPosition;
|
|
import org.atriasoft.gameengine.components.ComponentPositionPlayer;
|
|
|
|
import renderEngine.DisplayManager;
|
|
|
|
|
|
public class ControlCameraPlayer implements ControlInterface {
|
|
private Camera camera;
|
|
private float distanceFromCenter = 2.5f;
|
|
private boolean fpsMode = false;
|
|
private Entity playerEntity;
|
|
private ComponentPositionPlayer playerPosition;
|
|
private ComponentPlayer player;
|
|
private boolean moveUp = false;
|
|
private boolean moveDown = false;
|
|
private boolean moveLeft = false;
|
|
private boolean moveRight = false;
|
|
private boolean walk = false;
|
|
|
|
public ControlCameraPlayer(Camera camera, Entity playerEntity) {
|
|
this.camera = camera;
|
|
this.playerEntity = playerEntity;
|
|
this.playerPosition = (ComponentPositionPlayer)this.playerEntity.getComponent("position");
|
|
this.player = (ComponentPlayer)this.playerEntity.getComponent("player");
|
|
}
|
|
private boolean getState(KeyStatus state, boolean previousState) {
|
|
if (state == KeyStatus.down) {
|
|
return true;
|
|
}
|
|
if (state == KeyStatus.up) {
|
|
return false;
|
|
}
|
|
return previousState;
|
|
}
|
|
@Override
|
|
public boolean onEventEntry(EventEntry event) {
|
|
if(event.getType() == KeyKeyboard.up
|
|
|| (event.getType() == KeyKeyboard.character && (event.getChar() == 'z' || event.getChar() == 'Z' ))) {
|
|
moveUp = getState(event.getStatus(), moveUp);
|
|
}
|
|
if(event.getType() == KeyKeyboard.left
|
|
|| (event.getType() == KeyKeyboard.character && (event.getChar() == 'q' || event.getChar() == 'Q' ))) {
|
|
moveLeft = getState(event.getStatus(), moveLeft);
|
|
}
|
|
if(event.getType() == KeyKeyboard.right
|
|
|| (event.getType() == KeyKeyboard.character && (event.getChar() == 'd' || event.getChar() == 'D' ))) {
|
|
moveRight = getState(event.getStatus(), moveRight);
|
|
}
|
|
if(event.getType() == KeyKeyboard.down
|
|
|| (event.getType() == KeyKeyboard.character && (event.getChar() == 's' || event.getChar() == 'S' ))) {
|
|
moveDown = getState(event.getStatus(), moveDown);
|
|
}
|
|
if(event.getType() == KeyKeyboard.shiftLeft || event.getType() == KeyKeyboard.shiftRight) {
|
|
walk = event.getSpecialKey().getShift();
|
|
}
|
|
if(event.getType() == KeyKeyboard.f10) {
|
|
if (event.getStatus() == KeyStatus.up) {
|
|
if (fpsMode == false) {
|
|
fpsMode = true;
|
|
distanceFromCenter = 0;
|
|
} else {
|
|
fpsMode = false;
|
|
distanceFromCenter = 2.5f;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean onEventInput(EventInput event, Vector2f relativePosition) {
|
|
// Log.info("" + event);
|
|
// TODO Auto-generated method stub
|
|
if (fpsMode == false) {
|
|
if (event.getInputId() == 4) {
|
|
if (event.getStatus() == KeyStatus.down) {
|
|
distanceFromCenter -= 0.2;
|
|
}
|
|
if (distanceFromCenter < 0.0) {
|
|
distanceFromCenter = 0.0f;
|
|
}
|
|
return true;
|
|
} else if (event.getInputId() == 5) {
|
|
if (event.getStatus() == KeyStatus.down) {
|
|
distanceFromCenter += 0.2;
|
|
}
|
|
if (distanceFromCenter < 0.3) {
|
|
distanceFromCenter = 0.3f;
|
|
}
|
|
return true;
|
|
}
|
|
} else {
|
|
distanceFromCenter = 0;
|
|
}
|
|
// TODO check if grabbing is enable ...
|
|
// in grabbing mouse only:
|
|
if (Gale.getContext().isGrabPointerEvents() == false) {
|
|
return false;
|
|
}
|
|
if (event.getStatus() == KeyStatus.move) {
|
|
Vector2f delta = event.getPosition().clone();
|
|
//angleZ += delta.x;
|
|
//this.camera.setYaw(this.camera.getYaw() + (float)Math.toRadians(delta.x));
|
|
this.camera.setPitch(this.camera.getPitch() + (float)Math.toRadians(delta.y * this.player.getTurnSpeed()));
|
|
if (this.camera.getPitch()>0) {
|
|
this.camera.setPitch(0);
|
|
}
|
|
if (this.camera.getPitch()<-Math.PI) {
|
|
this.camera.setPitch((float)-Math.PI);
|
|
}
|
|
/*
|
|
this.camera.setRoll(this.camera.getRoll() - (float)Math.toRadians(delta.x * this.player.getTurnSpeed()));
|
|
Log.info("Change camera: " + this.camera.getYaw() + " " + this.camera.getPitch());
|
|
if (this.camera.getRoll()>Math.PI) {
|
|
this.camera.setRoll(this.camera.getRoll()-(float)Math.PI*2.0f);
|
|
}
|
|
if (this.camera.getRoll()<-Math.PI) {
|
|
this.camera.setRoll(this.camera.getRoll()+(float)Math.PI*2.0f);
|
|
}
|
|
this.playerPosition.setAngles(new Vector3f(0,0,-this.camera.getRoll()));
|
|
*/
|
|
float tmpAngle = this.playerPosition.getAngles().z + (float)Math.toRadians(delta.x * this.player.getTurnSpeed());
|
|
|
|
if (tmpAngle > Math.PI) {
|
|
tmpAngle -= (float)Math.PI*2.0f;
|
|
}
|
|
if (tmpAngle < -Math.PI) {
|
|
tmpAngle += (float)Math.PI*2.0f;
|
|
}
|
|
this.playerPosition.setAngles(new Vector3f(0,0,tmpAngle));
|
|
this.camera.setRoll(-this.playerPosition.getAngles().z);
|
|
Log.info("Change camera: " + this.camera.getYaw() + " " + this.camera.getPitch());
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void periodicCall(EventTime event) {
|
|
float speed = 0;
|
|
float walkFactor = 1;
|
|
if (this.walk == true) {
|
|
walkFactor = this.player.getWalkFactor();
|
|
}
|
|
//distanceFromCenter = 6;
|
|
if (moveUp != moveDown) {
|
|
if (moveUp) {
|
|
speed = this.player.getRunSpeed();
|
|
} else {
|
|
speed = -this.player.getRunSpeed();
|
|
}
|
|
}
|
|
float distance = speed * walkFactor * event.getTimeDeltaCallSecond();
|
|
float dx = -(float) (distance * Math.sin(this.playerPosition.getAngles().z));
|
|
float dy = (float) (distance * Math.cos(this.playerPosition.getAngles().z));
|
|
speed = 0;
|
|
if (moveRight != moveLeft) {
|
|
if (moveRight) {
|
|
speed = this.player.getStrafSpeed();
|
|
} else {
|
|
speed = -this.player.getStrafSpeed();
|
|
}
|
|
}
|
|
distance = speed * walkFactor * event.getTimeDeltaCallSecond();
|
|
float dxStraf = (float) (distance * Math.sin((float)Math.PI*0.5f + this.playerPosition.getAngles().z));
|
|
float dyStraf = -(float) (distance * Math.cos((float)Math.PI*0.5f + this.playerPosition.getAngles().z));
|
|
//Log.error("update position ..." + dx + " " + dy);
|
|
this.playerPosition.getTransform().getPosition().x += dx + dxStraf;
|
|
this.playerPosition.getTransform().getPosition().y += dy + dyStraf;
|
|
// here the camera is behind the player, we need to move the camera ...
|
|
//Log.info(" pitch: " + Math.toDegrees(this.camera.getPitch()) + " " + Math.toDegrees(this.playerPosition.getAngles().z));
|
|
float horinzontalDistance = (float) (distanceFromCenter * Math.sin(this.camera.getPitch()));
|
|
float verticalDistance = (float) (distanceFromCenter * Math.cos(this.camera.getPitch()));
|
|
//Log.info(" distanceFromCenter " + distanceFromCenter);
|
|
float tmp = -horinzontalDistance;
|
|
float theta = (float)Math.PI + this.playerPosition.getAngles().z;// - (float)Math.PI*0.5f;
|
|
float offsetX = (float) (tmp * Math.sin(-theta));
|
|
float offsetY = (float) (tmp * Math.cos(-theta));
|
|
//Log.info(" res" + offsetX + " " + offsetY);
|
|
this.camera.getPosition().x = this.playerPosition.getTransform().getPosition().x + offsetX;
|
|
this.camera.getPosition().y = this.playerPosition.getTransform().getPosition().y + offsetY;
|
|
this.camera.getPosition().z = this.playerPosition.getTransform().getPosition().z + 1.6f + verticalDistance;
|
|
}
|
|
|
|
}
|