rngine 0.4.2 → 0.5.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 (45) hide show
  1. package/README.md +1 -1
  2. package/android/src/main/java/com/margelo/nitro/rngine/GameAssets.kt +24 -20
  3. package/lib/module/GameAssets.js +41 -0
  4. package/lib/module/GameAssets.js.map +1 -0
  5. package/lib/module/GameEngine.js +1 -1
  6. package/lib/module/GameEngine.js.map +1 -1
  7. package/lib/module/GameMethods.js +43 -0
  8. package/lib/module/GameMethods.js.map +1 -1
  9. package/lib/module/index.js +1 -1
  10. package/lib/module/index.js.map +1 -1
  11. package/lib/typescript/src/GameAssets.d.ts +2 -0
  12. package/lib/typescript/src/GameAssets.d.ts.map +1 -0
  13. package/lib/typescript/src/GameAssets.nitro.d.ts +2 -2
  14. package/lib/typescript/src/GameAssets.nitro.d.ts.map +1 -1
  15. package/lib/typescript/src/GameMethods.d.ts +8 -0
  16. package/lib/typescript/src/GameMethods.d.ts.map +1 -1
  17. package/lib/typescript/src/index.d.ts +2 -1
  18. package/lib/typescript/src/index.d.ts.map +1 -1
  19. package/lib/typescript/src/types.d.ts +2 -15
  20. package/lib/typescript/src/types.d.ts.map +1 -1
  21. package/nitrogen/generated/android/c++/JHybridGameAssetsSpec.cpp +31 -6
  22. package/nitrogen/generated/android/c++/JHybridGameAssetsSpec.hpp +2 -2
  23. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/HybridGameAssetsSpec.kt +3 -2
  24. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.cpp +16 -0
  25. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.hpp +65 -6
  26. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Umbrella.hpp +1 -0
  27. package/nitrogen/generated/ios/c++/HybridGameAssetsSpecSwift.hpp +7 -2
  28. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  29. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  30. package/nitrogen/generated/ios/swift/HybridGameAssetsSpec.swift +2 -2
  31. package/nitrogen/generated/ios/swift/HybridGameAssetsSpec_cxx.swift +24 -8
  32. package/nitrogen/generated/shared/c++/HybridGameAssetsSpec.hpp +3 -2
  33. package/package.json +1 -1
  34. package/shared/GameMethods.cpp +2 -0
  35. package/src/GameAssets.nitro.ts +2 -2
  36. package/src/GameAssets.ts +47 -0
  37. package/src/GameEngine.tsx +1 -1
  38. package/src/GameMethods.ts +48 -0
  39. package/src/index.tsx +8 -1
  40. package/src/types.ts +3 -19
  41. package/lib/module/Shared.js +0 -85
  42. package/lib/module/Shared.js.map +0 -1
  43. package/lib/typescript/src/Shared.d.ts +0 -8
  44. package/lib/typescript/src/Shared.d.ts.map +0 -1
  45. package/src/Shared.ts +0 -99
package/README.md CHANGED
@@ -72,7 +72,7 @@ export default function App() {
72
72
 
73
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 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).
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/types.ts).
76
76
 
77
77
  **Screen** defines the viewport dimensions and background color. Entities outside the screen bounds are automatically clipped. See [`Screen`](./src/nativeTypes.ts).
78
78
 
@@ -4,6 +4,7 @@ import android.util.Log
4
4
  import com.airbnb.lottie.LottieCompositionFactory
5
5
  import com.airbnb.lottie.LottieDrawable
6
6
  import com.caverock.androidsvg.SVG
7
+ import com.margelo.nitro.core.Promise
7
8
  import java.net.URL
8
9
 
9
10
  class GameAssets : HybridGameAssetsSpec() {
@@ -18,30 +19,33 @@ class GameAssets : HybridGameAssetsSpec() {
18
19
  return id.toInt() in assetCache
19
20
  }
20
21
 
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)
22
+ override fun registerSvg(id: Double, uri: String): Promise<Unit> {
23
+ return Promise.async {
24
+ try {
25
+ val stream = URL(uri).openStream()
26
+ assetCache[id.toInt()] = Asset.Svg(SVG.getFromInputStream(stream).renderToPicture())
27
+ Log.d("GameAssets", "assetCache: $assetCache")
28
+ } catch (e: Exception) {
29
+ Log.e("GameAssets", "Failed to parse SVG: $uri", e)
30
+ throw e
31
+ }
28
32
  }
29
33
  }
30
34
 
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
35
+ override fun registerLottie(id: Double, json: String): Promise<Unit> {
36
+ return Promise.async {
37
+ try {
38
+ val composition = LottieCompositionFactory.fromJsonStringSync(json, null).value
39
+ ?: throw IllegalStateException("Failed to parse Lottie JSON for id: $id")
40
+ val drawable = LottieDrawable()
41
+ drawable.composition = composition
42
+ assetCache[id.toInt()] = Asset.Lottie(drawable)
43
+ registerLottieDuration(id, composition.duration.toDouble() / 1000)
44
+ Log.d("GameAssets", "assetCache: $assetCache")
45
+ } catch (e: Exception) {
46
+ Log.e("GameAssets", "Failed to register Lottie: $id", e)
47
+ throw e
37
48
  }
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
49
  }
46
50
  }
47
51
  }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ import { Image } from 'react-native';
