You are on page 1of 11

Qu ofrece Autentia?

Somos su empresa de Soporte a Desarrollo Informtico


Ese apoyo que siempre quiso tener .
Desarrollo de componentes y proyectos a medida. Auditora de cdigo y recomendaciones de mejora. Arranque de proyectos basados en nuevas tecnologas. Curso de Formacin Direccin de Proyectos Informticos. Gestin eficaz del Tiempo. Arquitecturas de desarrollo Web: Web, J2EE, SOA, WebServices, BPM, etc. Java/ J2EE a todos los niveles: JSPs, Servlets, EJBs, JMS, JNI, etc. Anlisis y diseo orientado a objeto. UML y patrones de diseo. Buenas prcticas en el desarrollo de aplicaciones Tcnicas avanzadas: Lucene, Hibernate, Spring, JSF, Struts, etc.

Nuestra mejor referencia son los conocimientos que compartimos en nuestro web

www.adictosaltrabajo.com
Decenas de entidades cuentan ya con nosotros
Para ms informacin vistenos en www.autentia.com
Tel. 91 675 33 06 - info@autentia.com

Qu ofrece Autentia?
Somos su empresa de Soporte a Desarrollo Informtico
Ese apoyo que siempre quiso tener .
Desarrollo de componentes y proyectos a medida. Auditora de cdigo y recomendaciones de mejora. Arranque de proyectos basados en nuevas tecnologas. Curso de Formacin Direccin de Proyectos Informticos. Gestin eficaz del Tiempo. Arquitecturas de desarrollo Web: Web, J2EE, SOA, WebServices, BPM, etc. Java/ J2EE a todos los niveles: JSPs, Servlets, EJBs, JMS, JNI, etc. Anlisis y diseo orientado a objeto. UML y patrones de diseo. Buenas prcticas en el desarrollo de aplicaciones Tcnicas avanzadas: Lucene, Hibernate, Spring, JSF, Struts, etc.

Nuestra mejor referencia son los conocimientos que compartimos en nuestro web

www.adictosaltrabajo.com
Decenas de entidades cuentan ya con nosotros
Para ms informacin vistenos en www.autentia.com
Tel. 91 675 33 06 - info@autentia.com

Hosting patrocinado por


Inicio Quienes somos Tutoriales Tutoriales Formacin Comparador de salarios Comic Charlas Ms

Estas en: Inicio

JMonkeyEngine, Creacin de nuestro primer juego.

Ultimas Noticias
Historia de la Informtica. Captulo 66. 1988 Historia de la informtica. Captulo 65. 1987 Autentia en la Sun Open Communities Forum Comentario del libro: El economista naturalista de Robert Frank Contratos giles: Vendiendo Scrum a tus clientes. Resumen de la cuarta charla gratuita de Autentia: SCRUM (con video) Si se pregunta Qu ofrece este Web? Vota AdictosAltrabajo.com en DZone Autentia cumple 6 aos

+Noticias Destacadas
Contratos giles: Vendiendo Scrum a tus clientes. Quinta charla Autentia + Proyectalis + Agile Spain: Contratos giles: Vendiendo Scrum a tus clientes Lo mejor de esta semana: Curso de Scrum con ngel Medinilla Resumen de la cuarta charla gratuita de Autentia: SCRUM (con video)

Catlogo de servicios Autentia (PDF 6,2MB)

En formato comic...

+Comentarios Cmic +Enlaces

Tutorial desarrollado por


Javier Ceballos Fernndez
Consultor tecnolgico de desarrollo de proyectos informticos. Ingeniero en Informtica por la Universidad de Alcal de Henares. Puedes encontrarme en Autentia Somos expertos en Java/J2EE

Catlogo de servicios de Autentia


Descargar (6,2 MB) Descargar en versin comic (17 MB) AdictosAlTrabajo.com es el Web de difusin de conocimiento de Autentia.

Web www.adictosaltrabajo.com
Buscar

ltimos tutoriales
2009-07-14

JMonkeyEngine, Creacin de nuestro primer juego. Catlogo de cursos


