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.

82 lines
2.3 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
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 cats.effect.Resource
  3. import com.jme3.bullet.control.RigidBodyControl
  4. import com.jme3.light.AmbientLight
  5. import com.jme3.light.DirectionalLight
  6. import com.jme3.scene.Node
  7. import com.jme3.scene.Spatial
  8. import com.softwaremill.tagging._
  9. import monix.bio.IO
  10. import monix.bio.UIO
  11. import wow.doge.mygame.AppError
  12. import wow.doge.mygame.game.GameAppTags
  13. import wow.doge.mygame.utils.wrappers.jme.AppNode2
  14. import wow.doge.mygame.utils.wrappers.jme.CollisionShapeFactory
  15. import wow.doge.mygame.utils.wrappers.jme.PhysicsSpace
  16. class GameLevel(
  17. val model: Spatial,
  18. val physicsControl: RigidBodyControl,
  19. val ambientLight: AmbientLight,
  20. val directionalLight: DirectionalLight
  21. ) {
  22. def addToGame(
  23. rootNode: AppNode2 @@ GameAppTags.RootNode,
  24. physicsSpace: PhysicsSpace
  25. ) =
  26. (for {
  27. _ <- rootNode += model
  28. _ <- rootNode += ambientLight
  29. _ <- rootNode += directionalLight
  30. _ <- physicsSpace += model
  31. _ <- physicsSpace += physicsControl
  32. } yield ()).mapError(AppError.AppNodeError)
  33. def removeFromGame(
  34. rootNode: AppNode2 @@ GameAppTags.RootNode,
  35. physicsSpace: PhysicsSpace
  36. ) =
  37. for {
  38. _ <- rootNode -= model
  39. _ <- rootNode -= ambientLight
  40. _ <- rootNode -= directionalLight
  41. _ <- physicsSpace -= model
  42. _ <- physicsSpace -= physicsControl
  43. } yield ()
  44. def resource(
  45. rootNode: AppNode2 @@ GameAppTags.RootNode,
  46. physicsSpace: PhysicsSpace
  47. ) =
  48. Resource.make(this.addToGame(rootNode, physicsSpace))(_ =>
  49. this.removeFromGame(rootNode, physicsSpace)
  50. )
  51. }
  52. object GameLevel {
  53. def apply(
  54. modelPath: os.RelPath,
  55. al: AmbientLight,
  56. dl: DirectionalLight
  57. )(implicit
  58. assetManager: wow.doge.mygame.utils.wrappers.jme.AssetManager
  59. ): IO[AppError, GameLevel] =
  60. for {
  61. sceneModel <-
  62. assetManager
  63. .loadModelAs[Node](modelPath)
  64. .mapError(AppError.AssetManagerError)
  65. sceneShape <-
  66. CollisionShapeFactory
  67. .createMeshShape(sceneModel)
  68. .mapError(AppError.CollisionShapeCreationFailed)
  69. landscape <- UIO(new RigidBodyControl(sceneShape, 0))
  70. } yield new GameLevel(
  71. model = sceneModel,
  72. physicsControl = landscape,
  73. ambientLight = al,
  74. directionalLight = dl
  75. )
  76. }