Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

459 linhas
18 KiB

  1. package roadtrip;
  2. import com.jme3.bullet.control.BetterCharacterControl;
  3. import com.jme3.bullet.control.VehicleControl;
  4. import com.jme3.input.ChaseCamera;
  5. import com.jme3.input.KeyInput;
  6. import com.jme3.input.controls.ActionListener;
  7. import com.jme3.input.controls.KeyTrigger;
  8. import com.jme3.light.AmbientLight;
  9. import com.jme3.light.DirectionalLight;
  10. import com.jme3.material.Material;
  11. import com.jme3.math.*;
  12. import com.jme3.post.FilterPostProcessor;
  13. import com.jme3.post.filters.DepthOfFieldFilter;
  14. import com.jme3.scene.Geometry;
  15. import com.jme3.scene.Node;
  16. import com.jme3.scene.Spatial;
  17. import com.jme3.scene.shape.Box;
  18. import roadtrip.model.VehicleInstance;
  19. import roadtrip.view.CompassNode;
  20. import roadtrip.view.GameMenuNode;
  21. import roadtrip.view.GameWorldView;
  22. import roadtrip.view.HideControl;
  23. import roadtrip.view.VehicleNode;
  24. import roadtrip.view.model.GameWorldState;
  25. import roadtrip.view.model.Player;
  26. /**
  27. *
  28. * @author dejvino
  29. */
  30. public class RoadTrip extends GameApplication implements ActionListener {
  31. public static void main(String[] args) {
  32. RoadTrip app = new RoadTrip();
  33. app.start();
  34. }
  35. public static boolean DEBUG = !true;
  36. private GameWorldState gameWorldState;
  37. private GameWorldView gameWorldView;
  38. private GameMenuNode gameMenuNode;
  39. private ChaseCamera chaseCam;
  40. private Player player = new Player();
  41. private Vector3f journeyTarget = new Vector3f(50, 0f, 50f);
  42. private Node targetNode;
  43. private CompassNode compassNode;
  44. float inputTurning;
  45. float inputAccel;
  46. int score = 0;
  47. private FilterPostProcessor fpp;
  48. DepthOfFieldFilter dofFilter;
  49. @Override
  50. public void initializeGame() {
  51. super.initializeGame();
  52. bulletAppState.setDebugEnabled(DEBUG);
  53. if (DEBUG) {
  54. attachDebugStates();
  55. }
  56. setupKeys();
  57. //audioRenderer.setEnvironment(Environment.Dungeon);
  58. //AL10.alDistanceModel(AL11.AL_EXPONENT_DISTANCE);
  59. // Environment
  60. DirectionalLight dl = new DirectionalLight();
  61. dl.setColor(ColorRGBA.LightGray);
  62. dl.setDirection(new Vector3f(1, -1, 1));
  63. rootNode.addLight(dl);
  64. AmbientLight al = new AmbientLight();
  65. al.setColor(new ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f));
  66. rootNode.addLight(al);
  67. gameWorldState = new GameWorldState(1L);
  68. gameWorldView = GameWorldView.create(gameWorldState, assetManager, cam, rootNode, getPhysicsSpace(), new HideControl.TargetProvider() {
  69. @Override
  70. public Vector3f getTarget() {
  71. return player.node.getWorldTranslation();
  72. }
  73. });
  74. addCar();
  75. addCar();
  76. addCar();
  77. addCar();
  78. addCar();
  79. addPerson();
  80. addPerson();
  81. addPerson();
  82. addPerson();
  83. addPerson();
  84. addPerson();
  85. addPerson();
  86. addPlayer();
  87. addTarget();
  88. addCompass();
  89. addGameMenu();
  90. chaseCam = new ChaseCamera(cam, player.node, inputManager);
  91. chaseCam.setDefaultDistance(60f);
  92. chaseCam.setSmoothMotion(true);
  93. fpp = new FilterPostProcessor(assetManager);
  94. //fpp.setNumSamples(4);
  95. dofFilter = new DepthOfFieldFilter();
  96. dofFilter.setFocusRange(5f);
  97. dofFilter.setFocusDistance(6f);
  98. dofFilter.setBlurScale(0.6f);
  99. fpp.addFilter(dofFilter);
  100. viewPort.addProcessor(fpp);
  101. }
  102. protected void addGameMenu()
  103. {
  104. gameMenuNode = new GameMenuNode();
  105. gameMenuNode.initialize(getAssetManager());
  106. }
  107. private void setupKeys() {
  108. inputManager.clearMappings();
  109. inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_A));
  110. inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_D));
  111. inputManager.addMapping("Ups", new KeyTrigger(KeyInput.KEY_W));
  112. inputManager.addMapping("Downs", new KeyTrigger(KeyInput.KEY_S));
  113. inputManager.addMapping("Revs", new KeyTrigger(KeyInput.KEY_X));
  114. inputManager.addMapping("Space", new KeyTrigger(KeyInput.KEY_SPACE));
  115. inputManager.addMapping("Reset", new KeyTrigger(KeyInput.KEY_RETURN));
  116. inputManager.addMapping("Esc", new KeyTrigger(KeyInput.KEY_ESCAPE));
  117. inputManager.addMapping("Pause", new KeyTrigger(KeyInput.KEY_P));
  118. inputManager.addListener(this, "Lefts");
  119. inputManager.addListener(this, "Rights");
  120. inputManager.addListener(this, "Ups");
  121. inputManager.addListener(this, "Downs");
  122. inputManager.addListener(this, "Revs");
  123. inputManager.addListener(this, "Space");
  124. inputManager.addListener(this, "Reset");
  125. inputManager.addListener(this, "Esc");
  126. inputManager.addListener(this, "Pause");
  127. }
  128. private void addCar()
  129. {
  130. VehicleInstance vehicleInstance = VehicleInstance.createVehicle(gameWorldState.vehicles.size() % VehicleInstance.getVehicleTypesCount());
  131. vehicleInstance.brakeForce = vehicleInstance.accelerationForce;
  132. VehicleNode vehicle = new VehicleNode("Car " + vehicleInstance.toString(), vehicleInstance);
  133. vehicle.initialize(assetManager);
  134. vehicle.vehicleControl.setPhysicsLocation(new Vector3f(10f + (float)Math.random() * 40f, 228f, 12f + (float)Math.random() * 40f));
  135. gameWorldState.vehicles.add(vehicle);
  136. getPhysicsSpace().addAll(vehicle);
  137. rootNode.attachChild(vehicle);
  138. }
  139. private Node addPerson() {
  140. Spatial personModel = assetManager.loadModel("Models/person.j3o");
  141. Node person = new Node("person");
  142. person.attachChild(personModel);
  143. BetterCharacterControl personControl = new BetterCharacterControl(1f, 4f, 10f);
  144. /*personModel.setLocalTranslation(0f, -1f, 0f);
  145. BoxCollisionShape personShape = new BoxCollisionShape(new Vector3f(0.5f, 2f, 0.5f));
  146. RigidBodyControl personControl = new RigidBodyControl(personShape, 80f);/**/
  147. person.addControl(personControl);
  148. /**/personControl.setJumpForce(new Vector3f(0,5f,0));
  149. personControl.setGravity(new Vector3f(0,1f,0));
  150. personControl.warp(new Vector3f(10f + (float)Math.random() * 20f, 230f, 12f + (float)Math.random() * 20f));/**/
  151. //personControl.setPhysicsLocation(new Vector3f(10f, 30f, 12f));
  152. getPhysicsSpace().add(personControl);
  153. //getPhysicsSpace().addAll(person);
  154. rootNode.attachChild(person);
  155. Vector3f dir = new Vector3f((float)Math.random() * 2f - 1f, 0f, (float)Math.random() * 2f - 1f);
  156. personControl.setViewDirection(dir);
  157. personControl.setWalkDirection(dir);
  158. return person;
  159. }
  160. private void addPlayer()
  161. {
  162. player.node = addPerson();
  163. player.characterControl = player.node.getControl(BetterCharacterControl.class);
  164. }
  165. private void addTarget()
  166. {
  167. Material matTarget = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
  168. matTarget.setColor("Color", ColorRGBA.Red);
  169. Geometry targetGeom = new Geometry("target", new Box(new Vector3f(0.0f, 0f, 0.0f), 1.0f, 1000.0f, 1.0f));
  170. targetGeom.setMaterial(matTarget);
  171. targetNode = new Node("target");
  172. targetNode.attachChild(targetGeom);
  173. rootNode.attachChild(targetNode);
  174. targetNode.setLocalTranslation(journeyTarget);
  175. }
  176. private void addCompass()
  177. {
  178. compassNode = new CompassNode();
  179. compassNode.initialize(getAssetManager());
  180. rootNode.attachChild(compassNode);
  181. }
  182. @Override
  183. public void updateGame(float tpf) {
  184. Vector3f playerLocation = player.node.getWorldTranslation();
  185. Vector3f newLocation = new Vector3f(playerLocation).add(new Vector3f(-1f, 1.5f, 2.4f).mult(20f));
  186. float focusDist = cam.getLocation().distance(player.node.getWorldTranslation()) / 10f;
  187. dofFilter.setFocusDistance(focusDist * 1.1f);
  188. dofFilter.setFocusRange(focusDist * 0.9f);
  189. for (VehicleNode vehicle : gameWorldState.vehicles) {
  190. vehicle.update(tpf);
  191. }
  192. listener.setLocation(cam.getLocation());
  193. listener.setRotation(cam.getRotation());
  194. gameMenuNode.moveToCamera(cam, player.node);
  195. if (player.vehicleNode == null) {
  196. player.characterControl.setViewDirection(new Quaternion().fromAngleAxis(inputTurning * tpf, Vector3f.UNIT_Y).mult(player.characterControl.getViewDirection()));
  197. player.characterControl.setWalkDirection(new Vector3f(player.characterControl.getViewDirection()).mult(inputAccel * tpf * 1000f));
  198. }
  199. Vector3f playerPos2d = new Vector3f(player.node.getWorldTranslation());
  200. playerPos2d.y = 0;
  201. Vector3f targetPos2d = new Vector3f(targetNode.getWorldTranslation());
  202. targetPos2d.y = 0;
  203. Vector3f targetDir = targetPos2d.subtract(playerPos2d);
  204. float targetDistance = targetDir.length();
  205. if (targetDistance < 5f) {
  206. onReachedTarget();
  207. }
  208. compassNode.setTargetText(((int)targetDistance) + " m");
  209. compassNode.setLocalTranslation(new Vector3f(player.node.getWorldTranslation()).addLocal(0f, 5f, 0f));
  210. compassNode.setLocalRotation(new Quaternion().fromAngles(0f, (float)Math.atan2(targetDir.x, targetDir.z)/*targetDir.angleBetween(Vector3f.UNIT_Z)*/, 0f));
  211. }
  212. protected void onReachedTarget()
  213. {
  214. score++;
  215. gameMenuNode.setMenuEntriesPrefix("SCORE: " + score + "\n\n");
  216. double angle = Math.random() * 2d - 1d;
  217. journeyTarget = journeyTarget.add(new Quaternion().fromAngleAxis((float) angle, Vector3f.UNIT_Y).mult(Vector3f.UNIT_Z).mult(100f));
  218. targetNode.setLocalTranslation(journeyTarget);
  219. }
  220. @Override
  221. public void onAction(String binding, boolean value, float tpf) {
  222. if (gamePaused) {
  223. if (binding.equals("Lefts")) {
  224. // meh
  225. } else if (binding.equals("Rights")) {
  226. // meh
  227. } else if (binding.equals("Ups")) {
  228. if (value) {
  229. gameMenuNode.nextMenuEntry();
  230. }
  231. } else if (binding.equals("Downs")) {
  232. if (value) {
  233. gameMenuNode.prevMenuEntry();
  234. }
  235. } else if (binding.equals("Reset")) {
  236. if (value) {
  237. switch (gameMenuNode.getMenuEntryIndex()) {
  238. case 0: // New
  239. break;
  240. case 1: // Load
  241. break;
  242. case 2: // Settings
  243. break;
  244. case 3: // Credits
  245. break;
  246. case 4: // Exit
  247. stop();
  248. break;
  249. default:
  250. throw new RuntimeException("Unrecognized menu entry: " + gameMenuNode.getMenuEntryIndex());
  251. }
  252. }
  253. } else if (binding.equals("Esc")) {
  254. // TODO: hide menu
  255. if (value) {
  256. setGamePaused(false);
  257. }
  258. }
  259. } else {
  260. if (player.vehicleNode == null) {
  261. float walkSpeed = 1f;
  262. float turnSpeed = 1f;
  263. if (binding.equals("Lefts")) {
  264. if (value) {
  265. inputTurning += turnSpeed;
  266. } else {
  267. inputTurning -= turnSpeed;
  268. }
  269. } else if (binding.equals("Rights")) {
  270. if (value) {
  271. inputTurning -= turnSpeed;
  272. } else {
  273. inputTurning += turnSpeed;
  274. }
  275. } else if (binding.equals("Ups")) {
  276. if (value) {
  277. inputAccel += walkSpeed;
  278. } else {
  279. inputAccel -= walkSpeed;
  280. }
  281. } else if (binding.equals("Downs")) {
  282. if (value) {
  283. inputAccel -= walkSpeed;
  284. } else {
  285. inputAccel += walkSpeed;
  286. }
  287. } else if (binding.equals("Reset")) {
  288. if (value) {
  289. System.out.println("Reset - to car");
  290. Vector3f playerPos = player.node.getWorldTranslation();
  291. for (VehicleNode vehicle : gameWorldState.vehicles) {
  292. Vector3f vehiclePos = vehicle.getWorldTranslation();
  293. float dist = playerPos.distance(vehiclePos);
  294. System.out.println(" .. dist: " + dist);
  295. if (dist < 5f) {
  296. player.vehicleNode = vehicle;
  297. player.node.removeFromParent();
  298. player.node.setLocalTranslation(0f, 0f, -1f);
  299. player.node.setLocalRotation(Quaternion.DIRECTION_Z);
  300. player.node.removeControl(player.characterControl);
  301. player.vehicleNode.attachChild(player.node);
  302. VehicleInstance playerVehicle = player.vehicleNode.vehicleInstance;
  303. playerVehicle.accelerationValue = 0;
  304. playerVehicle.steeringValue = 0;
  305. player.walkDir = new Vector3f();
  306. break;
  307. }
  308. }
  309. }
  310. }
  311. } else {
  312. VehicleInstance playerVehicle = player.vehicleNode.vehicleInstance;
  313. VehicleControl playerVehicleControl = player.vehicleNode.vehicleControl;
  314. int playerCarType = playerVehicle.carType;
  315. float steerMax = 0.5f;
  316. if (playerCarType == VehicleInstance.TRUCK) {
  317. steerMax = 0.7f;
  318. }
  319. if (binding.equals("Lefts")) {
  320. if (value) {
  321. playerVehicle.steeringValue += steerMax;
  322. } else {
  323. playerVehicle.steeringValue += -steerMax;
  324. }
  325. playerVehicleControl.steer(playerVehicle.steeringValue);
  326. } else if (binding.equals("Rights")) {
  327. if (value) {
  328. playerVehicle.steeringValue += -steerMax;
  329. } else {
  330. playerVehicle.steeringValue += steerMax;
  331. }
  332. playerVehicleControl.steer(playerVehicle.steeringValue);
  333. } else if (binding.equals("Ups")) {
  334. if (value) {
  335. playerVehicle.accelerationValue += playerVehicle.accelerationForce;
  336. } else {
  337. playerVehicle.accelerationValue -= playerVehicle.accelerationForce;
  338. }
  339. playerVehicleControl.accelerate(2, playerVehicle.accelerationValue);
  340. playerVehicleControl.accelerate(3, playerVehicle.accelerationValue);
  341. if (playerCarType == VehicleInstance.TRUCK) {
  342. playerVehicleControl.accelerate(4, playerVehicle.accelerationValue);
  343. playerVehicleControl.accelerate(5, playerVehicle.accelerationValue);
  344. }
  345. } else if (binding.equals("Downs")) {
  346. float b;
  347. if (value) {
  348. playerVehicle.brakeForce = playerVehicle.accelerationForce;
  349. } else {
  350. playerVehicle.brakeForce = 0f;
  351. }
  352. playerVehicleControl.brake(0, playerVehicle.brakeForce);
  353. playerVehicleControl.brake(1, playerVehicle.brakeForce);
  354. } else if (binding.equals("Revs")) {
  355. if (value) {
  356. playerVehicle.accelerationValue += playerVehicle.accelerationForce;
  357. } else {
  358. playerVehicle.accelerationValue -= playerVehicle.accelerationForce;
  359. }
  360. playerVehicleControl.accelerate(2, -playerVehicle.accelerationValue);
  361. playerVehicleControl.accelerate(3, -playerVehicle.accelerationValue);
  362. if (playerCarType == VehicleInstance.TRUCK) {
  363. playerVehicleControl.accelerate(4, -playerVehicle.accelerationValue);
  364. playerVehicleControl.accelerate(5, -playerVehicle.accelerationValue);
  365. }
  366. } else if (binding.equals("Space")) {
  367. if (value) {
  368. playerVehicleControl.applyImpulse(player.jumpForce, Vector3f.ZERO);
  369. }
  370. } else if (binding.equals("Reset")) {
  371. if (value) {
  372. System.out.println("Reset - from car");
  373. player.node.removeFromParent();
  374. player.node.addControl(player.characterControl);
  375. player.characterControl.warp(player.vehicleNode.getLocalTranslation());
  376. rootNode.attachChild(player.node);
  377. player.vehicleNode = null;
  378. player.walkDir = new Vector3f();
  379. } else {
  380. }
  381. }
  382. }
  383. if (binding.equals("Esc")) {
  384. // TODO: open menu
  385. if (value) {
  386. setGamePaused(true);
  387. }
  388. } else if (binding.equals("Pause")) {
  389. if (value) {
  390. setGamePaused(!gamePaused);
  391. }
  392. }
  393. }
  394. }
  395. @Override
  396. protected void onGamePause(boolean paused) {
  397. super.onGamePause(paused);
  398. if (paused) {
  399. rootNode.attachChild(gameMenuNode);
  400. } else {
  401. gameMenuNode.removeFromParent();
  402. }
  403. }
  404. }