4
+ import { gameAssets } from "./GameAssets.nitro.js";
5
+ const assetCache = new WeakMap();
6
+ let nextId = -1;
7
+ const loadAsset = async asset => {
8
+ switch (typeof asset) {
9
+ case 'object':
10
+ if (asset === null) {
11
+ throw new Error('loadAssets: asset cannot be null');
12
+ }
13
+ if (assetCache.has(asset)) {
14
+ return assetCache.get(asset);
15
+ }
16
+ const assetId = nextId--;
17
+ assetCache.set(asset, assetId);
18
+ await gameAssets.registerLottie(assetId, JSON.stringify(asset));
19
+ return assetId;
20
+ case 'number':
21
+ if (gameAssets.isAssetRegistered(asset)) {
22
+ return asset;
23
+ }
24
+ const assetUri = Image.resolveAssetSource(asset)?.uri;
25
+ if (!assetUri) {
26
+ throw new Error(`loadAssets: could not resolve asset URI for ${asset}`);
27
+ }
28
+ await gameAssets.registerSvg(asset, assetUri);
29
+ return asset;
30
+ }
31
+ throw new Error(`loadAssets: unsupported asset type "${typeof asset}"`);
32
+ };
33
+ export const loadAssets = async assets => {
34
+ const keys = Object.keys(assets);
35
+ const result = {};
36
+ for (const key of keys) {
37
+ result[key] = await loadAsset(assets[key]);
38
+ }
39
+ return result;
40
+ };
41
+ //# sourceMappingURL=GameAssets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Image","gameAssets","assetCache","WeakMap","nextId","loadAsset","asset","Error","has","get","assetId","set","registerLottie","JSON","stringify","isAssetRegistered","assetUri","resolveAssetSource","uri","registerSvg","loadAssets","assets","keys","Object","result","key"],"sourceRoot":"../../src","sources":["GameAssets.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,cAAc;AACpC,SAASC,UAAU,QAAQ,uBAAoB;AAE/C,MAAMC,UAAU,GAAG,IAAIC,OAAO,CAAiB,CAAC;AAChD,IAAIC,MAAM,GAAG,CAAC,CAAC;AAEf,MAAMC,SAAS,GAAG,MAAOC,KAAc,IAAK;EAC1C,QAAQ,OAAOA,KAAK;IAClB,KAAK,QAAQ;MACX,IAAIA,KAAK,KAAK,IAAI,EAAE;QAClB,MAAM,IAAIC,KAAK,CAAC,kCAAkC,CAAC;MACrD;MACA,IAAIL,UAAU,CAACM,GAAG,CAACF,KAAK,CAAC,EAAE;QACzB,OAAOJ,UAAU,CAACO,GAAG,CAACH,KAAK,CAAC;MAC9B;MACA,MAAMI,OAAO,GAAGN,MAAM,EAAE;MACxBF,UAAU,CAACS,GAAG,CAACL,KAAK,EAAEI,OAAO,CAAC;MAC9B,MAAMT,UAAU,CAACW,cAAc,CAACF,OAAO,EAAEG,IAAI,CAACC,SAAS,CAACR,KAAK,CAAC,CAAC;MAC/D,OAAOI,OAAO;IAEhB,KAAK,QAAQ;MACX,IAAIT,UAAU,CAACc,iBAAiB,CAACT,KAAK,CAAC,EAAE;QACvC,OAAOA,KAAK;MACd;MACA,MAAMU,QAAQ,GAAGhB,KAAK,CAACiB,kBAAkB,CAACX,KAAK,CAAC,EAAEY,GAAG;MACrD,IAAI,CAACF,QAAQ,EAAE;QACb,MAAM,IAAIT,KAAK,CAAC,+CAA+CD,KAAK,EAAE,CAAC;MACzE;MACA,MAAML,UAAU,CAACkB,WAAW,CAACb,KAAK,EAAEU,QAAQ,CAAC;MAC7C,OAAOV,KAAK;EAChB;EAEA,MAAM,IAAIC,KAAK,CAAC,uCAAuC,OAAOD,KAAK,GAAG,CAAC;AACzE,CAAC;AAED,OAAO,MAAMc,UAAU,GAAG,MACxBC,MAAS,IAC+B;EACxC,MAAMC,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACD,MAAM,CAAgB;EAC/C,MAAMG,MAAM,GAAG,CAAC,CAA+B;EAE/C,KAAK,MAAMC,GAAG,IAAIH,IAAI,EAAE;IACtBE,MAAM,CAACC,GAAG,CAAC,GAAG,MAAMpB,SAAS,CAACgB,MAAM,CAACI,GAAG,CAAC,CAAC;EAC5C;EAEA,OAAOD,MAAM;AACf,CAAC","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { getHostComponent } from 'react-native-nitro-modules';
4
- const GameEngineConfig = require('../nitrogen/generated/shared/json/GameEngineConfig.json');
4
+ import GameEngineConfig from '../nitrogen/generated/shared/json/GameEngineConfig.json';
5
5
  /**
6
6
  * A game engine view component that renders the game world.
7
7
  * Size it using the style prop like any other React Native view.
@@ -1 +1 @@
1
- {"version":3,"names":["getHostComponent","GameEngineConfig","require"],"sourceRoot":"../../src","sources":["GameEngine.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,4BAA4B;AAC7D,MAAMC,gBAAgB,GAAGC,OAAO,CAAC,yDAAyD,CAAC;AAG3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAeF,gBAAgB,CAC7B,YAAY,EACZ,MAAMC,gBACR,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["getHostComponent","GameEngineConfig"],"sourceRoot":"../../src","sources":["GameEngine.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,4BAA4B;AAC7D,OAAOC,gBAAgB,MAAM,yDAAyD;AAGtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAeD,gBAAgB,CAC7B,YAAY,EACZ,MAAMC,gBACR,CAAC","ignoreList":[]}
@@ -1,6 +1,37 @@
1
1
  "use strict";
2
2
 
3
3
  import { gameMethods } from "./GameMethods.nitro.js";
4
+ /** Sets up the game engine with the given configuration. Call this before anything else. */
5
+ export const configure = ({
6
+ tickRate,
7
+ screen,
8
+ entities = [],
9
+ systems = [],
10
+ paused = true
11
+ }) => {
12
+ let nativeSystems = [];
13
+ for (const system of systems) {
14
+ nativeSystems.push({
15
+ entities: system.entities,
16
+ collisions: system.collisions,
17
+ onTick: (e, c) => {
18
+ const start = Date.now();
19
+ system.onTick(e, c);
20
+ const finish = Date.now();
21
+ return finish - start;
22
+ }
23
+ });
24
+ }
25
+ gameMethods.setTickRate(tickRate);
26
+ gameMethods.setScreen(screen);
27
+ gameMethods.setEntities(entities);
28
+ gameMethods.setSystems(nativeSystems);
29
+ if (paused) {
30
+ gameMethods.pause();
31
+ } else {
32
+ gameMethods.resume();
33
+ }
34
+ };
4
35
 
5
36
  /** Pauses the game loop. Systems will stop running. */
6
37
  export const pause = () => gameMethods.pause();
@@ -8,6 +39,18 @@ export const pause = () => gameMethods.pause();
8
39
  /** Resumes the game loop. */
9
40
  export const resume = () => gameMethods.resume();
10
41
 
42
+ /** Spawns one or more entities into the world. Skips duplicates by id. */
43
+ export const spawn = entities => {
44
+ const entityArray = Array.isArray(entities) ? entities : [entities];
45
+ gameMethods.spawn(entityArray);
46
+ };
47
+
11
48
  /** Removes an entity or all entities matching the given id prefix from the world. */
12
49
  export const despawn = id => gameMethods.despawn(id);
50
+
51
+ /** Updates one or more entities. Only the provided fields are changed. */
52
+ export const update = updates => {
53
+ const entityUpdateArray = Array.isArray(updates) ? updates : [updates];
54
+ gameMethods.update(entityUpdateArray);
55
+ };
13
56
  //# sourceMappingURL=GameMethods.js.map
