forked from nova/jmonkey-test
Rohan Sircar
3 years ago
15 changed files with 266 additions and 123 deletions
-
5src/main/scala/message.txt
-
68src/main/scala/wow/doge/mygame/MainApp.scala
-
66src/main/scala/wow/doge/mygame/game/GameApp.scala
-
18src/main/scala/wow/doge/mygame/game/SimpleAppExt.scala
-
2src/main/scala/wow/doge/mygame/game/entities/NpcActorSupervisor.scala
-
39src/main/scala/wow/doge/mygame/game/entities/player/PlayerController.scala
-
3src/main/scala/wow/doge/mygame/game/subsystems/input/GameInputHandler.scala
-
20src/main/scala/wow/doge/mygame/game/subsystems/level/GameLevel.scala
-
4src/main/scala/wow/doge/mygame/implicits/package.scala
-
4src/main/scala/wow/doge/mygame/launcher/Launcher.scala
-
21src/main/scala/wow/doge/mygame/utils/Settings.scala
-
7src/main/scala/wow/doge/mygame/utils/package.scala
-
76src/main/scala/wow/doge/mygame/utils/wrappers/jme/Node.scala
-
53src/main/scala/wow/doge/mygame/utils/wrappers/jme/PhysicsSpace.scala
-
3src/main/scala/wow/doge/mygame/utils/wrappers/jme/node/package.scala
@ -1,5 +0,0 @@ |
|||||
Hey guys, few days ago I discovered I could load objects created in scripts at runtime, and cast them to an interface to call their methods provided |
|
||||
1. both host program and script have access to the same interface via a common library |
|
||||
2. script object implements that interface |
|
||||
|
|
||||
I was thinking, maybe I could implement appstates in scripts to implement game mechanics and attach them to the state manager at runtime, and similarly for components of an ECS. What do you guys think? |
|
@ -1,14 +1,21 @@ |
|||||
package wow.doge.mygame.utils |
package wow.doge.mygame.utils |
||||
|
|
||||
case class Display( |
case class Display( |
||||
width: Int = 640, |
|
||||
height: Int = 480, |
|
||||
title: String = "JME-Game", |
|
||||
fullScren: Boolean = false, |
|
||||
vsync: Boolean = false, |
|
||||
frameRate: Int = -1 |
|
||||
|
width: Int, |
||||
|
height: Int, |
||||
|
title: String, |
||||
|
fullScren: Boolean, |
||||
|
vsync: Boolean, |
||||
|
frameRate: Int |
||||
) |
) |
||||
object Display { |
object Display { |
||||
val default = Display() |
|
||||
|
val default = Display( |
||||
|
width = 640, |
||||
|
height = 480, |
||||
|
title = "JME-Game", |
||||
|
fullScren = false, |
||||
|
vsync = false, |
||||
|
frameRate = -1 |
||||
|
) |
||||
} |
} |
||||
case class GlobalSettings(display: Display = Display.default) |
case class GlobalSettings(display: Display = Display.default) |
@ -0,0 +1,7 @@ |
|||||
|
package wow.doge.mygame |
||||
|
|
||||
|
// import wow.doge.mygame.utils.wrappers.Node |
||||
|
|
||||
|
package object utils { |
||||
|
// type AppNode = Node |
||||
|
} |
@ -0,0 +1,76 @@ |
|||||
|
package wow.doge.mygame.utils.wrappers.jme |
||||
|
|
||||
|
import cats.effect.Sync |
||||
|
import com.jme3.{scene => jmes} |
||||
|
import monix.execution.annotations.UnsafeBecauseImpure |
||||
|
import monix.reactive.Observable |
||||
|
import wow.doge.mygame.implicits._ |
||||
|
import com.jme3.light.Light |
||||
|
|
||||
|
trait NodeDelegate { |
||||
|
|
||||
|
/** |
||||
|
* Get the underlying wrapped value |
||||
|
*/ |
||||
|
@UnsafeBecauseImpure |
||||
|
def unsafeDelegate: jmes.Node |
||||
|
} |
||||
|
|
||||
|
abstract class NodeWrapper[F[_]: Sync] protected (node: jmes.Node) { |
||||
|
def children: Observable[jmes.Spatial] = node.observableChildren |
||||
|
def attachChild(n: jmes.Spatial): F[Unit] = Sync[F].delay(node.attachChild(n)) |
||||
|
def add(wn: Node[F]): F[Unit] = |
||||
|
Sync[F].delay(node.attachChild(wn.unsafeDelegate)) |
||||
|
def remove(n: jmes.Spatial): F[Unit] = |
||||
|
Sync[F].delay(node.detachChild(n)) |
||||
|
def remove(wn: Node[F]): F[Unit] = |
||||
|
Sync[F].delay(node.detachChild(wn.unsafeDelegate)) |
||||
|
def addLight(light: Light) = |
||||
|
Sync[F].delay { |
||||
|
node.addLight(light) |
||||
|
} |
||||
|
def removeLight(light: Light) = |
||||
|
Sync[F].delay { |
||||
|
node.removeLight(light) |
||||
|
} |
||||
|
def asSpatial: F[jmes.Spatial] = Sync[F].delay(node) |
||||
|
} |
||||
|
object NodeWrapper { |
||||
|
implicit class NodeOps[F[_]](private val nw: NodeWrapper[F]) extends AnyVal { |
||||
|
def +=(n: jmes.Spatial) = nw.attachChild(n) |
||||
|
def +=(n: Node[F]) = nw.add(n) |
||||
|
def -=(n: jmes.Spatial) = nw.remove(n) |
||||
|
def -=(wn: Node[F]) = nw.remove(wn) |
||||
|
def +=(light: Light) = { |
||||
|
nw.addLight(light) |
||||
|
} |
||||
|
|
||||
|
def -=(light: Light) = { |
||||
|
nw.removeLight(light) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
final class Node[F[_]: Sync] private (node: jmes.Node) |
||||
|
extends NodeWrapper[F](node) |
||||
|
with NodeDelegate { |
||||
|
|
||||
|
/** |
||||
|
* Get the underlying wrapped value |
||||
|
*/ |
||||
|
@UnsafeBecauseImpure |
||||
|
def unsafeDelegate = node |
||||
|
} |
||||
|
object Node { |
||||
|
def apply[F[_]: Sync](name: String) = new Node[F](new jmes.Node(name)) |
||||
|
def apply[F[_]: Sync](n: jmes.Node) = new Node[F](n) |
||||
|
} |
||||
|
|
||||
|
final class AppNode[F[_]: Sync] private (node: jmes.Node) |
||||
|
extends NodeWrapper[F](node) |
||||
|
object AppNode { |
||||
|
|
||||
|
def apply[F[_]: Sync](name: String) = new AppNode[F](new jmes.Node(name)) |
||||
|
def apply[F[_]: Sync](n: jmes.Node) = new AppNode[F](n) |
||||
|
|
||||
|
} |
@ -0,0 +1,53 @@ |
|||||
|
package wow.doge.mygame.utils.wrappers.jme |
||||
|
import cats.effect.Sync |
||||
|
import com.jme3.{bullet => jmeb} |
||||
|
import com.jme3.{scene => jmes} |
||||
|
import wow.doge.mygame.implicits._ |
||||
|
|
||||
|
final class PhysicsSpace[F[_]: Sync](space: jmeb.PhysicsSpace) { |
||||
|
def add(anyObject: Any) = Sync[F].delay(space.add(anyObject)) |
||||
|
|
||||
|
def remove(anyObject: Any) = |
||||
|
Sync[F].delay { |
||||
|
space.remove(anyObject) |
||||
|
space |
||||
|
} |
||||
|
|
||||
|
def addAll(spatial: jmes.Spatial) = Sync[F].delay(space.addAll(spatial)) |
||||
|
|
||||
|
def removeAll(spatial: jmes.Spatial) = |
||||
|
Sync[F].delay { |
||||
|
space.removeAll(spatial) |
||||
|
space |
||||
|
} |
||||
|
|
||||
|
def collisionObservable = space.collisionObservable() |
||||
|
def physicsTickObservable = space.physicsTickObservable() |
||||
|
} |
||||
|
object PhysicsSpace { |
||||
|
implicit final class PhysicsSpaceOps[F[_]](private val space: PhysicsSpace[F]) |
||||
|
extends AnyVal { |
||||
|
def +=(anyObject: Any) = space.add(anyObject) |
||||
|
|
||||
|
def :+(anyObject: Any) = { |
||||
|
space.add(anyObject) |
||||
|
space |
||||
|
} |
||||
|
def -(anyObject: Any) = { |
||||
|
space.remove(anyObject) |
||||
|
space |
||||
|
} |
||||
|
|
||||
|
def +=(spatial: jmes.Spatial) = space.addAll(spatial) |
||||
|
|
||||
|
def :+(spatial: jmes.Spatial) = { |
||||
|
space.addAll(spatial) |
||||
|
space |
||||
|
} |
||||
|
|
||||
|
def -(spatial: jmes.Spatial) = { |
||||
|
space.removeAll(spatial) |
||||
|
space |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
package wow.doge.mygame.utils.wrappers.jme |
||||
|
|
||||
|
package object node {} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue