@@ -20,17 +20,15 @@ import {
20
20
import { DestroyEnemy , type GameEventMap } from "./events" ;
21
21
import type { InputManager } from "./input-manager" ;
22
22
23
+ const playerVelocity = queryRequired ( { player : Player , velocity : Velocity } ) ;
24
+ const playerPosition = queryRequired ( { player : Player , position : Position } ) ;
25
+
23
26
const moving = query ( { position : Position , velocity : Velocity } ) ;
24
27
const physics = query ( { position : Position , collider : Collider } ) ;
25
28
const pixiRender = query ( { position : Position , sprite : Sprite } ) ;
26
- const playerVelocity = queryRequired ( { player : Player , velocity : Velocity } ) ;
27
- const playerPosition = queryRequired ( { player : Player , position : Position } ) ;
28
- const bullets = queryRequired ( { bullet : Bullet , collider : Collider } ) ;
29
- const enemies = queryRequired ( { enemy : Enemy , collider : Collider } ) ;
30
- const descent = queryRequired ( {
31
- descentPattern : DescentPattern ,
32
- position : Position ,
33
- } ) ;
29
+ const bullets = query ( { bullet : Bullet , collider : Collider } ) ;
30
+ const enemies = query ( { enemy : Enemy , collider : Collider } ) ;
31
+ const descent = query ( { descentPattern : DescentPattern , position : Position } ) ;
34
32
35
33
export const MovementSystem : SystemUpdate < GameEventMap > = ( {
36
34
world,
@@ -75,6 +73,50 @@ export const EnemyDescentSystem = () => {
75
73
} ;
76
74
} ;
77
75
76
+ export const EnemySpawnSystem = ( {
77
+ app,
78
+ engine,
79
+ } : {
80
+ app : PIXI . Application ;
81
+ engine : Matter . Engine ;
82
+ } ) => {
83
+ let spawnCooldown = 100 ;
84
+ let lastSpawnTime = Number . MAX_VALUE ;
85
+ return ( ) : SystemUpdate < GameEventMap > =>
86
+ ( { deltaTime, createEntity, addComponent } ) => {
87
+ lastSpawnTime += deltaTime ;
88
+
89
+ if ( lastSpawnTime >= spawnCooldown ) {
90
+ lastSpawnTime = 0 ;
91
+
92
+ const enemySprite = new PIXI . Sprite ( PIXI . Texture . WHITE ) ;
93
+ enemySprite . width = 40 ;
94
+ enemySprite . height = 40 ;
95
+ enemySprite . tint = 0x00ff00 ;
96
+ enemySprite . position . set ( Math . random ( ) * 800 , 0 ) ;
97
+ app . stage . addChild ( enemySprite ) ;
98
+
99
+ const enemyBody = Matter . Bodies . rectangle (
100
+ enemySprite . x ,
101
+ enemySprite . y ,
102
+ 40 ,
103
+ 40 ,
104
+ { isSensor : true }
105
+ ) ;
106
+ Matter . World . add ( engine . world , enemyBody ) ;
107
+
108
+ addComponent (
109
+ createEntity ( ) ,
110
+ new Position ( { x : enemySprite . x , y : enemySprite . y } ) ,
111
+ new Sprite ( { sprite : enemySprite } ) ,
112
+ new Collider ( { body : enemyBody } ) ,
113
+ new Enemy ( { health : 3 } ) ,
114
+ DescentPattern . zigZag
115
+ ) ;
116
+ }
117
+ } ;
118
+ } ;
119
+
78
120
export const EnemyBulletCollisionSystem : SystemUpdate < GameEventMap > = ( {
79
121
world,
80
122
emit,
@@ -104,15 +146,15 @@ export const EnemyDestroySystem =
104
146
sprite : Sprite ,
105
147
} ) ( bulletId ) ;
106
148
107
- bulletSprite . sprite . sprite . destroy ( ) ;
108
- Matter . World . remove ( engine . world , bulletSprite . collider . body ) ;
109
- destroyEntity ( bulletId ) ;
110
-
111
149
const enemySprite = getComponentRequired ( {
112
150
enemy : Enemy ,
113
151
collider : Collider ,
114
152
sprite : Sprite ,
115
- } ) ( bulletId ) ;
153
+ } ) ( enemyId ) ;
154
+
155
+ bulletSprite . sprite . sprite . destroy ( ) ;
156
+ Matter . World . remove ( engine . world , bulletSprite . collider . body ) ;
157
+ destroyEntity ( bulletId ) ;
116
158
117
159
enemySprite . sprite . sprite . destroy ( ) ;
118
160
Matter . World . remove ( engine . world , enemySprite . collider . body ) ;
@@ -152,7 +194,7 @@ export const ShootingSystem = ({
152
194
153
195
const bulletPosition = new Position ( {
154
196
x : position . x ,
155
- y : position . y + 10 ,
197
+ y : position . y - 10 ,
156
198
} ) ;
157
199
158
200
const bulletSprite = new PIXI . Sprite ( PIXI . Texture . WHITE ) ;
0 commit comments