@@ -1 +1 @@
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
+ {"version":3,"names":["gameMethods","configure","tickRate","screen","entities","systems","paused","nativeSystems","system","push","collisions","onTick","e","c","start","Date","now","finish","setTickRate","setScreen","setEntities","setSystems","pause","resume","spawn","entityArray","Array","isArray","despawn","id","update","updates","entityUpdateArray"],"sourceRoot":"../../src","sources":["GameMethods.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,wBAAqB;AAIjD;AACA,OAAO,MAAMC,SAAS,GAAGA,CAAC;EACxBC,QAAQ;EACRC,MAAM;EACNC,QAAQ,GAAG,EAAE;EACbC,OAAO,GAAG,EAAE;EACZC,MAAM,GAAG;AACH,CAAC,KAAK;EACZ,IAAIC,aAAuB,GAAG,EAAE;EAEhC,KAAK,MAAMC,MAAM,IAAIH,OAAO,EAAE;IAC5BE,aAAa,CAACE,IAAI,CAAC;MACjBL,QAAQ,EAAEI,MAAM,CAACJ,QAAQ;MACzBM,UAAU,EAAEF,MAAM,CAACE,UAAU;MAC7BC,MAAM,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAK;QAChB,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;QACxBR,MAAM,CAACG,MAAM,CAACC,CAAC,EAAEC,CAAC,CAAC;QACnB,MAAMI,MAAM,GAAGF,IAAI,CAACC,GAAG,CAAC,CAAC;QACzB,OAAOC,MAAM,GAAGH,KAAK;MACvB;IACF,CAAC,CAAC;EACJ;EAEAd,WAAW,CAACkB,WAAW,CAAChB,QAAQ,CAAC;EACjCF,WAAW,CAACmB,SAAS,CAAChB,MAAM,CAAC;EAC7BH,WAAW,CAACoB,WAAW,CAAChB,QAAQ,CAAC;EACjCJ,WAAW,CAACqB,UAAU,CAACd,aAAa,CAAC;EACrC,IAAID,MAAM,EAAE;IACVN,WAAW,CAACsB,KAAK,CAAC,CAAC;EACrB,CAAC,MAAM;IACLtB,WAAW,CAACuB,MAAM,CAAC,CAAC;EACtB;AACF,CAAC;;AAED;AACA,OAAO,MAAMD,KAAK,GAAGA,CAAA,KAAMtB,WAAW,CAACsB,KAAK,CAAC,CAAC;;AAE9C;AACA,OAAO,MAAMC,MAAM,GAAGA,CAAA,KAAMvB,WAAW,CAACuB,MAAM,CAAC,CAAC;;AAEhD;AACA,OAAO,MAAMC,KAAK,GAAIpB,QAA2B,IAAK;EACpD,MAAMqB,WAAW,GAAGC,KAAK,CAACC,OAAO,CAACvB,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC;EACnEJ,WAAW,CAACwB,KAAK,CAACC,WAAW,CAAC;AAChC,CAAC;;AAED;AACA,OAAO,MAAMG,OAAO,GAAIC,EAAU,IAAK7B,WAAW,CAAC4B,OAAO,CAACC,EAAE,CAAC;;AAE9D;AACA,OAAO,MAAMC,MAAM,GAAIC,OAAsC,IAAK;EAChE,MAAMC,iBAAiB,GAAGN,KAAK,CAACC,OAAO,CAACI,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC;EACtE/B,WAAW,CAAC8B,MAAM,CAACE,iBAAiB,CAAC;AACvC,CAAC","ignoreList":[]}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import GameEngine from "./GameEngine.js";
4
4
  export * from "./GameMethods.js";
5
- export * from "./Shared.js";
5
+ export * from "./GameAssets.js";
6
6
  export * from "./types.js";
7
7
  export { GameEngine };
8
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,aAAU;AACxB,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,iBAAc;AAC5B,cAAc,YAAS;AAQvB,SAASA,UAAU","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export declare const loadAssets: <T extends Record<string, unknown>>(assets: T) => Promise<{ [K in keyof T]: number; }>;
2
+ //# sourceMappingURL=GameAssets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GameAssets.d.ts","sourceRoot":"","sources":["../../../src/GameAssets.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,UAAU,GAAU,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,QAAQ,CAAC,KACR,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,GAAE,CASpC,CAAC"}
@@ -4,8 +4,8 @@ interface GameAssets extends HybridObject<{
4
4
  android: 'kotlin';
5
5
  }> {
6
6
  isAssetRegistered(id: number): boolean;
7
- registerSvg(id: number, uri: string): void;
8
- registerLottie(id: number, json: string): void;
7
+ registerSvg(id: number, uri: string): Promise<void>;
8
+ registerLottie(id: number, json: string): Promise<void>;
9
9
  }
10
10
  export declare const gameAssets: GameAssets;
11
11
  export {};
@@ -1 +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
+ {"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,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,eAAO,MAAM,UAAU,YACoC,CAAC"}
@@ -1,7 +1,15 @@
1
+ import type { Entity, EntityUpdate } from './nativeTypes';
2
+ import type { Config } from './types';
3
+ /** Sets up the game engine with the given configuration. Call this before anything else. */
4
+ export declare const configure: ({ tickRate, screen, entities, systems, paused, }: Config) => void;
1
5
  /** Pauses the game loop. Systems will stop running. */
2
6
  export declare const pause: () => void;
3
7
  /** Resumes the game loop. */
4
8
  export declare const resume: () => void;
9
+ /** Spawns one or more entities into the world. Skips duplicates by id. */
10
+ export declare const spawn: (entities: Entity | Entity[]) => void;
5
11
  /** Removes an entity or all entities matching the given id prefix from the world. */
6
12
  export declare const despawn: (id: string) => void;
13
+ /** Updates one or more entities. Only the provided fields are changed. */
14
+ export declare const update: (updates: EntityUpdate | EntityUpdate[]) => void;
7
15
  //# sourceMappingURL=GameMethods.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"GameMethods.d.ts","sourceRoot":"","sources":["../../../src/GameMethods.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAU,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,4FAA4F;AAC5F,eAAO,MAAM,SAAS,GAAI,kDAMvB,MAAM,SAyBR,CAAC;AAEF,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,SAGhD,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,SAG5D,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import GameEngine from './GameEngine';
2
2
  export * from './GameMethods';
3
- export * from './Shared';
3
+ export * from './GameAssets';
4
4
  export * from './types';
5
+ export type { Screen, Entity, CollisionPair, Collision, EntityUpdate, } from './nativeTypes';
5
6
  export { GameEngine };
6
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,UAAU,CAAC;AACzB,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,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,YAAY,EACV,MAAM,EACN,MAAM,EACN,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -1,20 +1,7 @@
1
- import type { Screen as NativeScreen, Entity as NativeEntity, EntityUpdate as NativeEntityUpdate, System as NativeSystem, Collision } from './nativeTypes';
2
- export type Asset = number | object;
3
- export type Screen = Omit<NativeScreen, 'asset'> & {
4
- /** Asset to render, use `require` with the file path to get the id. */
5
- asset?: Asset;
6
- };
7
- export type Entity = Omit<NativeEntity, 'asset'> & {
8
- /** Asset to render, use `require` with the file path to get the id. */
9
- asset?: Asset;
10
- };
11
- export type EntityUpdate = Omit<NativeEntityUpdate, 'asset'> & {
12
- /** Asset to render, use `require` with the file path to get the id. */
13
- asset?: Asset;
14
- };
1
+ import type { System as NativeSystem, Collision, Screen, Entity } from './nativeTypes';
15
2
  export type System = Omit<NativeSystem, 'onTick'> & {
16
3
  /** Called every tick with the resolved entities and collisions. */
17
- onTick: (entities: NativeEntity[], collisions: Collision[]) => void;
4
+ onTick: (entities: Entity[], collisions: Collision[]) => void;
18
5
  };
19
6
  export type Config = {
20
7
  /** Number of game logic updates per second. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,IAAI,YAAY,EACtB,MAAM,IAAI,YAAY,EACtB,YAAY,IAAI,kBAAkB,EAClC,MAAM,IAAI,YAAY,EACtB,SAAS,EACV,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG;IACjD,uEAAuE;IACvE,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG;IACjD,uEAAuE;IACvE,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AACF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG;IAC7D,uEAAuE;IACvE,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG;IAClD,mEAAmE;IACnE,MAAM,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,IAAI,YAAY,EACtB,SAAS,EACT,MAAM,EACN,MAAM,EACP,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG;IAClD,mEAAmE;IACnE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC"}
@@ -9,6 +9,9 @@
9
9
 
10
10
 
11
11
 
12
+ #include <NitroModules/Promise.hpp>
13
+ #include <NitroModules/JPromise.hpp>
14
+ #include <NitroModules/JUnit.hpp>
12
15
  #include <string>
13
16
 
14
17
  namespace margelo::nitro::rngine {
@@ -49,13 +52,35 @@ namespace margelo::nitro::rngine {
49
52
  auto __result = method(_javaPart, id);
50
53
  return static_cast<bool>(__result);
51
54
  }
52
- void JHybridGameAssetsSpec::registerSvg(double id, const std::string& uri) {
53
- static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* id */, jni::alias_ref<jni::JString> /* uri */)>("registerSvg");
54
- method(_javaPart, id, jni::make_jstring(uri));
55
+ std::shared_ptr<Promise<void>> JHybridGameAssetsSpec::registerSvg(double id, const std::string& uri) {
56
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(double /* id */, jni::alias_ref<jni::JString> /* uri */)>("registerSvg");
57
+ auto __result = method(_javaPart, id, jni::make_jstring(uri));
58
+ return [&]() {
59
+ auto __promise = Promise<void>::create();
60
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
61
+ __promise->resolve();
62
+ });
63
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
64
+ jni::JniException __jniError(__throwable);
65
+ __promise->reject(std::make_exception_ptr(__jniError));
66
+ });
67
+ return __promise;
68
+ }();
55
69
  }
56
- void JHybridGameAssetsSpec::registerLottie(double id, const std::string& json) {
57
- static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* id */, jni::alias_ref<jni::JString> /* json */)>("registerLottie");
58
- method(_javaPart, id, jni::make_jstring(json));
70
+ std::shared_ptr<Promise<void>> JHybridGameAssetsSpec::registerLottie(double id, const std::string& json) {
71
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(double /* id */, jni::alias_ref<jni::JString> /* json */)>("registerLottie");
72
+ auto __result = method(_javaPart, id, jni::make_jstring(json));
73
+ return [&]() {
74
+ auto __promise = Promise<void>::create();
75
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
76
+ __promise->resolve();
77
+ });
78
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
79
+ jni::JniException __jniError(__throwable);
80
+ __promise->reject(std::make_exception_ptr(__jniError));
81
+ });
82
+ return __promise;
83
+ }();
59
84
  }
60
85
 
61
86
  } // namespace margelo::nitro::rngine
@@ -55,8 +55,8 @@ namespace margelo::nitro::rngine {
55
55
  public:
56
56
  // Methods
57
57
  bool isAssetRegistered(double id) override;
58
- void registerSvg(double id, const std::string& uri) override;
59
- void registerLottie(double id, const std::string& json) override;
58
+ std::shared_ptr<Promise<void>> registerSvg(double id, const std::string& uri) override;
59
+ std::shared_ptr<Promise<void>> registerLottie(double id, const std::string& json) override;
60
60
 
61
61
  private:
62
62
  jni::global_ref<JHybridGameAssetsSpec::JavaPart> _javaPart;
@@ -10,6 +10,7 @@ package com.margelo.nitro.rngine
10
10
  import androidx.annotation.Keep
11
11
  import com.facebook.jni.HybridData
12
12
  import com.facebook.proguard.annotations.DoNotStrip
13
+ import com.margelo.nitro.core.Promise
13
14
  import com.margelo.nitro.core.HybridObject
14
15
 
15
16
  /**
@@ -34,11 +35,11 @@ abstract class HybridGameAssetsSpec: HybridObject() {
34
35
 
35
36
  @DoNotStrip
36
37
  @Keep
37
- abstract fun registerSvg(id: Double, uri: String): Unit
38
+ abstract fun registerSvg(id: Double, uri: String): Promise<Unit>
38
39
 
39
40
  @DoNotStrip
40
41
  @Keep
41
- abstract fun registerLottie(id: Double, json: String): Unit
42
+ abstract fun registerLottie(id: Double, json: String): Promise<Unit>
42
43
 
43
44
  // Default implementation of `HybridObject.toString()`
44
45
  override fun toString(): String {
@@ -15,6 +15,22 @@
15
15
 
16
16
  namespace margelo::nitro::rngine::bridge::swift {
17
17
 
18
+ // pragma MARK: std::function<void()>
19
+ Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept {
20
+ auto swiftClosure = Rngine::Func_void::fromUnsafe(swiftClosureWrapper);
21
+ return [swiftClosure = std::move(swiftClosure)]() mutable -> void {
22
+ swiftClosure.call();
23
+ };
24
+ }
25
+
26
+ // pragma MARK: std::function<void(const std::exception_ptr& /* error */)>
27
+ Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* NON_NULL swiftClosureWrapper) noexcept {
28
+ auto swiftClosure = Rngine::Func_void_std__exception_ptr::fromUnsafe(swiftClosureWrapper);
29
+ return [swiftClosure = std::move(swiftClosure)](const std::exception_ptr& error) mutable -> void {
30
+ swiftClosure.call(error);
31
+ };
32
+ }
33
+
18
34
  // pragma MARK: std::shared_ptr<HybridGameAssetsSpec>
19
35
  std::shared_ptr<HybridGameAssetsSpec> create_std__shared_ptr_HybridGameAssetsSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
