Testing out JmonkeyEngine to make a game in Scala with Akka Actors within a pure FP layer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.2 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package wow.doge.mygame.game.subsystems.level
  2. import com.jme3.asset.AssetManager
  3. import com.jme3.bullet.control.RigidBodyControl
  4. import com.jme3.bullet.util.CollisionShapeFactory
  5. import com.jme3.light.AmbientLight
  6. import com.jme3.light.DirectionalLight
  7. import com.jme3.math.ColorRGBA
  8. import com.jme3.math.Vector3f
  9. import com.jme3.renderer.ViewPort
  10. import com.jme3.scene.Spatial
  11. import monix.bio.IO
  12. import monix.bio.UIO
  13. import wow.doge.mygame.AppError
  14. object DefaultGameLevel {
  15. def apply(
  16. assetManager: AssetManager,
  17. viewPort: ViewPort
  18. ) = {
  19. val sceneModel: Spatial = assetManager.loadModel("main.scene")
  20. val sceneShape = CollisionShapeFactory.createMeshShape(
  21. sceneModel.toNode match {
  22. case Right(node) => node
  23. case Left(ex) =>
  24. throw new NotImplementedError("No fallback sceneshape")
  25. }
  26. )
  27. val landscape: RigidBodyControl = new RigidBodyControl(sceneShape, 0)
  28. viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f))
  29. sceneModel.setLocalScale(2f)
  30. sceneModel.addControl(landscape)
  31. // discard { rootNode.attachChild(sceneModel) }
  32. // bulletAppState.getPhysicsSpace.add(landscape)
  33. // bulletAppState.getPhysicsSpace.add(player)
  34. val al = new AmbientLight();
  35. al.setColor(ColorRGBA.White.mult(1.3f));
  36. // app.rootNode.addLight(al);
  37. val dl = new DirectionalLight();
  38. dl.setColor(ColorRGBA.White);
  39. dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal());
  40. // app.rootNode.addLight(dl);
  41. new GameLevel(
  42. model = sceneModel,
  43. physicsControl = landscape,
  44. ambientLight = al,
  45. directionalLight = dl
  46. )
  47. }
  48. def apply(
  49. assetManager: wow.doge.mygame.utils.wrappers.jme.AssetManager,
  50. viewPort: ViewPort
  51. ): IO[AppError, GameLevel] =
  52. // for {
  53. // sceneModel <- assetManager.loadModelAs[Node](os.rel / "main.scene")
  54. // sceneShape <- UIO(CollisionShapeFactory.createMeshShape(sceneModel))
  55. // landscape <- UIO(new RigidBodyControl(sceneShape, 0))
  56. // _ <- UIO {
  57. // viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f))
  58. // sceneModel.setLocalScale(2f)
  59. // sceneModel.addControl(landscape)
  60. // }
  61. // al = {
  62. // val al = new AmbientLight()
  63. // al.setColor(ColorRGBA.White.mult(1.3f))
  64. // al
  65. // }
  66. // dl = {
  67. // val dl = new DirectionalLight()
  68. // dl.setColor(ColorRGBA.White)
  69. // dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal())
  70. // dl
  71. // }
  72. // } yield new GameLevel(
  73. // model = sceneModel,
  74. // physicsControl = landscape,
  75. // ambientLight = al,
  76. // directionalLight = dl
  77. // )
  78. GameLevel(
  79. os.rel / "main.scene", {
  80. val al = new AmbientLight()
  81. al.setColor(ColorRGBA.White.mult(1.3f))
  82. al
  83. }, {
  84. val dl = new DirectionalLight()
  85. dl.setColor(ColorRGBA.White)
  86. dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal())
  87. dl
  88. }
  89. )(assetManager).flatMap(gameLevel =>
  90. UIO {
  91. viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f))
  92. gameLevel.model.setLocalScale(2f)
  93. gameLevel.model.addControl(gameLevel.physicsControl)
  94. gameLevel
  95. }
  96. )
  97. }