rngine 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +10 -7
  2. package/android/build.gradle +6 -4
  3. package/android/kls_database.db +0 -0
  4. package/android/src/main/cpp/GameLoopJNI.cpp +20 -9
  5. package/android/src/main/java/com/margelo/nitro/rngine/Asset.kt +9 -0
  6. package/android/src/main/java/com/margelo/nitro/rngine/GameAssets.kt +47 -0
  7. package/android/src/main/java/com/margelo/nitro/rngine/GameView.kt +46 -8
  8. package/android/src/main/java/com/margelo/nitro/rngine/Rect.kt +7 -5
  9. package/android/src/main/java/com/margelo/nitro/rngine/RectSerializer.kt +8 -6
  10. package/lib/module/GameAssets.nitro.js +5 -0
  11. package/lib/module/GameAssets.nitro.js.map +1 -0
  12. package/lib/module/GameMethods.js +1 -31
  13. package/lib/module/GameMethods.js.map +1 -1
  14. package/lib/module/GameMethods.nitro.js +2 -1
  15. package/lib/module/GameMethods.nitro.js.map +1 -1
  16. package/lib/module/Shared.js +72 -0
  17. package/lib/module/Shared.js.map +1 -0
  18. package/lib/module/index.js +1 -0
  19. package/lib/module/index.js.map +1 -1
  20. package/lib/module/nativeTypes.js +2 -0
  21. package/lib/module/nativeTypes.js.map +1 -0
  22. package/lib/module/types.js +2 -0
  23. package/lib/typescript/src/GameAssets.nitro.d.ts +12 -0
  24. package/lib/typescript/src/GameAssets.nitro.d.ts.map +1 -0
  25. package/lib/typescript/src/GameMethods.d.ts +0 -7
  26. package/lib/typescript/src/GameMethods.d.ts.map +1 -1
  27. package/lib/typescript/src/GameMethods.nitro.d.ts +4 -2
  28. package/lib/typescript/src/GameMethods.nitro.d.ts.map +1 -1
  29. package/lib/typescript/src/Shared.d.ts +8 -0
  30. package/lib/typescript/src/Shared.d.ts.map +1 -0
  31. package/lib/typescript/src/index.d.ts +2 -0
  32. package/lib/typescript/src/index.d.ts.map +1 -1
  33. package/lib/typescript/src/nativeTypes.d.ts +79 -0
  34. package/lib/typescript/src/nativeTypes.d.ts.map +1 -0
  35. package/lib/typescript/src/types.d.ts +11 -47
  36. package/lib/typescript/src/types.d.ts.map +1 -1
  37. package/nitro.json +10 -0
  38. package/nitrogen/generated/android/c++/JHybridGameAssetsSpec.cpp +61 -0
  39. package/nitrogen/generated/android/c++/JHybridGameAssetsSpec.hpp +65 -0
  40. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/HybridGameAssetsSpec.kt +62 -0
  41. package/nitrogen/generated/android/rngine+autolinking.cmake +2 -0
  42. package/nitrogen/generated/android/rngineOnLoad.cpp +16 -0
  43. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.cpp +17 -0
  44. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.hpp +37 -0
  45. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Umbrella.hpp +8 -0
  46. package/nitrogen/generated/ios/RngineAutolinking.mm +8 -0
  47. package/nitrogen/generated/ios/RngineAutolinking.swift +12 -0
  48. package/nitrogen/generated/ios/c++/HybridGameAssetsSpecSwift.cpp +11 -0
  49. package/nitrogen/generated/ios/c++/HybridGameAssetsSpecSwift.hpp +94 -0
  50. package/nitrogen/generated/ios/swift/HybridGameAssetsSpec.swift +57 -0
  51. package/nitrogen/generated/ios/swift/HybridGameAssetsSpec_cxx.swift +160 -0
  52. package/nitrogen/generated/shared/c++/Collision.hpp +91 -0
  53. package/nitrogen/generated/shared/c++/CollisionPair.hpp +87 -0
  54. package/nitrogen/generated/shared/c++/Entity.hpp +13 -5
  55. package/nitrogen/generated/shared/c++/EntityUpdate.hpp +9 -1
  56. package/nitrogen/generated/shared/c++/HybridGameAssetsSpec.cpp +23 -0
  57. package/nitrogen/generated/shared/c++/HybridGameAssetsSpec.hpp +64 -0
  58. package/nitrogen/generated/shared/c++/Screen.hpp +14 -5
  59. package/nitrogen/generated/shared/c++/System.hpp +20 -9
  60. package/package.json +1 -1
  61. package/shared/ColorUtils.hpp +6 -3
  62. package/shared/GameLoop.cpp +75 -12
  63. package/shared/GameLoop.hpp +2 -0
  64. package/shared/GameMethods.cpp +20 -7
  65. package/shared/Rect.hpp +8 -5
  66. package/src/GameAssets.nitro.ts +14 -0
  67. package/src/GameMethods.nitro.ts +6 -2
  68. package/src/GameMethods.ts +1 -34
  69. package/src/Shared.ts +83 -0
  70. package/src/index.tsx +2 -0
  71. package/src/nativeTypes.ts +83 -0
  72. package/src/types.ts +17 -49