20
36
  Rngine::HybridGameAssetsSpec_cxx swiftPart = Rngine::HybridGameAssetsSpec_cxx::fromUnsafe(swiftUnsafePointer);
@@ -22,8 +22,11 @@ namespace Rngine { class HybridGameEngineSpec_cxx; }
22
22
  // Include C++ defined types
23
23
  #include "HybridGameAssetsSpec.hpp"
24
24
  #include "HybridGameEngineSpec.hpp"
25
+ #include <NitroModules/Promise.hpp>
26
+ #include <NitroModules/PromiseHolder.hpp>
25
27
  #include <NitroModules/Result.hpp>
26
28
  #include <exception>
29
+ #include <functional>
27
30
  #include <memory>
28
31
 
29
32
  /**
@@ -32,6 +35,62 @@ namespace Rngine { class HybridGameEngineSpec_cxx; }
32
35
  */
33
36
  namespace margelo::nitro::rngine::bridge::swift {
34
37
 
38
+ // pragma MARK: std::shared_ptr<Promise<void>>
39
+ /**
40
+ * Specialized version of `std::shared_ptr<Promise<void>>`.
41
+ */
42
+ using std__shared_ptr_Promise_void__ = std::shared_ptr<Promise<void>>;
43
+ inline std::shared_ptr<Promise<void>> create_std__shared_ptr_Promise_void__() noexcept {
44
+ return Promise<void>::create();
45
+ }
46
+ inline PromiseHolder<void> wrap_std__shared_ptr_Promise_void__(std::shared_ptr<Promise<void>> promise) noexcept {
47
+ return PromiseHolder<void>(std::move(promise));
48
+ }
49
+
50
+ // pragma MARK: std::function<void()>
51
+ /**
52
+ * Specialized version of `std::function<void()>`.
53
+ */
54
+ using Func_void = std::function<void()>;
55
+ /**
56
+ * Wrapper class for a `std::function<void()>`, this can be used from Swift.
57
+ */
58
+ class Func_void_Wrapper final {
59
+ public:
60
+ explicit Func_void_Wrapper(std::function<void()>&& func): _function(std::make_unique<std::function<void()>>(std::move(func))) {}
61
+ inline void call() const noexcept {
62
+ _function->operator()();
63
+ }
64
+ private:
65
+ std::unique_ptr<std::function<void()>> _function;
66
+ } SWIFT_NONCOPYABLE;
67
+ Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept;
68
+ inline Func_void_Wrapper wrap_Func_void(Func_void value) noexcept {
69
+ return Func_void_Wrapper(std::move(value));
70
+ }
71
+
72
+ // pragma MARK: std::function<void(const std::exception_ptr& /* error */)>
73
+ /**
74
+ * Specialized version of `std::function<void(const std::exception_ptr&)>`.
75
+ */
76
+ using Func_void_std__exception_ptr = std::function<void(const std::exception_ptr& /* error */)>;
77
+ /**
78
+ * Wrapper class for a `std::function<void(const std::exception_ptr& / * error * /)>`, this can be used from Swift.
79
+ */
80
+ class Func_void_std__exception_ptr_Wrapper final {
81
+ public:
82
+ explicit Func_void_std__exception_ptr_Wrapper(std::function<void(const std::exception_ptr& /* error */)>&& func): _function(std::make_unique<std::function<void(const std::exception_ptr& /* error */)>>(std::move(func))) {}
83
+ inline void call(std::exception_ptr error) const noexcept {
84
+ _function->operator()(error);
85
+ }
86
+ private:
87
+ std::unique_ptr<std::function<void(const std::exception_ptr& /* error */)>> _function;
88
+ } SWIFT_NONCOPYABLE;
89
+ Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* NON_NULL swiftClosureWrapper) noexcept;
90
+ inline Func_void_std__exception_ptr_Wrapper wrap_Func_void_std__exception_ptr(Func_void_std__exception_ptr value) noexcept {
91
+ return Func_void_std__exception_ptr_Wrapper(std::move(value));
92
+ }
93
+
35
94
  // pragma MARK: std::shared_ptr<HybridGameAssetsSpec>
