ege/src/org/atriasoft/gameengine/ControlCameraPlayer.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;
}
}