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