package/README.md CHANGED
@@ -49,7 +49,7 @@ configure({
49
49
  systems: [
50
50
  {
51
51
  // runs every tick for all enemies
52
- ids: ['enemy'],
52
+ entities: ['enemy'],
53
53
  onTick: (enemies) => {
54
54
  enemies.forEach((enemy) => {
55
55
  // reverse direction when reaching screen edges
@@ -70,11 +70,11 @@ export default function App() {
70
70
 
71
71
  ## Concepts
72
72
 
73
- **Entities** are the objects in your game world. Each entity has a position, size, color, and velocity. See [`Entity`](./src/types.ts).
73
+ **Entities** are the objects in your game world. Each entity has a position, size, color, and velocity. See [`Entity`](./src/nativeTypes.ts).
74
74
 
75
- **Systems** define your game logic. Each system declares which entities it cares about via `ids` and runs every tick receiving those entities. See [`System`](./src/types.ts).
75
+ **Systems** define your game logic. Each system optionally declares which entities it cares about via `entities`, which collision pairs to watch via `collisions`, or both. Systems run every tick receiving the resolved entities and any active collisions. See [`System`](./src/nativeTypes.ts).
76
76
 
77
- **Screen** defines the viewport dimensions and background color. Entities outside the screen bounds are automatically clipped. See [`Screen`](./src/types.ts).
77
+ **Screen** defines the viewport dimensions and background color. Entities outside the screen bounds are automatically clipped. See [`Screen`](./src/nativeTypes.ts).
78
78
 
79
79
  ## Entity Querying
80
80
 
@@ -84,13 +84,16 @@ This makes it easy to build entity groups naturally through naming. No extra con
84
84
 
85
85
  ```ts
86
86
  // matches enemy_1, enemy_magician_1, enemy_warrior_2
87
- { ids: ['enemy'], onTick: (entities) => {} }
87
+ { entities: ['enemy'], onTick: (entities) => {} }
88
88
 
89
89
  // matches only enemy_magician_1, enemy_magician_2
90
- { ids: ['enemy_magician'], onTick: (entities) => {} }
90
+ { entities: ['enemy_magician'], onTick: (entities) => {} }
91
91
 
92
92
  // exact match
93
- { ids: ['enemy_magician_1'], onTick: (entities) => {} }
93
+ { entities: ['enemy_magician_1'], onTick: (entities) => {} }
94
+
95
+ // collision detection between the player and all enemies
96
+ { collisions: [{ a: 'player', b: 'enemy' }], onTick: (_, collisions) => {} }
94
97
  ```
95
98
 
96
99
  ## API
@@ -1,9 +1,9 @@
1
1
  buildscript {
2
2
  ext.Rngine = [
3
- kotlinVersion: "2.0.21",
4
- minSdkVersion: 24,
3
+ kotlinVersion : "2.0.21",
4
+ minSdkVersion : 24,
5
5
  compileSdkVersion: 36,
6
- targetSdkVersion: 36
6
+ targetSdkVersion : 36
7
7
  ]
8
8
 
9
9
  ext.getExtOrDefault = { prop ->
@@ -50,7 +50,7 @@ android {
50
50
  cmake {
51
51
  cppFlags "-frtti -fexceptions -Wall -fstack-protector-all"
52
52
  arguments "-DANDROID_STL=c++_shared", "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
53
- abiFilters (*reactNativeArchitectures())
53
+ abiFilters(*reactNativeArchitectures())
54
54
 
55
55
  buildTypes {
56
56
  debug {
@@ -115,4 +115,6 @@ android {
115
115
  dependencies {
116
116
  implementation "com.facebook.react:react-android"
117
117
  implementation project(":react-native-nitro-modules")
118
+ implementation 'com.caverock:androidsvg-aar:1.4'
119
+ implementation 'com.airbnb.android:lottie:6.7.1'
118
120
  }
Binary file
@@ -14,18 +14,29 @@ Java_com_margelo_nitro_rngine_GameView_getRectsSnapshot(JNIEnv *env, jobject) {
14
14
  uint8_t *data = buffer.data();
15
15
 
16
16
  for (const auto &rect : rects) {
17
- memcpy(data, &rect.left, sizeof(double));
18
- data += sizeof(double);
19
- memcpy(data, &rect.right, sizeof(double));
20
- data += sizeof(double);
21
- memcpy(data, &rect.top, sizeof(double));
22
- data += sizeof(double);
23
- memcpy(data, &rect.bottom, sizeof(double));
24
- data += sizeof(double);
25
- memcpy(data, &rect.color, sizeof(uint32_t));
17
+ memcpy(data, &rect.left, sizeof(float));
18
+ data += sizeof(float);
19
+ memcpy(data, &rect.right, sizeof(float));
20
+ data += sizeof(float);
21
+ memcpy(data, &rect.top, sizeof(float));
22
+ data += sizeof(float);
23
+ memcpy(data, &rect.bottom, sizeof(float));
24
+ data += sizeof(float);
25
+ memcpy(data, &rect.progress, sizeof(float));
26
+ data += sizeof(float);
27
+ memcpy(data, &rect.color, sizeof(uint32_t));
26
28
  data += sizeof(uint32_t);
29
+ memcpy(data, &rect.asset, sizeof(int32_t));
30
+ data += sizeof(int32_t);
27
31
  }
28
32
 
29
33
  return env->NewDirectByteBuffer(buffer.data(), (jlong)size);
30
34
  }
35
+
36
+ JNIEXPORT void JNICALL
37
+ Java_com_margelo_nitro_rngine_GameAssets_registerLottieDuration(
38
+ JNIEnv *, jobject, jdouble id, jdouble duration) {
39
+ margelo::nitro::rngine::GameLoop::getInstance().registerLottieDuration(
40
+ id, duration);
41
+ }
31
42
  } // extern "C"
@@ -0,0 +1,9 @@
1
+ package com.margelo.nitro.rngine
2
+
3
+ import android.graphics.Picture
4
+ import com.airbnb.lottie.LottieDrawable
5
+
6
+ sealed class Asset {
7
+ class Svg(val picture: Picture) : Asset()
8
+ class Lottie(val drawable: LottieDrawable) : Asset()
9
+ }
@@ -0,0 +1,47 @@
1
+ package com.margelo.nitro.rngine
2
+
3
+ import android.util.Log
4
+ import com.airbnb.lottie.LottieCompositionFactory
5
+ import com.airbnb.lottie.LottieDrawable
6
+ import com.caverock.androidsvg.SVG
7
+ import java.net.URL
8
+
9
+ class GameAssets : HybridGameAssetsSpec() {
10
+ private external fun registerLottieDuration(id: Double, duration: Double)
11
+
12
+ companion object {
13
+ private val assetCache = HashMap<Int, Asset>()
14
+ fun getAsset(id: Int): Asset? = assetCache[id]
15
+ }
16
+
17
+ override fun isAssetRegistered(id: Double): Boolean {
18
+ return id.toInt() in assetCache
19
+ }
20
+
21
+ override fun registerSvg(id: Double, uri: String) {
22
+ try {
23
+ val stream = URL(uri).openStream()
24
+ assetCache[id.toInt()] = Asset.Svg(SVG.getFromInputStream(stream).renderToPicture())
25
+ Log.d("GameAssets", "assetCache: $assetCache")
26
+ } catch (e: Exception) {
27
+ Log.e("GameAssets", "Failed to parse SVG: $uri", e)
28
+ }
29
+ }
30
+
31
+ override fun registerLottie(id: Double, json: String) {
32
+ try {
33
+ val composition = LottieCompositionFactory.fromJsonStringSync(json, null).value
34
+ if (composition == null) {
35
+ Log.e("GameAssets", "Failed to parse Lottie JSON for id: $id")
36
+ return
37
+ }
38
+ val drawable = LottieDrawable()
39
+ drawable.composition = composition
40
+ assetCache[id.toInt()] = Asset.Lottie(drawable)
41
+ registerLottieDuration(id, composition.duration.toDouble() / 1000)
42
+ Log.d("GameAssets", "assetCache: $assetCache")
43
+ } catch (e: Exception) {
44
+ Log.e("GameAssets", "Failed to register Lottie: $id", e)
45
+ }
46
+ }
47
+ }
@@ -4,9 +4,12 @@ import android.content.Context
4
4
  import android.graphics.Color
5
5
  import android.graphics.Paint
6
6
  import android.util.AttributeSet
7
+ import android.util.Log
7
8
  import android.view.SurfaceView
8
9
  import android.view.View
9
10
  import java.nio.ByteBuffer
11
+ import androidx.core.graphics.withTranslation
12
+ import androidx.core.graphics.withClip
10
13
 
11
14
  class GameView(
12
15
  context: Context,
@@ -41,22 +44,57 @@ class GameView(
41
44
  val rects = RectSerializer.decode(getRectsSnapshot())
42
45
 
43
46
  val worldRect = rects.first()
44
- val scaleX = canvas.width / worldRect.right.toFloat()
45
- val scaleY = canvas.height / worldRect.bottom.toFloat()
47
+ val scaleX = canvas.width / worldRect.right
48
+ val scaleY = canvas.height / worldRect.bottom
46
49
  val scale = minOf(scaleX, scaleY)
47
50
 
48
- val offsetX = (canvas.width - worldRect.right.toFloat() * scale) / 2f
49
- val offsetY = (canvas.height - worldRect.bottom.toFloat() * scale) / 2f
51
+ val offsetX = (canvas.width - worldRect.right * scale) / 2f
52
+ val offsetY = (canvas.height - worldRect.bottom * scale) / 2f
50
53
 
51
54
  rects.forEach { rect ->
55
+ val left = rect.left * scale + offsetX
56
+ val top = rect.top * scale + offsetY
57
+ val right = rect.right * scale + offsetX
58
+ val bottom = rect.bottom * scale + offsetY
59
+
60
+ val clampedLeft = left.coerceAtLeast(offsetX)
61
+ val clampedTop = top.coerceAtLeast(offsetY)
62
+ val clampedRight = right.coerceAtMost(offsetX + worldRect.right * scale)
63
+ val clampedBottom = bottom.coerceAtMost(offsetY + worldRect.bottom * scale)
64
+
52
65
  paint.color = rect.color
53
66
  canvas.drawRect(
54
- rect.left.toFloat() * scale + offsetX,
55
- rect.top.toFloat() * scale + offsetY,
56
- rect.right.toFloat() * scale + offsetX,
57
- rect.bottom.toFloat() * scale + offsetY,
67
+ clampedLeft,
68
+ clampedTop,
69
+ clampedRight,
70
+ clampedBottom,
58
71
  paint
59
72
  )
73
+ when(val asset = GameAssets.getAsset(rect.asset)){
74
+ is Asset.Svg -> {
75
+ canvas.withClip(clampedLeft, clampedTop, clampedRight, clampedBottom) {
76
+ withTranslation(left, top) {
77
+ scale(
78
+ (right - left) / asset.picture.width,
79
+ (bottom - top) / asset.picture.height
80
+ )
81
+ drawPicture(asset.picture)
82
+ }
83
+ }
84
+ }
85
+
86
+ is Asset.Lottie -> {
87
+ canvas.withClip(clampedLeft, clampedTop, clampedRight, clampedBottom) {
88
+ withTranslation(left, top) {
89
+ asset.drawable.progress = rect.progress
90
+ asset.drawable.setBounds(0, 0, (right - left).toInt(), (bottom - top).toInt())
91
+ asset.drawable.draw(canvas)
92
+ }
93
+ }
94
+ }
95
+
96
+ null -> {}
97
+ }
60
98
  }
61
99
  holder.unlockCanvasAndPost(canvas)
62
100
  }
@@ -1,9 +1,11 @@
1
1
  package com.margelo.nitro.rngine
2
2
 
3
3
  data class Rect(
4
- val left: Double,
5
- val right: Double,
6
- val top: Double,
7
- val bottom: Double,
8
- val color: Int
4
+ val left: Float,
5
+ val right: Float,
6
+ val top: Float,
7
+ val bottom: Float,
8
+ val progress: Float,
9
+ val color: Int,
10
+ val asset: Int
9
11
  )
@@ -4,19 +4,21 @@ import java.nio.ByteBuffer
4
4
  import java.nio.ByteOrder
5
5
 
6
6
  object RectSerializer {
7
- private const val RECT_SIZE = 4 * 8 + 4
7
+ private const val RECT_SIZE = 4 * 5 + 4 * 2
8
8
  fun decode(buffer: ByteBuffer): ArrayList<Rect> {
9
9
  buffer.order(ByteOrder.nativeOrder())
10
10
  val rects = ArrayList<Rect>()
11
11
 
12
12
  while (buffer.remaining() >= RECT_SIZE) {
13
- val left = buffer.double
14
- val right = buffer.double
15
- val top = buffer.double
16
- val bottom = buffer.double
13
+ val left = buffer.float
14
+ val right = buffer.float
15
+ val top = buffer.float
16
+ val bottom = buffer.float
17
+ val progress = buffer.float
17
18
  val color = buffer.int
19
+ val asset = buffer.int
18
20
 
19
- rects.add(Rect(left, right, top, bottom, color))
21
+ rects.add(Rect(left, right, top, bottom, progress, color, asset))
20
22
  }
21
23
  return rects
22
24
  }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ export const gameAssets = NitroModules.createHybridObject('GameAssets');
5
+ //# sourceMappingURL=GameAssets.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NitroModules","gameAssets","createHybridObject"],"sourceRoot":"../../src","sources":["GameAssets.nitro.ts"],"mappings":";;AACA,SAASA,YAAY,QAAQ,4BAA4B;AAWzD,OAAO,MAAMC,UAAU,GACrBD,YAAY,CAACE,kBAAkB,CAAa,YAAY,CAAC","ignoreList":[]}
@@ -1,26 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import { NitroModules } from 'react-native-nitro-modules';
4
- const gameMethods = NitroModules.createHybridObject('GameMethods');
5
-
6
- /** Sets up the game engine with the given configuration. Call this before anything else. */
7
- export function configure({
8
- tickRate,
9
- screen,
10
- entities = [],
11
- systems = [],
12
- paused = true
13
- }) {
14
- gameMethods.setTickRate(tickRate);
15
- gameMethods.setScreen(screen);
16
- gameMethods.setEntities(entities);
17
- gameMethods.setSystems(systems);
18
- if (paused) {
19
- gameMethods.pause();
20
- } else {
21
- gameMethods.resume();
22
- }
23
- }
3
+ import { gameMethods } from "./GameMethods.nitro.js";
24
4
 
25
5
  /** Pauses the game loop. Systems will stop running. */
26
6
  export const pause = () => gameMethods.pause();
@@ -28,16 +8,6 @@ export const pause = () => gameMethods.pause();
28
8
  /** Resumes the game loop. */
29
9
  export const resume = () => gameMethods.resume();
30
10
 
31
- /** Spawns one or more entities into the world. Skips duplicates by id. */
32
- export const spawn = entities => {
33
- gameMethods.spawn(Array.isArray(entities) ? entities : [entities]);
34
- };
35
-
36
11
  /** Removes an entity or all entities matching the given id prefix from the world. */
37
12
  export const despawn = id => gameMethods.despawn(id);
38
-
39
- /** Updates one or more entities. Only the provided fields are changed. */
40
- export const update = updates => {
41
- gameMethods.update(Array.isArray(updates) ? updates : [updates]);
42
- };
43
13
  //# sourceMappingURL=GameMethods.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NitroModules","gameMethods","createHybridObject","configure","tickRate","screen","entities","systems","paused","setTickRate","setScreen","setEntities","setSystems","pause","resume","spawn","Array","isArray","despawn","id","update","updates"],"sourceRoot":"../../src","sources":["GameMethods.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAIzD,MAAMC,WAAW,GAAGD,YAAY,CAACE,kBAAkB,CAAc,aAAa,CAAC;;AAE/E;AACA,OAAO,SAASC,SAASA,CAAC;EACxBC,QAAQ;EACRC,MAAM;EACNC,QAAQ,GAAG,EAAE;EACbC,OAAO,GAAG,EAAE;EACZC,MAAM,GAAG;AACH,CAAC,EAAE;EACTP,WAAW,CAACQ,WAAW,CAACL,QAAQ,CAAC;EACjCH,WAAW,CAACS,SAAS,CAACL,MAAM,CAAC;EAC7BJ,WAAW,CAACU,WAAW,CAACL,QAAQ,CAAC;EACjCL,WAAW,CAACW,UAAU,CAACL,OAAO,CAAC;EAC/B,IAAIC,MAAM,EAAE;IACVP,WAAW,CAACY,KAAK,CAAC,CAAC;EACrB,CAAC,MAAM;IACLZ,WAAW,CAACa,MAAM,CAAC,CAAC;EACtB;AACF;;AAEA;AACA,OAAO,MAAMD,KAAK,GAAGA,CAAA,KAAMZ,WAAW,CAACY,KAAK,CAAC,CAAC;;AAE9C;AACA,OAAO,MAAMC,MAAM,GAAGA,CAAA,KAAMb,WAAW,CAACa,MAAM,CAAC,CAAC;;AAEhD;AACA,OAAO,MAAMC,KAAK,GAAIT,QAA2B,IAAK;EACpDL,WAAW,CAACc,KAAK,CAACC,KAAK,CAACC,OAAO,CAACX,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,CAAC;AACpE,CAAC;;AAED;AACA,OAAO,MAAMY,OAAO,GAAIC,EAAU,IAAKlB,WAAW,CAACiB,OAAO,CAACC,EAAE,CAAC;;AAE9D;AACA,OAAO,MAAMC,MAAM,GAAIC,OAAsC,IAAK;EAChEpB,WAAW,CAACmB,MAAM,CAACJ,KAAK,CAACC,OAAO,CAACI,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC,CAAC;AAClE,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["gameMethods","pause","resume","despawn","id"],"sourceRoot":"../../src","sources":["GameMethods.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,wBAAqB;;AAEjD;AACA,OAAO,MAAMC,KAAK,GAAGA,CAAA,KAAMD,WAAW,CAACC,KAAK,CAAC,CAAC;;AAE9C;AACA,OAAO,MAAMC,MAAM,GAAGA,CAAA,KAAMF,WAAW,CAACE,MAAM,CAAC,CAAC;;AAEhD;AACA,OAAO,MAAMC,OAAO,GAAIC,EAAU,IAAKJ,WAAW,CAACG,OAAO,CAACC,EAAE,CAAC","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
2
 
3
- export {};
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ export const gameMethods = NitroModules.createHybridObject('GameMethods');
4
5
  //# sourceMappingURL=GameMethods.nitro.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../src","sources":["GameMethods.nitro.ts"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":["NitroModules","gameMethods","createHybridObject"],"sourceRoot":"../../src","sources":["GameMethods.nitro.ts"],"mappings":";;AAEA,SAASA,YAAY,QAAQ,4BAA4B;AAiBzD,OAAO,MAAMC,WAAW,GACtBD,YAAY,CAACE,kBAAkB,CAAc,aAAa,CAAC","ignoreList":[]}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ import { Image } from 'react-native';
4
+ import { gameAssets } from "./GameAssets.nitro.js";
5
+ import { gameMethods } from "./GameMethods.nitro.js";
6
+ const assetCache = new WeakMap();
7
+ let nextId = -1;
8
+ const registerAssetIfNotExist = asset => {
9
+ switch (typeof asset) {
10
+ case 'object':
11
+ if (assetCache.has(asset)) {
12
+ return assetCache.get(asset);
13
+ }
14
+ const assetId = nextId--;
15
+ assetCache.set(asset, assetId);
16
+ gameAssets.registerLottie(assetId, JSON.stringify(asset));
17
+ return assetId;
18
+ case 'number':
19
+ if (gameAssets.isAssetRegistered(asset)) {
20
+ return asset;
21
+ }
22
+ const assetUri = Image.resolveAssetSource(asset)?.uri;
23
+ if (!assetUri) {
24
+ break;
25
+ }
26
+ gameAssets.registerSvg(asset, assetUri);
27
+ return asset;
28
+ }
29
+ return;
30
+ };
31
+
32
+ /** Sets up the game engine with the given configuration. Call this before anything else. */
33
+ export const configure = ({
34
+ tickRate,
35
+ screen,
36
+ entities = [],
37
+ systems = [],
38
+ paused = true
39
+ }) => {
40
+ screen.asset = registerAssetIfNotExist(screen.asset);
41
+ for (const entity of entities) {
42
+ entity.asset = registerAssetIfNotExist(entity.asset);
43
+ }
44
+ gameMethods.setTickRate(tickRate);
45
+ gameMethods.setScreen(screen);
46
+ gameMethods.setEntities(entities);
47
+ gameMethods.setSystems(systems);
48
+ if (paused) {
49
+ gameMethods.pause();
50
+ } else {
51
+ gameMethods.resume();
52
+ }
53
+ };
54
+
55
+ /** Spawns one or more entities into the world. Skips duplicates by id. */
56
+ export const spawn = entities => {
57
+ const entityArray = Array.isArray(entities) ? entities : [entities];
58
+ for (const entity of entityArray) {
59
+ entity.asset = registerAssetIfNotExist(entity.asset);
60
+ }
61
+ gameMethods.spawn(entityArray);
62
+ };
63
+
64
+ /** Updates one or more entities. Only the provided fields are changed. */
65
+ export const update = updates => {
66
+ const entityUpdateArray = Array.isArray(updates) ? updates : [updates];
67
+ for (const entityUpdate of entityUpdateArray) {
68
+ entityUpdate.asset = registerAssetIfNotExist(entityUpdate.asset);
69
+ }
70
+ gameMethods.update(entityUpdateArray);
71
+ };
72
+ //# sourceMappingURL=Shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Image","gameAssets","gameMethods","assetCache","WeakMap","nextId","registerAssetIfNotExist","asset","has","get","assetId","set","registerLottie","JSON","stringify","isAssetRegistered","assetUri","resolveAssetSource","uri","registerSvg","configure","tickRate","screen","entities","systems","paused","entity","setTickRate","setScreen","setEntities","setSystems","pause","resume","spawn","entityArray","Array","isArray","update","updates","entityUpdateArray","entityUpdate"],"sourceRoot":"../../src","sources":["Shared.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,cAAc;AACpC,SAASC,UAAU,QAAQ,uBAAoB;AAC/C,SAASC,WAAW,QAAQ,wBAAqB;AAQjD,MAAMC,UAAU,GAAG,IAAIC,OAAO,CAAiB,CAAC;AAChD,IAAIC,MAAM,GAAG,CAAC,CAAC;AAEf,MAAMC,uBAAuB,GAAIC,KAAa,IAAK;EACjD,QAAQ,OAAOA,KAAK;IAClB,KAAK,QAAQ;MACX,IAAIJ,UAAU,CAACK,GAAG,CAACD,KAAK,CAAC,EAAE;QACzB,OAAOJ,UAAU,CAACM,GAAG,CAACF,KAAK,CAAC;MAC9B;MACA,MAAMG,OAAO,GAAGL,MAAM,EAAE;MACxBF,UAAU,CAACQ,GAAG,CAACJ,KAAK,EAAEG,OAAO,CAAC;MAC9BT,UAAU,CAACW,cAAc,CAACF,OAAO,EAAEG,IAAI,CAACC,SAAS,CAACP,KAAK,CAAC,CAAC;MACzD,OAAOG,OAAO;IAEhB,KAAK,QAAQ;MACX,IAAIT,UAAU,CAACc,iBAAiB,CAACR,KAAK,CAAC,EAAE;QACvC,OAAOA,KAAK;MACd;MACA,MAAMS,QAAQ,GAAGhB,KAAK,CAACiB,kBAAkB,CAACV,KAAK,CAAC,EAAEW,GAAG;MACrD,IAAI,CAACF,QAAQ,EAAE;QACb;MACF;MACAf,UAAU,CAACkB,WAAW,CAACZ,KAAK,EAAES,QAAQ,CAAC;MACvC,OAAOT,KAAK;EAChB;EACA;AACF,CAAC;;AAED;AACA,OAAO,MAAMa,SAAS,GAAGA,CAAC;EACxBC,QAAQ;EACRC,MAAM;EACNC,QAAQ,GAAG,EAAE;EACbC,OAAO,GAAG,EAAE;EACZC,MAAM,GAAG;AACH,CAAC,KAAK;EACZH,MAAM,CAACf,KAAK,GAAGD,uBAAuB,CAACgB,MAAM,CAACf,KAAK,CAAC;EACpD,KAAK,MAAMmB,MAAM,IAAIH,QAAQ,EAAE;IAC7BG,MAAM,CAACnB,KAAK,GAAGD,uBAAuB,CAACoB,MAAM,CAACnB,KAAK,CAAC;EACtD;EAEAL,WAAW,CAACyB,WAAW,CAACN,QAAQ,CAAC;EACjCnB,WAAW,CAAC0B,SAAS,CAACN,MAAsB,CAAC;EAC7CpB,WAAW,CAAC2B,WAAW,CAACN,QAA0B,CAAC;EACnDrB,WAAW,CAAC4B,UAAU,CAACN,OAAO,CAAC;EAC/B,IAAIC,MAAM,EAAE;IACVvB,WAAW,CAAC6B,KAAK,CAAC,CAAC;EACrB,CAAC,MAAM;IACL7B,WAAW,CAAC8B,MAAM,CAAC,CAAC;EACtB;AACF,CAAC;;AAED;AACA,OAAO,MAAMC,KAAK,GAAIV,QAA2B,IAAK;EACpD,MAAMW,WAAW,GAAGC,KAAK,CAACC,OAAO,CAACb,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC;EAEnE,KAAK,MAAMG,MAAM,IAAIQ,WAAW,EAAE;IAChCR,MAAM,CAACnB,KAAK,GAAGD,uBAAuB,CAACoB,MAAM,CAACnB,KAAK,CAAC;EACtD;EAEAL,WAAW,CAAC+B,KAAK,CAACC,WAA6B,CAAC;AAClD,CAAC;;AAED;AACA,OAAO,MAAMG,MAAM,GAAIC,OAAsC,IAAK;EAChE,MAAMC,iBAAiB,GAAGJ,KAAK,CAACC,OAAO,CAACE,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC;EAEtE,KAAK,MAAME,YAAY,IAAID,iBAAiB,EAAE;IAC5CC,YAAY,CAACjC,KAAK,GAAGD,uBAAuB,CAACkC,YAAY,CAACjC,KAAK,CAAC;EAClE;EAEAL,WAAW,CAACmC,MAAM,CAACE,iBAAyC,CAAC;AAC/D,CAAC","ignoreList":[]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import GameEngine from "./GameEngine.js";
4
4
  export * from "./GameMethods.js";
5
+ export * from "./Shared.js";
5
6
  export * from "./types.js";
6
7
  export { GameEngine };
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["GameEngine"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,iBAAc;AAErC,cAAc,kBAAe;AAC7B,cAAc,YAAS;AACvB,SAASA,UAAU","ignoreList":[]}
1
+ {"version":3,"names":["GameEngine"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,iBAAc;AAErC,cAAc,kBAAe;AAC7B,cAAc,aAAU;AAExB,cAAc,YAAS;AACvB,SAASA,UAAU","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=nativeTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["nativeTypes.ts"],"mappings":"","ignoreList":[]}
@@ -1,2 +1,4 @@
1
1
  "use strict";
2
+
3
+ export {};
2
4
  //# sourceMappingURL=types.js.map
@@ -0,0 +1,12 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ interface GameAssets extends HybridObject<{
3
+ ios: 'swift';
4
+ android: 'kotlin';
5
+ }> {
6
+ isAssetRegistered(id: number): boolean;
7
+ registerSvg(id: number, uri: string): void;
8
+ registerLottie(id: number, json: string): void;
9
+ }
10
+ export declare const gameAssets: GameAssets;
11
+ export {};
12
+ //# sourceMappingURL=GameAssets.nitro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GameAssets.nitro.d.ts","sourceRoot":"","sources":["../../../src/GameAssets.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG/D,UAAU,UAAW,SAAQ,YAAY,CAAC;IACxC,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;IACA,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,eAAO,MAAM,UAAU,YACoC,CAAC"}
@@ -1,14 +1,7 @@
1
- import type { Config, Entity, EntityUpdate } from './types';
2
- /** Sets up the game engine with the given configuration. Call this before anything else. */
3
- export declare function configure({ tickRate, screen, entities, systems, paused, }: Config): void;
4
1
  /** Pauses the game loop. Systems will stop running. */
5
2
  export declare const pause: () => void;
6
3
  /** Resumes the game loop. */
7
4
  export declare const resume: () => void;
8
- /** Spawns one or more entities into the world. Skips duplicates by id. */
9
- export declare const spawn: (entities: Entity | Entity[]) => void;
10
5
  /** Removes an entity or all entities matching the given id prefix from the world. */
11
6
  export declare const despawn: (id: string) => void;
12
- /** Updates one or more entities. Only the provided fields are changed. */
13
- export declare const update: (updates: EntityUpdate | EntityUpdate[]) => void;
14
7
  //# sourceMappingURL=GameMethods.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GameMethods.d.ts","sourceRoot":"","sources":["../../../src/GameMethods.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5D,4FAA4F;AAC5F,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,MAAM,EACN,QAAa,EACb,OAAY,EACZ,MAAa,GACd,EAAE,MAAM,QAUR;AAED,uDAAuD;AACvD,eAAO,MAAM,KAAK,YAA4B,CAAC;AAE/C,6BAA6B;AAC7B,eAAO,MAAM,MAAM,YAA6B,CAAC;AAEjD,0EAA0E;AAC1E,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,GAAG,MAAM,EAAE,SAEhD,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,SAA4B,CAAC;AAE/D,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GAAI,SAAS,YAAY,GAAG,YAAY,EAAE,SAE5D,CAAC"}
1
+ {"version":3,"file":"GameMethods.d.ts","sourceRoot":"","sources":["../../../src/GameMethods.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,eAAO,MAAM,KAAK,YAA4B,CAAC;AAE/C,6BAA6B;AAC7B,eAAO,MAAM,MAAM,YAA6B,CAAC;AAEjD,qFAAqF;AACrF,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,SAA4B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { HybridObject } from 'react-native-nitro-modules';
2
- import type { Entity, EntityUpdate, System, Screen } from './types';
3
- export interface GameMethods extends HybridObject<{
2
+ import type { Entity, EntityUpdate, System, Screen } from './nativeTypes';
3
+ interface GameMethods extends HybridObject<{
4
4
  ios: 'c++';
5
5
  android: 'c++';
6
6
  }> {
@@ -14,4 +14,6 @@ export interface GameMethods extends HybridObject<{
14
14
  despawn(id: string): void;
15
15
  update(updates: EntityUpdate[]): void;
16
16
  }
17
+ export declare const gameMethods: GameMethods;
18
+ export {};
17
19
  //# sourceMappingURL=GameMethods.nitro.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GameMethods.nitro.d.ts","sourceRoot":"","sources":["../../../src/GameMethods.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEpE,MAAM,WAAW,WAAY,SAAQ,YAAY,CAAC;IAChD,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;CAChB,CAAC;IACA,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;CACvC"}
1
+ {"version":3,"file":"GameMethods.nitro.d.ts","sourceRoot":"","sources":["../../../src/GameMethods.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG1E,UAAU,WAAY,SAAQ,YAAY,CAAC;IACzC,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;CAChB,CAAC;IACA,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;CACvC;AAED,eAAO,MAAM,WAAW,aACqC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Config, Entity, EntityUpdate } from './types';
2
+ /** Sets up the game engine with the given configuration. Call this before anything else. */
3
+ export declare const configure: ({ tickRate, screen, entities, systems, paused, }: Config) => void;
4
+ /** Spawns one or more entities into the world. Skips duplicates by id. */
5
+ export declare const spawn: (entities: Entity | Entity[]) => void;
6
+ /** Updates one or more entities. Only the provided fields are changed. */
7
+ export declare const update: (updates: EntityUpdate | EntityUpdate[]) => void;
8
+ //# sourceMappingURL=Shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shared.d.ts","sourceRoot":"","sources":["../../../src/Shared.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA8BnE,4FAA4F;AAC5F,eAAO,MAAM,SAAS,GAAI,kDAMvB,MAAM,SAeR,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,GAAG,MAAM,EAAE,SAQhD,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GAAI,SAAS,YAAY,GAAG,YAAY,EAAE,SAQ5D,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import GameEngine from './GameEngine';
2
2
  export * from './GameMethods';
3
+ export * from './Shared';
4
+ export type { System } from './nativeTypes';
3
5
  export * from './types';
4
6
  export { GameEngine };
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,CAAC"}