Newer
Older
CactusServer / src / main / java / fight3D / StateNormalRight.java
y-ota on 10 May 2018 1 KB 初うp
  1. package fight3D;
  2.  
  3. import javax.vecmath.Vector3d;
  4.  
  5. import framework.gameMain.Mode;
  6. import framework.gameMain.ModeFreeFall;
  7. import framework.gameMain.ModeOnGround;
  8. import framework.model3D.GeometryUtility;
  9. import framework.physics.PhysicsUtility;
  10. import framework.physics.Velocity3D;
  11.  
  12.  
  13. public class StateNormalRight extends StateRepeatable {
  14. static final Velocity3D initialVelocity = new Velocity3D(0.0, 0.0, 0.0);
  15. public boolean canChange(State nextState, Mode mode) {
  16. if(mode instanceof ModeFreeFall){
  17. //落下中
  18. if(nextState instanceof StateBend) return false;
  19. if(nextState instanceof StateGuard) return false;
  20. if(nextState instanceof StateJump) return false;
  21. }
  22. return true;
  23. }
  24.  
  25. public Velocity3D getInitialVelocity() {
  26. return initialVelocity;
  27. }
  28.  
  29. public Velocity3D getVelocity(Velocity3D curVelocity, Mode mode) {
  30. if (mode instanceof ModeOnGround) {
  31. if (curVelocity.getVector3d().length() <= GeometryUtility.TOLERANCE) return null;
  32. // 落下してきて斜面に衝突した後、斜面をすべっていかないように止める
  33. return getInitialVelocity();
  34. }
  35. // 空中に滞在している場合は水平方向の速度成分だけ変更する(自由落下には影響を与えないように)
  36. if (counter == 0) {
  37. // この状態に変わった瞬間
  38. Vector3d v0 = curVelocity.getVector3d();
  39. Vector3d v1 = getInitialVelocity().getVector3d();
  40. v0.add(v1);
  41. double d0 = v0.dot(PhysicsUtility.horizon);
  42. double d1 = v1.dot(PhysicsUtility.horizon);
  43. v0.scaleAdd(d1 - d0, PhysicsUtility.horizon, v0);
  44. if (v0.y >= 0.0) v0.y = 0.0; // ただし上昇中は離した瞬間に落下を開始する
  45. return new Velocity3D(v0);
  46. }
  47. return null;
  48. }
  49. }