36
95
  /**
37
96
  * Specialized version of `std::shared_ptr<HybridGameAssetsSpec>`.
@@ -53,13 +112,13 @@ namespace margelo::nitro::rngine::bridge::swift {
53
112
  return Result<bool>::withError(error);
54
113
  }
55
114
 
56
- // pragma MARK: Result<void>
57
- using Result_void_ = Result<void>;
58
- inline Result_void_ create_Result_void_() noexcept {
59
- return Result<void>::withValue();
115
+ // pragma MARK: Result<std::shared_ptr<Promise<void>>>
116
+ using Result_std__shared_ptr_Promise_void___ = Result<std::shared_ptr<Promise<void>>>;
117
+ inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::shared_ptr<Promise<void>>& value) noexcept {
118
+ return Result<std::shared_ptr<Promise<void>>>::withValue(value);
60
119
  }
61
- inline Result_void_ create_Result_void_(const std::exception_ptr& error) noexcept {
62
- return Result<void>::withError(error);
120
+ inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::exception_ptr& error) noexcept {
121
+ return Result<std::shared_ptr<Promise<void>>>::withError(error);
63
122
  }
64
123
 
65
124
  // pragma MARK: std::shared_ptr<HybridGameEngineSpec>
@@ -16,6 +16,7 @@ namespace margelo::nitro::rngine { class HybridGameEngineSpec; }
16
16
  // Include C++ defined types
17
17
  #include "HybridGameAssetsSpec.hpp"
18
18
  #include "HybridGameEngineSpec.hpp"
19
+ #include <NitroModules/Promise.hpp>
19
20
  #include <NitroModules/Result.hpp>
20
21
  #include <exception>
21
22
  #include <memory>
@@ -14,6 +14,7 @@ namespace Rngine { class HybridGameAssetsSpec_cxx; }
14
14
 
15
15
 
16
16
 
17
+ #include <NitroModules/Promise.hpp>
17
18
  #include <string>
18
19
 
19
20
  #include "Rngine-Swift-Cxx-Umbrella.hpp"
@@ -74,17 +75,21 @@ namespace margelo::nitro::rngine {
74
75
  auto __value = std::move(__result.value());
75
76
  return __value;
76
77
  }
77
- inline void registerSvg(double id, const std::string& uri) override {
78
+ inline std::shared_ptr<Promise<void>> registerSvg(double id, const std::string& uri) override {
78
79
  auto __result = _swiftPart.registerSvg(std::forward<decltype(id)>(id), uri);
79
80
  if (__result.hasError()) [[unlikely]] {
80
81
  std::rethrow_exception(__result.error());
81
82
  }
83
+ auto __value = std::move(__result.value());
84
+ return __value;
82
85
  }
83
- inline void registerLottie(double id, const std::string& json) override {
86
+ inline std::shared_ptr<Promise<void>> registerLottie(double id, const std::string& json) override {
84
87
  auto __result = _swiftPart.registerLottie(std::forward<decltype(id)>(id), json);
85
88
  if (__result.hasError()) [[unlikely]] {
86
89
  std::rethrow_exception(__result.error());
87
90
  }
91
+ auto __value = std::move(__result.value());
92
+ return __value;
88
93
  }
89
94
 
90
95
  private:
@@ -0,0 +1,46 @@
1
+ ///
2
+ /// Func_void.swift
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ import NitroModules
9
+
10
+ /**
11
+ * Wraps a Swift `() -> Void` as a class.
12
+ * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
13
+ */
14
+ public final class Func_void {
15
+ public typealias bridge = margelo.nitro.rngine.bridge.swift
16
+
17
+ private let closure: () -> Void
18
+
19
+ public init(_ closure: @escaping () -> Void) {
20
+ self.closure = closure
21
+ }
22
+
23
+ @inline(__always)
24
+ public func call() -> Void {
25
+ self.closure()
26
+ }
27
+
28
+ /**
29
+ * Casts this instance to a retained unsafe raw pointer.
30
+ * This acquires one additional strong reference on the object!
31
+ */
32
+ @inline(__always)
33
+ public func toUnsafe() -> UnsafeMutableRawPointer {
34
+ return Unmanaged.passRetained(self).toOpaque()
35
+ }
36
+
37
+ /**
38
+ * Casts an unsafe pointer to a `Func_void`.
39
+ * The pointer has to be a retained opaque `Unmanaged<Func_void>`.
40
+ * This removes one strong reference from the object!
41
+ */
42
+ @inline(__always)
43
+ public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void {
44
+ return Unmanaged<Func_void>.fromOpaque(pointer).takeRetainedValue()
45
+ }
46
+ }
@@ -0,0 +1,46 @@
1
+ ///
2
+ /// Func_void_std__exception_ptr.swift
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ import NitroModules
9
+
10
+ /**
11
+ * Wraps a Swift `(_ error: Error) -> Void` as a class.
12
+ * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
13
+ */
14
+ public final class Func_void_std__exception_ptr {
15
+ public typealias bridge = margelo.nitro.rngine.bridge.swift
16
+
17
+ private let closure: (_ error: Error) -> Void
18
+
19
+ public init(_ closure: @escaping (_ error: Error) -> Void) {
20
+ self.closure = closure
21
+ }
22
+
23
+ @inline(__always)
24
+ public func call(error: std.exception_ptr) -> Void {
25
+ self.closure(RuntimeError.from(cppError: error))
26
+ }
27
+
28
+ /**
29
+ * Casts this instance to a retained unsafe raw pointer.
30
+ * This acquires one additional strong reference on the object!
31
+ */
32
+ @inline(__always)
33
+ public func toUnsafe() -> UnsafeMutableRawPointer {
34
+ return Unmanaged.passRetained(self).toOpaque()
35
+ }
36
+
37
+ /**
38
+ * Casts an unsafe pointer to a `Func_void_std__exception_ptr`.
39
+ * The pointer has to be a retained opaque `Unmanaged<Func_void_std__exception_ptr>`.
40
+ * This removes one strong reference from the object!
41
+ */
42
+ @inline(__always)
43
+ public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_std__exception_ptr {
44
+ return Unmanaged<Func_void_std__exception_ptr>.fromOpaque(pointer).takeRetainedValue()
45
+ }
46
+ }
@@ -14,8 +14,8 @@ public protocol HybridGameAssetsSpec_protocol: HybridObject {
14
14
 
15
15
  // Methods
16
16
  func isAssetRegistered(id: Double) throws -> Bool
17
- func registerSvg(id: Double, uri: String) throws -> Void
18
- func registerLottie(id: Double, json: String) throws -> Void
17
+ func registerSvg(id: Double, uri: String) throws -> Promise<Void>
18
+ func registerLottie(id: Double, json: String) throws -> Promise<Void>
19
19
  }
20
20
 
21
21
  public extension HybridGameAssetsSpec_protocol {
@@ -137,24 +137,40 @@ open class HybridGameAssetsSpec_cxx {
137
137
  }
138
138
 
139
139
  @inline(__always)
140
- public final func registerSvg(id: Double, uri: std.string) -> bridge.Result_void_ {
140
+ public final func registerSvg(id: Double, uri: std.string) -> bridge.Result_std__shared_ptr_Promise_void___ {
141
141
  do {
142
- try self.__implementation.registerSvg(id: id, uri: String(uri))
143
- return bridge.create_Result_void_()
142
+ let __result = try self.__implementation.registerSvg(id: id, uri: String(uri))
143
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in
144
+ let __promise = bridge.create_std__shared_ptr_Promise_void__()
145
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise)
146
+ __result
147
+ .then({ __result in __promiseHolder.resolve() })
148
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
149
+ return __promise
150
+ }()
151
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp)
144
152
  } catch (let __error) {
145
153
  let __exceptionPtr = __error.toCpp()
146
- return bridge.create_Result_void_(__exceptionPtr)
154
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr)
147
155
  }
148
156
  }
149
157
 
150
158
  @inline(__always)
151
- public final func registerLottie(id: Double, json: std.string) -> bridge.Result_void_ {
159
+ public final func registerLottie(id: Double, json: std.string) -> bridge.Result_std__shared_ptr_Promise_void___ {
152
160
  do {
153
- try self.__implementation.registerLottie(id: id, json: String(json))
154
- return bridge.create_Result_void_()
161
+ let __result = try self.__implementation.registerLottie(id: id, json: String(json))
162
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in
163
+ let __promise = bridge.create_std__shared_ptr_Promise_void__()
164
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise)
165
+ __result
166
+ .then({ __result in __promiseHolder.resolve() })
167
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
168
+ return __promise
169
+ }()
170
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp)
155
171
  } catch (let __error) {
156
172
  let __exceptionPtr = __error.toCpp()
157
- return bridge.create_Result_void_(__exceptionPtr)
173
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr)
158
174
  }
159
175
  }
160
176
  }
@@ -15,6 +15,7 @@
15
15
 
16
16
 
17
17
 
18
+ #include <NitroModules/Promise.hpp>
18
19
  #include <string>
19
20
 
