Documente Academic
Documente Profesional
Documente Cultură
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
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)
En formato comic...
Web www.adictosaltrabajo.com
Buscar
ltimos tutoriales
2009-07-14
Ajax tests con Selenium: prototype.js e ICEfaces. Descargar este documento en formato PDF: JMonkeyEngine-Primer-Juego.pdf
2009-07-08
2009-07-07
2009-07-07
2009-07-06
2009-07-06
2009-07-05
2009-07-02
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
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":
2009-06-10
2009-06-10
2009-02-26
2009-06-08
2009-06-05
2009-06-01
2009-05-29
2009-05-28
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
2009-05-21
2009-05-11
Introduccin a TortoiseSVN
2009-05-07
2009-05-02
2009-04-26
2009-04-24
2009-04-20
2009-04-16
2009-04-16
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
2009-04-14
2009-04-13
2009-04-13
2009-04-13
2009-04-09
2009-04-02
2009-03-31
Integrar Liferay Portal 5.2.1 con Pentaho BI 2.0.0 sobre MySQL 5.1
2009-03-31
2009-03-30
2009-03-29
2009-03-27
2009-03-26
2009-03-25
A1 Website Analyzer
2009-03-24
2009-03-20
2009-03-16
2009-03-15
2009-06-20
2009-06-19
2009-06-17
Anuncios Google
texturas
view plain
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;
//
//
/** * rorateWheels hace que las ruedas rotan un cierto angulo * segun la velocidad * de la moto. */
private void rotateWheels(float time) {
/** * 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) {
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 {
/** * 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
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; } }
/** * 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));
/** * 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();
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);
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;
private Vector3f upAxis = new Vector3f(0,1,0); private moto vehicle; private int direction; private int modifier = 1;
/** * 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.
public class AvanzarRetroceder extends KeyInputAction { public static final int FORWARD = 0; public static final int BACKWARD = 1; private moto node; private int 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.
public class AccionDerrape extends KeyInputAction { private moto vehicle; public AccionDerrape(moto vehicle) { this.vehicle = vehicle; }
juego.java
view plain
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 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());
//La camara
private Camera cam;
//actualizacion de la camara
chaser.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);
/** * 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.
Votar
Nombre:
E-Mail:
Comentario:
Enviar comentario
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.