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.
- package/README.md +1 -1
- package/android/src/main/java/com/margelo/nitro/rngine/GameAssets.kt +24 -20
- package/lib/module/GameAssets.js +41 -0
- package/lib/module/GameAssets.js.map +1 -0
- package/lib/module/GameEngine.js +1 -1
- package/lib/module/GameEngine.js.map +1 -1
- package/lib/module/GameMethods.js +43 -0
- package/lib/module/GameMethods.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/GameAssets.d.ts +2 -0
- package/lib/typescript/src/GameAssets.d.ts.map +1 -0
- package/lib/typescript/src/GameAssets.nitro.d.ts +2 -2
- package/lib/typescript/src/GameAssets.nitro.d.ts.map +1 -1
- package/lib/typescript/src/GameMethods.d.ts +8 -0
- package/lib/typescript/src/GameMethods.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +2 -15
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JHybridGameAssetsSpec.cpp +31 -6
- package/nitrogen/generated/android/c++/JHybridGameAssetsSpec.hpp +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/HybridGameAssetsSpec.kt +3 -2
- package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.cpp +16 -0
- package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.hpp +65 -6
- package/nitrogen/generated/ios/Rngine-Swift-Cxx-Umbrella.hpp +1 -0
- package/nitrogen/generated/ios/c++/HybridGameAssetsSpecSwift.hpp +7 -2
- package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridGameAssetsSpec.swift +2 -2
- package/nitrogen/generated/ios/swift/HybridGameAssetsSpec_cxx.swift +24 -8
- package/nitrogen/generated/shared/c++/HybridGameAssetsSpec.hpp +3 -2
- package/package.json +1 -1
- package/shared/GameMethods.cpp +2 -0
- package/src/GameAssets.nitro.ts +2 -2
- package/src/GameAssets.ts +47 -0
- package/src/GameEngine.tsx +1 -1
- package/src/GameMethods.ts +48 -0
- package/src/index.tsx +8 -1
- package/src/types.ts +3 -19
- package/lib/module/Shared.js +0 -85
- package/lib/module/Shared.js.map +0 -1
- package/lib/typescript/src/Shared.d.ts +0 -8
- package/lib/typescript/src/Shared.d.ts.map +0 -1
- 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/
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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":[]}
|
package/lib/module/GameEngine.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { getHostComponent } from 'react-native-nitro-modules';
|
|
4
|
-
|
|
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"
|
|
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
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GameEngine"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,iBAAc;AAErC,cAAc,kBAAe;AAC7B,cAAc,
|
|
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 @@
|
|
|
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;
|
|
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":"
|
|
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 './
|
|
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,
|
|
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 {
|
|
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:
|
|
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,
|
|
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<
|
|
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<
|
|
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
|
|
58
|
-
inline
|
|
59
|
-
return Result<void
|
|
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
|
|
62
|
-
return Result<void
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
package/shared/GameMethods.cpp
CHANGED
|
@@ -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;
|
package/src/GameAssets.nitro.ts
CHANGED
|
@@ -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
|
+
};
|
package/src/GameEngine.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getHostComponent } from 'react-native-nitro-modules';
|
|
2
|
-
|
|
2
|
+
import GameEngineConfig from '../nitrogen/generated/shared/json/GameEngineConfig.json';
|
|
3
3
|
import type { GameEngineMethods, GameEngineProps } from './GameEngine.nitro';
|
|
4
4
|
|
|
5
5
|
/**
|
package/src/GameMethods.ts
CHANGED
|
@@ -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 './
|
|
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:
|
|
10
|
+
onTick: (entities: Entity[], collisions: Collision[]) => void;
|
|
27
11
|
};
|
|
28
12
|
|
|
29
13
|
export type Config = {
|
package/lib/module/Shared.js
DELETED
|
@@ -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
|
package/lib/module/Shared.js.map
DELETED
|
@@ -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
|
-
};
|