20
21
  namespace margelo::nitro::rngine {
@@ -49,8 +50,8 @@ namespace margelo::nitro::rngine {
49
50
  public:
50
51
  // Methods
51
52
  virtual bool isAssetRegistered(double id) = 0;
52
- virtual void registerSvg(double id, const std::string& uri) = 0;
53
- virtual void registerLottie(double id, const std::string& json) = 0;
53
+ virtual std::shared_ptr<Promise<void>> registerSvg(double id, const std::string& uri) = 0;
54
+ virtual std::shared_ptr<Promise<void>> registerLottie(double id, const std::string& json) = 0;
54
55
 
55
56
  protected:
56
57
  // Hybrid Setup
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rngine",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "React Native 2D game engine powered by Nitro Modules",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -29,6 +29,8 @@ void GameMethods::setEntities(const std::vector<Entity> &entities) {
29
29
  std::lock_guard<std::mutex> snapshotLock(instance.getSnapshotMutexInternal());
30
30
  auto &entitiesInternal = instance.getEntitiesInternal();
31
31
  auto &entitiesSnapshotInternal = instance.getEntitiesSnapshotInternal();
32
+ entitiesInternal.clear();
33
+ entitiesSnapshotInternal.clear();
32
34
  for (auto &entity : entities) {
33
35
  entitiesInternal[entity.id] = entity;
34
36
  entitiesSnapshotInternal[entity.id] = entity;
@@ -6,8 +6,8 @@ interface GameAssets extends HybridObject<{
6
6
  android: 'kotlin';
7
7
  }> {
8
8
  isAssetRegistered(id: number): boolean;
9
- registerSvg(id: number, uri: string): void;
10
- registerLottie(id: number, json: string): void;
9
+ registerSvg(id: number, uri: string): Promise<void>;
10
+ registerLottie(id: number, json: string): Promise<void>;
11
11
  }
12
12
 
13
13
  export const gameAssets =
@@ -0,0 +1,47 @@
1
+ import { Image } from 'react-native';
2
+ import { gameAssets } from './GameAssets.nitro';
3
+
4
+ const assetCache = new WeakMap<object, number>();
5
+ let nextId = -1;
6
+
7
+ const loadAsset = async (asset: unknown) => {
8
+ switch (typeof asset) {
9
+ case 'object':
10
+ if (asset === null) {
11
+ throw new Error('loadAssets: asset cannot be null');
12
+ }
13
+ if (assetCache.has(asset)) {
14
+ return assetCache.get(asset)!;
15
+ }
16
+ const assetId = nextId--;
17
+ assetCache.set(asset, assetId);
18
+ await gameAssets.registerLottie(assetId, JSON.stringify(asset));
19
+ return assetId;
20
+
21
+ case 'number':
22
+ if (gameAssets.isAssetRegistered(asset)) {
23
+ return asset;
24
+ }
25
+ const assetUri = Image.resolveAssetSource(asset)?.uri;
26
+ if (!assetUri) {
27
+ throw new Error(`loadAssets: could not resolve asset URI for ${asset}`);
28
+ }
29
+ await gameAssets.registerSvg(asset, assetUri);
30
+ return asset;
31
+ }
32
+
33
+ throw new Error(`loadAssets: unsupported asset type "${typeof asset}"`);
34
+ };
35
+
36
+ export const loadAssets = async <T extends Record<string, unknown>>(
37
+ assets: T
38
+ ): Promise<{ [K in keyof T]: number }> => {
39
+ const keys = Object.keys(assets) as (keyof T)[];
40
+ const result = {} as { [K in keyof T]: number };
41
+
42
+ for (const key of keys) {
43
+ result[key] = await loadAsset(assets[key]);
44
+ }
45
+
46
+ return result;
47
+ };
@@ -1,5 +1,5 @@
1
1
  import { getHostComponent } from 'react-native-nitro-modules';
2
- const GameEngineConfig = require('../nitrogen/generated/shared/json/GameEngineConfig.json');
2
+ import GameEngineConfig from '../nitrogen/generated/shared/json/GameEngineConfig.json';
3
3
  import type { GameEngineMethods, GameEngineProps } from './GameEngine.nitro';
4
4
 
5
5
  /**
@@ -1,4 +1,40 @@
1
1
  import { gameMethods } from './GameMethods.nitro';
2
+ import type { Entity, EntityUpdate, System } from './nativeTypes';
3
+ import type { Config } from './types';
4
+
5
+ /** Sets up the game engine with the given configuration. Call this before anything else. */
6
+ export const configure = ({
7
+ tickRate,
8
+ screen,
9
+ entities = [],
10
+ systems = [],
11
+ paused = true,
12
+ }: Config) => {
13
+ let nativeSystems: System[] = [];
14
+
15
+ for (const system of systems) {
16
+ nativeSystems.push({
17
+ entities: system.entities,
18
+ collisions: system.collisions,
19
+ onTick: (e, c) => {
20
+ const start = Date.now();
21
+ system.onTick(e, c);
22
+ const finish = Date.now();
23
+ return finish - start;
24
+ },
25
+ });
26
+ }
27
+
28
+ gameMethods.setTickRate(tickRate);
29
+ gameMethods.setScreen(screen);
30
+ gameMethods.setEntities(entities);
31
+ gameMethods.setSystems(nativeSystems);
32
+ if (paused) {
33
+ gameMethods.pause();
34
+ } else {
35
+ gameMethods.resume();
36
+ }
37
+ };
2
38
 
3
39
  /** Pauses the game loop. Systems will stop running. */
4
40
  export const pause = () => gameMethods.pause();
@@ -6,5 +42,17 @@ export const pause = () => gameMethods.pause();
6
42
  /** Resumes the game loop. */
7
43
  export const resume = () => gameMethods.resume();
8
44
 
45
+ /** Spawns one or more entities into the world. Skips duplicates by id. */
46
+ export const spawn = (entities: Entity | Entity[]) => {
47
+ const entityArray = Array.isArray(entities) ? entities : [entities];
48
+ gameMethods.spawn(entityArray);
49
+ };
50
+
9
51
  /** Removes an entity or all entities matching the given id prefix from the world. */
10
52
  export const despawn = (id: string) => gameMethods.despawn(id);
53
+
54
+ /** Updates one or more entities. Only the provided fields are changed. */
55
+ export const update = (updates: EntityUpdate | EntityUpdate[]) => {
56
+ const entityUpdateArray = Array.isArray(updates) ? updates : [updates];
57
+ gameMethods.update(entityUpdateArray);
58
+ };
package/src/index.tsx CHANGED
@@ -1,6 +1,13 @@
1
1
  import GameEngine from './GameEngine';
2
2
 
3
3
  export * from './GameMethods';
4
- export * from './Shared';
4
+ export * from './GameAssets';
5
5
  export * from './types';
6
+ export type {
7
+ Screen,
8
+ Entity,
9
+ CollisionPair,
10
+ Collision,
11
+ EntityUpdate,
12
+ } from './nativeTypes';
6
13
  export { GameEngine };
package/src/types.ts CHANGED
@@ -1,29 +1,13 @@
1
1
  import type {
2
- Screen as NativeScreen,
3
- Entity as NativeEntity,
4
- EntityUpdate as NativeEntityUpdate,
5
2
  System as NativeSystem,
6
3
  Collision,
4
+ Screen,
5
+ Entity,
7
6
  } from './nativeTypes';
8
7
 
9
- export type Asset = number | object;
10
-
11
- export type Screen = Omit<NativeScreen, 'asset'> & {
12
- /** Asset to render, use `require` with the file path to get the id. */
13
- asset?: Asset;
14
- };
15
- export type Entity = Omit<NativeEntity, 'asset'> & {
16
- /** Asset to render, use `require` with the file path to get the id. */
17
- asset?: Asset;
18
- };
19
- export type EntityUpdate = Omit<NativeEntityUpdate, 'asset'> & {
20
- /** Asset to render, use `require` with the file path to get the id. */
21
- asset?: Asset;
22
- };
23
-
24
8
  export type System = Omit<NativeSystem, 'onTick'> & {
25
9
  /** Called every tick with the resolved entities and collisions. */
26
- onTick: (entities: NativeEntity[], collisions: Collision[]) => void;
10
+ onTick: (entities: Entity[], collisions: Collision[]) => void;
27
11
  };
28
12
 
29
13
  export type Config = {
@@ -1,85 +0,0 @@
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
- let nativeSystems = [];
45
- for (const system of systems) {
46
- nativeSystems.push({
47
- entities: system.entities,
48
- collisions: system.collisions,
49
- onTick: (e, c) => {
50
- const start = Date.now();
51
- system.onTick(e, c);
52
- const finish = Date.now();
53
- return finish - start;
54
- }
55
- });
56
- }
57
- gameMethods.setTickRate(tickRate);
58
- gameMethods.setScreen(screen);
59
- gameMethods.setEntities(entities);
60
- gameMethods.setSystems(nativeSystems);
61
- if (paused) {
62
- gameMethods.pause();
63
- } else {
64
- gameMethods.resume();
65
- }
66
- };
67
-
68
- /** Spawns one or more entities into the world. Skips duplicates by id. */
69
- export const spawn = entities => {
70
- const entityArray = Array.isArray(entities) ? entities : [entities];
71
- for (const entity of entityArray) {
72
- entity.asset = registerAssetIfNotExist(entity.asset);
73
- }
74
- gameMethods.spawn(entityArray);
75
- };
76
-
77
- /** Updates one or more entities. Only the provided fields are changed. */
78
- export const update = updates => {
79
- const entityUpdateArray = Array.isArray(updates) ? updates : [updates];
80
- for (const entityUpdate of entityUpdateArray) {
81
- entityUpdate.asset = registerAssetIfNotExist(entityUpdate.asset);
82
- }
83
- gameMethods.update(entityUpdateArray);
84
- };
85
- //# sourceMappingURL=Shared.js.map
@@ -1 +0,0 @@
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","nativeSystems","system","push","collisions","onTick","e","c","start","Date","now","finish","setTickRate","setScreen","setEntities","setSystems","pause","resume","spawn","entityArray","Array","isArray","update","updates","entityUpdateArray","entityUpdate"],"sourceRoot":"../../src","sources":["Shared.ts"],"mappings":"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","ignoreList":[]}
@@ -1,8 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"Shared.d.ts","sourceRoot":"","sources":["../../../src/Shared.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA8BnE,4FAA4F;AAC5F,eAAO,MAAM,SAAS,GAAI,kDAMvB,MAAM,SA8BR,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"}
package/src/Shared.ts DELETED
@@ -1,99 +0,0 @@
1
- import { Image } from 'react-native';
2
- import { gameAssets } from './GameAssets.nitro';
3
- import { gameMethods } from './GameMethods.nitro';
4
- import type {
5
- Screen as NativeScreen,
6
- Entity as NativeEntity,
7
- EntityUpdate as NativeEntityUpdate,
8
- System as NativeSystem,
9
- } from './nativeTypes';
10
- import type { Asset, Config, Entity, EntityUpdate } from './types';
11
-
12
- const assetCache = new WeakMap<object, number>();
13
- let nextId = -1;
14
-
15
- const registerAssetIfNotExist = (asset?: Asset) => {
16
- switch (typeof asset) {
17
- case 'object':
18
- if (assetCache.has(asset)) {
19
- return assetCache.get(asset);
20
- }
21
- const assetId = nextId--;
22
- assetCache.set(asset, assetId);
23
- gameAssets.registerLottie(assetId, JSON.stringify(asset));
24
- return assetId;
25
-
26
- case 'number':
27
- if (gameAssets.isAssetRegistered(asset)) {
28
- return asset;
29
- }
30
- const assetUri = Image.resolveAssetSource(asset)?.uri;
31
- if (!assetUri) {
32
- break;
33
- }
34
- gameAssets.registerSvg(asset, assetUri);
35
- return asset;
36
- }
37
- return;
38
- };
39
-
40
- /** Sets up the game engine with the given configuration. Call this before anything else. */
41
- export const configure = ({
42
- tickRate,
43
- screen,
44
- entities = [],
45
- systems = [],
46
- paused = true,
47
- }: Config) => {
48
- screen.asset = registerAssetIfNotExist(screen.asset);
49
- for (const entity of entities) {
50
- entity.asset = registerAssetIfNotExist(entity.asset);
51
- }
52
-
53
- let nativeSystems: NativeSystem[] = [];
54
-
55
- for (const system of systems) {
56
- nativeSystems.push({
57
- entities: system.entities,
58
- collisions: system.collisions,
59
- onTick: (e, c) => {
60
- const start = Date.now();
61
- system.onTick(e, c);
62
- const finish = Date.now();
63
- return finish - start;
64
- },
65
- });
66
- }
67
-
68
- gameMethods.setTickRate(tickRate);
69
- gameMethods.setScreen(screen as NativeScreen);
70
- gameMethods.setEntities(entities as NativeEntity[]);
71
- gameMethods.setSystems(nativeSystems);
72
- if (paused) {
73
- gameMethods.pause();
74
- } else {
75
- gameMethods.resume();
76
- }
77
- };
78
-
79
- /** Spawns one or more entities into the world. Skips duplicates by id. */
80
- export const spawn = (entities: Entity | Entity[]) => {
81
- const entityArray = Array.isArray(entities) ? entities : [entities];
82
-
83
- for (const entity of entityArray) {
84
- entity.asset = registerAssetIfNotExist(entity.asset);
85
- }
86
-
87
- gameMethods.spawn(entityArray as NativeEntity[]);
88
- };
89
-
90
- /** Updates one or more entities. Only the provided fields are changed. */
91
- export const update = (updates: EntityUpdate | EntityUpdate[]) => {
92
- const entityUpdateArray = Array.isArray(updates) ? updates : [updates];
93
-
94
- for (const entityUpdate of entityUpdateArray) {
95
- entityUpdate.asset = registerAssetIfNotExist(entityUpdate.asset);
96
- }
97
-
98
- gameMethods.update(entityUpdateArray as NativeEntityUpdate[]);
99
- };