2009-07-13

Ajax tests con Selenium: prototype.js e ICEfaces. Descargar este documento en formato PDF: JMonkeyEngine-Primer-Juego.pdf
2009-07-08

Fecha de creacin del tutorial: 2009-07-14

AOP con AspectJ y Maven

JMonkeyEngine, Creacin de nuestro primer juego.


En este tutorial intentaremos ensearos a crear vuestro primer juego, partiremos de un ejemplo echo de JMonkey Engine que es el jmetest.flagrushtut.lesson9, que trata sobre el manejo de una moto por un escenario.

2009-07-07

Instalacin y configuracin de Eclipse Galileo

2009-07-07

Iniciarse en el manejo de JME, Creacin de un Cloth.

2009-07-06

Primeros pasos con Blender: Pintando nuestra mascota en 3D

2009-07-06

DBUnit-Exportar e Importar BBDD

2009-07-05

JMeter, Pruebas de stress sobre aplicaciones web: Grabando y reproduciendo navegaciones

2009-07-02

Axis2: Invocacin de Servicios Web usando distintos MEP

2009-07-02

Instalacin OpenOffice

2009-07-02

Juegos 3D en Java: Blender y JMonkeyEngine Para realizar este tutorial primero tendremos que instalar el JMonkeyEngine con todos sus ejemplos(estos se encuentran en todos los paquetes que empiezan por jmestest)., puede ver como se hace en:
2009-06-20

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=BlenderavaMonkeyEngine

StAX (Xml Pull Parser): Streaming API para XML

2009-06-15

Seguiremos trabajando con el proyecto creado con anterioridad en el tutorial "Iniciarse en el manejo de JMonkeyEngine, Creacin de un Cloth.". Ha este proyecto le tendremos que aadir un nuevo paquete que en nuestro caso lo hemos llamado "Intento1":

Configuracin de la desconexin de usuarios con ICEFaces

2009-06-10

LWUIT: Una librera grfica tipo AWT o Swing para J2ME

2009-06-10

Mapas mentales con XMind

2009-02-26

Redimensionar Imagenes en Windows Vista

2009-06-08

UploadFile con Icefaces + Hibernate + Anotaciones

2009-06-05

Habilitar exportacin en Liferay

2009-06-01

Registrar Liferay en Eclipse

2009-05-29

Liferay Social Office

2009-05-28

Broadcast con Ustream

2009-05-25

Una vez creado, aadimos las clases del ejemplo y las renombremos si lo vemos oportuno, en nuestro caso lo hemos hecho ya que de este modo, podemos tener una mejor compresion, de que es cada fichero java: FlagRushHandler.java ----------------> teclado.java Vehicle.java --------------------------> moto.java ForceFieldFence.java ----------------> escenario.java Lesson9.java -------------------------> juego.java DriftAction.java ----------------------> AccionDerrape.java ForwardAndBackwardAction.java ---> AvanzarRetroceder.java VehicleRotateACtion.java ------------> RotacionMoto.java Lesson2.java -------------------------> Lecion2.java Una vez hecho esto quedara algo asi

Tabla datos accesible con ordenacin y paginacin

2009-05-21

Primeros pasos con Audacity: Un editor de sonido libre y multiplataforma.

2009-05-11

Introduccin a TortoiseSVN

2009-05-07

Hacer 'scp' de varios ficheros sin solicitud de clave

2009-05-02

Plugin Hibernate3 para Maven

2009-04-26

AgileDraw: una tcnica rpida de modelado

2009-04-24

Spring AOP: Cacheando aplicaciones usando anotaciones y aspectos con Aspectj

2009-04-20

Modelos de conocimiento con CmapTools

2009-04-16

Informes Crosstab con iReport

2009-04-16

Registro de un fichero de datos personales con el formulario NOTA

2009-04-15

Estadsticas de www.adictosaltrabajo.com Abril 2009 Una vez aadido los ficheros java tenemos que aadir los recursos, es decir las imgenes asi que nos dirigimos a la carpeta del proyecto, nos vamos a la carpeta src/Intento1 y una vez ahi creamos tres carpetas: imagenes, modelo, texturas
2009-04-15

Iniciacin a OSWorkflow con Spring

2009-04-14

Tests de Selenium con libreras de componentes JSF: Apache Tomahawk.

2009-04-13

JTAPI. El API de Telefona para Java

2009-04-13

Registro de Web Services con Apache jUDDI. Configuracin y ejemplo

2009-04-13

Cmo hacer UML con Eclipse y el plugin UML2

2009-04-09

Spring WS: Servicios Web a travs del correo electrnico

2009-04-02

Creacin de cursos con Moodle

2009-03-31

Integrar Liferay Portal 5.2.1 con Pentaho BI 2.0.0 sobre MySQL 5.1

2009-03-31

Spring WS: Construccin de Clientes de Servicios Web con Spring

Dentro de cada carpeta metemos las imagenes correspondientes: imagenes

2009-03-30

Administracin de sitios Moodle

2009-03-29

Empaquetamiento de aplicaciones de escritorio (standalone) con Maven

2009-03-27

Primeros pasos con Moodle

2009-03-26

Introduccin a JSF Java

2009-03-25

A1 Website Analyzer

2009-03-24

Cmo ver el correo de Gmail sin conexin a Internet

2009-03-20

JasperReports Maven Plugin

2009-03-16

Creacin de contenidos SCORM: eXe

2009-03-15

Spring WS: Creacin de Servicios Web con Spring

ltimas ofertas de empleo


2009-06-29

Atencin a cliente - Call Center - BARCELONA. modelo


2009-06-25

Atencin a cliente - Call Center - BARCELONA.

2009-06-20

Comercial - Ventas - CASTELLON.

2009-06-19

Otras - Ingenieria (minas, puentes y puertos) VALENCIA.

2009-06-17

Comercial - Ventas - ALICANTE.

Anuncios Google

texturas

Empecemos analizando las clases: moto.java

view plain

print

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155.

package Intento1; import import import import import import import com.jme.image.Texture; com.jme.math.FastMath; com.jme.math.Quaternion; com.jme.math.Vector3f; com.jme.scene.Node; com.jme.scene.Spatial; com.jmex.effects.particles.ParticleMesh;

