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 |
|||
|
|||
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 { |
|||
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) |
@ -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