/** * Vehicle will be a node that handles the movement of a vehicle in the * game. It has parameters that define its acceleration and speed as well * as braking. The turn speed defines what kind of handling it has, and the * weight will define things such as friction for drifting, how fast it falls * etc. * @author Mark Powell * */ /** * @author Mark Powell * */
public class moto extends Node { private static final long serialVersionUID = 1L; private static final float LEAN_BUFFER = 0.05f; private Spatial model; private float weight; private float velocity; private float acceleration; private float braking; private float turnSpeed; private float maxSpeed = 30; private float minSpeed = 10;

//

temporary vector for the rotation


private private private private private static final Vector3f tempVa = new Vector3f(); int lean; float leanAngle; Vector3f leanAxis = new Vector3f(0,0,1); Quaternion q = new Quaternion();

//

information for rotation of the wheels


Spatial frontwheel, backwheel,gun;

//rotate about the Y axis ... this is explained in the tutorial.


private Vector3f wheelAxis = new Vector3f(0, 1, 0); private float angle = 0; private Quaternion rotQuat = new Quaternion(); public moto(String id, Spatial model) { super(id); setModel(model); } public moto(String id, Spatial model, float maxSpeed, float minSpeed, float weight, float acceleration, float braking, float turnSpeed) { super(id); setModel(model); this.maxSpeed = maxSpeed; this.minSpeed = minSpeed; this.weight = weight; this.acceleration = acceleration; this.braking = braking; this.turnSpeed = turnSpeed; }

/** * Este metodo actualiza la moto basando en el tiempo * que transcurre. */


public void update(float time) { this.localTranslation.addLocal( this.localRotation.getRotationColumn( 2, tempVa) .multLocal(velocity * time)); rotateWheels(time); processLean(time); }

/** * rorateWheels hace que las ruedas rotan un cierto angulo * segun la velocidad * de la moto. */
private void rotateWheels(float time) {

//Rotate the tires if the vehicle is moving.


if (vehicleIsMoving()) { if(velocity > FastMath.FLT_EPSILON) { angle = angle - ((time) * velocity * 0.5f); if (angle < -360) { angle = 0; } } else { angle = angle + ((time) * velocity * 0.5f); if (angle > 360) { angle = 0; } } rotQuat.fromAngleAxis(angle, wheelAxis); frontwheel.getLocalRotation().multLocal(rotQuat); backwheel.setLocalRotation(frontwheel.getLocalRotation()); } }

/** * Este metodo determina si la moto esta moviendose o no, esto se consigue observando * si la velocidad es cercana a cero, teniendo en cuenta un margen de error. * Devuelve verdadero si la moto se esta moviendo. */
public boolean vehicleIsMoving() { return velocity > FastMath.FLT_EPSILON || velocity < -FastMath.FLT_EPSILON; }

/** * processLean calcula el angulo de inclinacion de la moto basandose en un * factor de inclinacin. Inclinamos la moto mas que inclinar el vehiculo, ya * que este esta centrado en la posicion que ocupa en el terreno. */
private void processLean(float time) {

//check if we are leaning at all


if(lean != 0) { if(lean == -1 && leanAngle < 0) { leanAngle += -lean * 4 * time; } else if(lean == 1 && leanAngle > 0) { leanAngle += -lean * 4 * time; } else { leanAngle += -lean * 2 * time; }

//max lean is 1 and -1


if(leanAngle > 1) { leanAngle = 1; } else if(leanAngle < -1) { leanAngle = 1; } } else { //we are not leaning, so right ourself back up. if(leanAngle < LEAN_BUFFER && leanAngle > -LEAN_BUFFER) { leanAngle = 0; } else if(leanAngle < -FastMath.FLT_EPSILON) { leanAngle += time * 4; } else if(leanAngle > FastMath.FLT_EPSILON) { leanAngle -= time * 4; } else { leanAngle = 0; } } q.fromAngleAxis(leanAngle, leanAxis); model.setLocalRotation(q); lean = 0; }

/** * Se definen distintas propiedades que modifican parametros de la moto

teclado.java
view plain print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.

package Intento1;

import com.jme.input.InputHandler; import com.jme.input.KeyBindingManager; import com.jme.input.KeyInput; public class teclado extends InputHandler {

//the vehicle we are going to control


private moto vehicle;

//the default action


private AccionDerrape drift; public void update(float time) { if ( !isEnabled() ) return; super.update(time);

//we always want to allow friction to control the drift


drift.performAction(event); vehicle.update(time); } public teclado(moto vehicle, String api) { this.vehicle = vehicle; setKeyBindings(api); setActions(vehicle); }

/** * setKeyBindings establece las teclas que permitiran manejar * la moto. En este caso las flechas */
private void setKeyBindings(String api) { KeyBindingManager keyboard = KeyBindingManager.getKeyBindingManager(); keyboard.set("forward", KeyInput.KEY_UP); keyboard.set("backward", KeyInput.KEY_DOWN); keyboard.set("turnRight", KeyInput.KEY_RIGHT); keyboard.set("turnLeft", KeyInput.KEY_LEFT); }

/** * setActions define los triggers para las teclas, * para que hagan la accion que queremos cuando pulsamos. */
private void setActions(moto node) { AvanzarRetroceder forward = new AvanzarRetroceder(node, AvanzarRetroceder.FORWARD); addAction(forward, "forward", true); AvanzarRetroceder backward = new AvanzarRetroceder(node, AvanzarRetroceder.BACKWARD); addAction(backward, "backward", true); RotacionMoto rotateLeft = new RotacionMoto(node, RotacionMoto.LEFT); addAction(rotateLeft, "turnLeft", true); RotacionMoto rotateRight = new RotacionMoto(node, RotacionMoto.RIGHT); addAction(rotateRight, "turnRight", true); drift = new AccionDerrape(node); } }

escenario.java

view plain

print

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155.

package Intento1; import import import import import import import import import import import import import import com.jme.bounding.BoundingBox; com.jme.image.Texture; com.jme.math.FastMath; com.jme.math.Quaternion; com.jme.math.Vector3f; com.jme.renderer.Renderer; com.jme.scene.Node; com.jme.scene.SharedMesh; com.jme.scene.shape.Box; com.jme.scene.shape.Cylinder; com.jme.scene.state.BlendState; com.jme.scene.state.TextureState; com.jme.system.DisplaySystem; com.jme.util.TextureManager;

public class escenario extends Node { private static final long serialVersionUID = 1L; private Texture t; public escenario(String name) { super(name); buildFence(); }

/** * Tiene este metodo ya que se creara una especie de campo y con este metodo * lo podemos animar */
public void update(float interpolation) {

/** * Se usara el valor de interpolation para mantener la velocidad del * campo de fuerza constante. */
t.getTranslation().y += 0.3f * interpolation; if(t.getTranslation().y > 1) { t.getTranslation().y = 0; } }

/** * buildFence crea la geometria de la valla */


private void buildFence() { Cylinder postGeometry = new Cylinder("post", 10, 10, 1, 10); Quaternion q = new Quaternion(); q.fromAngleAxis(FastMath.PI/ 2, new Vector3f(1,0,0)); postGeometry.setLocalRotation(q); postGeometry.setModelBound( new BoundingBox()); postGeometry.updateModelBound();

/** * creamos los 4 postes, no es buena idea que compartamos la estructura * asi que usaremos los valores locales */
SharedMesh post1 = new SharedMesh("post1", postGeometry); post1.setLocalTranslation( new Vector3f(0,0.5f,0)); SharedMesh post2 = new SharedMesh("post2", postGeometry); post2.setLocalTranslation( new Vector3f(32,0.5f,0)); SharedMesh post3 = new SharedMesh("post3", postGeometry); post3.setLocalTranslation( new Vector3f(0,0.5f,32)); SharedMesh post4 = new SharedMesh("post4", postGeometry); post4.setLocalTranslation( new Vector3f(32,0.5f,32));

/** * este sera el cilindro maestro qe mantendra el campo de fuerza * en su sitio */


Cylinder strutGeometry = new Cylinder("strut", 10,10, 0.125f, 32); strutGeometry.setModelBound( new BoundingBox()); strutGeometry.updateModelBound();

/** * Otra vez tenemos que compartir esta estrucutra asi qeu la rotaremos * para hacer las conextsiones */
SharedMesh strut1 = new SharedMesh("strut1", strutGeometry); Quaternion rotate90 = new Quaternion(); rotate90.fromAngleAxis(FastMath.PI/ 2, new Vector3f(0,1,0)); strut1.setLocalRotation(rotate90); strut1.setLocalTranslation( new Vector3f(16,3f,0)); SharedMesh strut2 = new SharedMesh("strut2", strutGeometry); strut2.setLocalTranslation( new Vector3f(0,3f,16)); SharedMesh strut3 = new SharedMesh("strut3", strutGeometry); strut3.setLocalTranslation( new Vector3f(32,3f,16)); SharedMesh strut4 = new SharedMesh("strut4", strutGeometry); strut4.setLocalRotation(rotate90); strut4.setLocalTranslation( new Vector3f(16,3f,32));

/** * Crea el campo de fuerza * La primera caja controla el eje x, la segunda el eje z. * No se rota la caja para ensear que se pueden crear de varias formas. */
Box forceFieldX = new Box("forceFieldX", new Vector3f(-16, -3f, -0.1f), new Vector3f(16f, 3f, 0.1f)); forceFieldX.setModelBound( new BoundingBox()); forceFieldX.updateModelBound();

/** * Tambien compartiremos estas cajas */


SharedMesh forceFieldX1 = new SharedMesh("forceFieldX1",forceFieldX); forceFieldX1.setLocalTranslation( new Vector3f(16,0,0)); SharedMesh forceFieldX2 = new SharedMesh("forceFieldX2",forceFieldX); forceFieldX2.setLocalTranslation( new Vector3f(16,0,32));

Box forceFieldZ = new Box("forceFieldZ", new Vector3f(-0.1f, -3f, -16), new Vector3f(0.1f, 3f, 16)); forceFieldZ.setModelBound( new BoundingBox()); forceFieldZ.updateModelBound(); SharedMesh forceFieldZ1 = new SharedMesh("forceFieldZ1",forceFieldZ); forceFieldZ1.setLocalTranslation( new Vector3f(0,0,16)); SharedMesh forceFieldZ2 = new SharedMesh("forceFieldZ2",forceFieldZ); forceFieldZ2.setLocalTranslation( new Vector3f(32,0,16));

/** * se aade todos los campos de fuerza a un solo nodo y se le hace parte * de la zona transparente. */
Node forceFieldNode = new Node("forceFieldNode"); forceFieldNode.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT); forceFieldNode.attachChild(forceFieldX1); forceFieldNode.attachChild(forceFieldX2); forceFieldNode.attachChild(forceFieldZ1); forceFieldNode.attachChild(forceFieldZ2);

/** * se aade los valores alfa para el nodo transparente */


BlendState as1 = DisplaySystem.getDisplaySystem().getRenderer().createBlendState(); as1.setBlendEnabled( true); as1.setSourceFunction(BlendState.SourceFunction.SourceAlpha); as1.setDestinationFunction(BlendState.DestinationFunction.One); as1.setTestEnabled( true); as1.setTestFunction(BlendState.TestFunction.GreaterThan); as1.setEnabled( true); forceFieldNode.setRenderState(as1);

/** * cargamos la textura para el campo de fuerza */


TextureState ts = DisplaySystem.getDisplaySystem().getRenderer().createTextureState(); t = TextureManager.loadTexture(Leccion2. class.getClassLoader() .getResource( "Intento1/texturas/reflector.jpg" ), Texture.MinificationFilter.Trilinear, Texture.MagnificationFilter.Bilinear);

RotacionMoto.java
view plain print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61.

package Intento1; import import import import import com.jme.input.action.InputActionEvent; com.jme.input.action.KeyInputAction; com.jme.math.FastMath; com.jme.math.Matrix3f; com.jme.math.Vector3f;

public class RotacionMoto extends KeyInputAction { public static final int RIGHT = 0; public static final int LEFT = 1;

/** * Variables temporales para la rotacion */


private static final Matrix3f incr = new Matrix3f(); private static final Matrix3f tempMa = new Matrix3f(); private static final Matrix3f tempMb = new Matrix3f();

private Vector3f upAxis = new Vector3f(0,1,0); private moto vehicle; private int direction; private int modifier = 1;

public RotacionMoto(moto vehicle, int direction) { this.vehicle = vehicle; this.direction = direction; }

/** * giraremos por su velocidad de giro. Si vmaos marcha atras girara al reves */
public void performAction(InputActionEvent evt) { if(vehicle.getVelocity() > -FastMath.FLT_EPSILON && vehicle.getVelocity() < FastMath.FLT_EPSILON) { return; } if(direction == LEFT) { modifier = 1; } else if(direction == RIGHT) { modifier = 1; } if(vehicle.getVelocity() < 0) { incr.fromAngleNormalAxis(-modifier * vehicle.getTurnSpeed() * evt.getTime(), upAxis); } else { incr.fromAngleNormalAxis(modifier * vehicle.getTurnSpeed() * evt.getTime(), upAxis); } vehicle.getLocalRotation().fromRotationMatrix( incr.mult(vehicle.getLocalRotation().toRotationMatrix(tempMa), tempMb)); vehicle.getLocalRotation().normalize(); vehicle.setRotateOn(modifier); } }

AvanzarRetroceder.java
view plain print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.

package Intento1; import com.jme.input.action.InputActionEvent; import com.jme.input.action.KeyInputAction;

public class AvanzarRetroceder extends KeyInputAction { public static final int FORWARD = 0; public static final int BACKWARD = 1; private moto node; private int direction;

public AvanzarRetroceder(moto node, int direction) { this.node = node; this.direction = direction; }

/** * la accion llama a los metodos de accelerate o brake que son los que ajustan su velocidad */
public void performAction(InputActionEvent evt) { if(direction == FORWARD) { node.accelerate(evt.getTime()); } else if(direction == BACKWARD){ node.brake(evt.getTime()); } } }

AccionDerrape.java
view plain print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

package Intento1; import com.jme.input.action.InputActionEvent; import com.jme.input.action.KeyInputAction;

public class AccionDerrape extends KeyInputAction { private moto vehicle; public AccionDerrape(moto vehicle) { this.vehicle = vehicle; }

/** * la accion llama al metodo drift de la moto */


public void performAction(InputActionEvent evt) { vehicle.drift(evt.getTime()); } }

juego.java

view plain

print

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155.

package Intento1;

import import import import import

java.io.IOException; java.net.URL; java.util.HashMap; java.util.logging.Level; java.util.logging.Logger;

import javax.swing.ImageIcon; import jmetest.renderer.ShadowTweaker; import jmetest.renderer.TestSkybox; import jmetest.terrain.TestTerrain; import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import com.jme.app.BaseGame; com.jme.bounding.BoundingBox; com.jme.image.Texture; com.jme.input.ChaseCamera; com.jme.input.InputHandler; com.jme.input.KeyBindingManager; com.jme.input.KeyInput; com.jme.input.thirdperson.ThirdPersonMouseLook; com.jme.intersection.BoundingCollisionResults; com.jme.intersection.CollisionResults; com.jme.light.DirectionalLight; com.jme.math.FastMath; com.jme.math.Vector3f; com.jme.renderer.Camera; com.jme.renderer.ColorRGBA; com.jme.renderer.Renderer; com.jme.renderer.pass.BasicPassManager; com.jme.renderer.pass.RenderPass; com.jme.renderer.pass.ShadowedRenderPass; com.jme.scene.Node; com.jme.scene.Skybox; com.jme.scene.Spatial; com.jme.scene.Text; com.jme.scene.state.CullState; com.jme.scene.state.LightState; com.jme.scene.state.MaterialState; com.jme.scene.state.TextureState; com.jme.scene.state.ZBufferState; com.jme.system.DisplaySystem; com.jme.system.JmeException; com.jme.util.TextureManager; com.jme.util.Timer; com.jme.util.export.binary.BinaryImporter; com.jmex.terrain.TerrainBlock; com.jmex.terrain.util.MidPointHeightMap; com.jmex.terrain.util.ProceduralTextureGenerator;

public class juego extends BaseGame { private static final Logger logger = Logger.getLogger(juego. class .getName());

// El terreno donde andara nuestra moto.


private TerrainBlock tb;

// La valla que nos mantendra en el escenario.


private escenario fence;

//La caja que contiene el cielo (la actualizaremos en cada frame).


private Skybox skybox;

//el jugador que moveremos.


private moto player;

//private ChaseCamera chaser;


protected InputHandler input;

//Variable de tiempo que se usa para las velocidades


protected Timer timer;

//La camara
private Camera cam;

//La camara que sigue a nuestro jugador


private ChaseCamera chaser;

//El nodo principal del juego


protected Node scene;

/** * los atributos par ala ventana */


private int width, height, depth, freq; private boolean fullscreen;

//almacena el vector normal del terreno


private Vector3f normal = new Vector3f();

//Altura sobre el nivel el suelo


private float agl; private static ShadowedRenderPass shadowPass = new ShadowedRenderPass(); private BasicPassManager passManager; public static void main(String[] args) { juego app = new juego(); app.setConfigShowMode(ConfigShowMode.AlwaysShow, juego. class .getClassLoader().getResource( "Intento1/imagenes/Autentia.jpg" )); new ShadowTweaker(shadowPass).setVisible( true); app.start(); }

/** * durante la actualizacion de la pantalla miraremos si se ha pulsado el boton * escape. */


protected void update(float interpolation) {

// actualizacion del framerate


timer.update(); interpolation = timer.getTimePerFrame();

//actualizacion de las entradas de teclado para que el jugador se mueva


input.update(interpolation);

//actualizacion de la camara
chaser.update(interpolation);

//actualizacion de la valla del campo de fuerza


fence.update(interpolation);

/** * queremos que el cielose mantenga a la vista asi que lo moveremos * con la camara */
skybox.setLocalTranslation(cam.getLocation()); skybox.updateGeometricState( 0, true);

//cuando pulsemos la tecla escape salimos


if (KeyBindingManager.getKeyBindingManager().isValidCommand( "exit")) { finished = true; }

/** * no qeuremos que la camara de seguimiento pueda ir por debajo del mundo, * asi que lo mantenemos siempre 2 unidades por encima */
if(cam.getLocation().y < (tb.getHeight(cam.getLocation())+ 2)) { cam.getLocation().y = tb.getHeight(cam.getLocation()) +2; cam.update(); }

/** *Nos aseguramos de que el jugador no choca por abandonar el nivel(esto nos sera mas util cuando * aadamos colisiones) */
float characterMinHeight = tb.getHeight(player .getLocalTranslation())+agl; if (!Float.isInfinite(characterMinHeight) && !Float.isNaN(characterMinHeight)) { player.getLocalTranslation().y = characterMinHeight; }

/** * cogemos el vector normal del terreno en la posicion actual de la moto * y se la aplicamos al vector de subida del jugador */

Para cualquier duda de los metodos y las clases de JMonkey Engine se peude consultar http://www.jmonkeyengine.com/doc/ ):

Con esto ya tenemos una moto funcional, es decir qeue se mueve alrededor del escenario sin problemas, en el siguiente tutorial os diremos como aadir colisiones.

Esperemos que les haya sido til este tutorial, seguiremos haciendo ms tutoriales sobre esta tecnologa analizando ms ejemplos algo ms complicados, todo el que quiera hacer una aportacin sra bien recibida. Para comunicarme cualquier problema o sugerencia de mejora podes utilizar la zona de comentarios, de este modo todo el mundo se podr aprovechar de las respuestas. Saludos.

Qu te ha parecido el tutorial? Djanos saber tu opinin y vota!


Muy malo Malo Regular Bueno Muy bueno

Votar

Anmate y comntanos lo que pienses sobre este tutorial


Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con tu ayuda, podemos ofrecerte un mejor servicio.

Nombre:

E-Mail:

Comentario:

Enviar comentario

Texto Legal y condiciones de uso

Puedes inscribirte en nuestro servicio de notificaciones haciendo clic aqu. Puedes firmar en nuestro libro de visitas haciendo clic aqu. Puedes asociarte al grupo AdictosAlTrabajo en XING haciendo clic aqu. Aadir a favoritos Technorati.
Esta obra est licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.5

Recuerda
Autentia te regala la mayora del conocimiento aqu compartido (Ver todos los tutoriales). Somos expertos en: J2EE, Struts, JSF, C++, OOP, UML, UP, Patrones de diseo ... y muchas otras cosas.

Nos vas a tener en cuenta cuando necesites consultora o formacin en tu empresa?, Vas a ser tan generoso con nosotros como lo tratamos de ser con vosotros?
Somos pocos, somos buenos, estamos motivados y nos gusta lo que hacemos ... Autentia = Soporte a Desarrollo & Formacin. info@autentia.com

Tutoriales recomendados
Nombre Resumen Fecha Visitas Valoracin Votos Pdf

Nota:
Los tutoriales mostrados en este Web tienen como objetivo la difusin del conocimiento. Los contenidos y comentarios de los tutoriales son responsabilidad de sus respectivos autores. En algn caso se puede hacer referencia a marcas o nombres cuya propiedad y derechos es de sus respectivos dueos. Si algn afectado desea que incorporemos alguna resea especfica, no tiene ms que solicitarlo. Si alguien encuentra algn problema con la informacin publicada en este Web, rogamos que informe al administradorrcanales@adictosaltrabajo.com para su resolucin.

You might also like