Folder structure

This commit is contained in:
Martin
2022-12-06 10:00:18 +01:00
parent 5a98d691e1
commit 718d297318
21 changed files with 109 additions and 54 deletions

View File

@@ -0,0 +1,23 @@
import { GameTimer } from "../../../../Services/GameTimer";
import { roundToOneDecimal } from "../../../../Services/Utils/MathUtils";
import { EnemyMovementType } from "../EnemyMovementType";
import { EnemySpawner } from "../EnemySpawner";
import { EnemyType } from "../EnemyType";
export class CircularEnemySpawner {
private spawnTimer: GameTimer = new GameTimer(10);
public constructor(private enemySpawner: EnemySpawner, private enemiesToSpawn: number, private enemyType: EnemyType) {}
public gameTick(deltaTime: number): void {
this.spawnTimer.gameTick(deltaTime);
if (this.spawnTimer.tryFinishPeriod()) {
const angle: number = (2 * Math.PI) / this.enemiesToSpawn;
for (let i = 0; i < this.enemiesToSpawn; i++) {
const posX: number = roundToOneDecimal(Math.sin(angle * i)) * 500;
const posY: number = roundToOneDecimal(Math.cos(angle * i)) * 500;
this.enemySpawner.spawnNewEnemy(posX, posY, EnemyMovementType.Follow);
}
}
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "2e8e236a-fcdd-4995-aaff-be8802488d8c",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,12 @@
{
"ver": "1.1.0",
"importer": "directory",
"imported": true,
"uuid": "c3d97e6e-d624-48f8-a337-7bc21688eb22",
"files": [],
"subMetas": {},
"userData": {
"compressionType": {},
"isRemoteBundle": {}
}
}

View File

@@ -0,0 +1,54 @@
import { _decorator, Component, Prefab, Vec3, Node } from "cc";
import { ISignal } from "../../../../Services/EventSystem/ISignal";
import { Signal } from "../../../../Services/EventSystem/Signal";
import { ObjectPool } from "../../../../Services/ObjectPool";
import { Enemy } from "../Enemy";
import { EnemyMovementType } from "../EnemyMovementType";
const { ccclass, property } = _decorator;
@ccclass("EnemySpawner")
export class EnemySpawner extends Component {
@property(Prefab) private enemies: Prefab[] = [];
public enemyAddedEvent: Signal<Enemy> = new Signal<Enemy>();
public enemyRemovedEvent: Signal<Enemy> = new Signal<Enemy>();
private enemyPool: ObjectPool<Enemy>;
private targetNode: Node;
public init(targetNode: Node): void {
this.targetNode = targetNode;
this.enemyPool = new ObjectPool(this.enemies[0], this.node, 50, "Enemy");
}
public get EnemyAddedEvent(): ISignal<Enemy> {
return this.enemyAddedEvent;
}
public get EnemyRemovedEvent(): ISignal<Enemy> {
return this.enemyRemovedEvent;
}
public spawnNewEnemy(positionX: number, positionY: number, movementType: EnemyMovementType): Enemy {
const enemy = this.enemyPool.borrow();
const spawnPosition = new Vec3();
spawnPosition.x = this.targetNode.worldPosition.x + positionX;
spawnPosition.y = this.targetNode.worldPosition.y + positionY;
enemy.setup(spawnPosition, movementType);
enemy.DeathEvent.on(this.returnEnemy, this);
this.enemyAddedEvent.trigger(enemy);
return enemy;
}
public returnEnemy(enemy: Enemy): void {
enemy.DeathEvent.off(this.returnEnemy);
this.enemyPool.return(enemy);
this.enemyRemovedEvent.trigger(enemy);
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "2260c189-1007-4d96-9270-ce4e6d352cd4",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,21 @@
import { randomRange } from "cc";
import { GameTimer } from "../../../../Services/GameTimer";
import { randomPositiveOrNegative } from "../../../../Services/Utils/MathUtils";
import { EnemyMovementType } from "../EnemyMovementType";
import { EnemySpawner } from "../EnemySpawner";
import { EnemyType } from "../EnemyType";
export class IndividualEnemySpawner {
private spawnTimer: GameTimer = new GameTimer(1);
public constructor(private enemySpawner: EnemySpawner, private enemyType: EnemyType) {}
public gameTick(deltaTime: number): void {
this.spawnTimer.gameTick(deltaTime);
if (this.spawnTimer.tryFinishPeriod()) {
const posX: number = randomRange(300, 600) * randomPositiveOrNegative();
const posY: number = randomRange(300, 600) * randomPositiveOrNegative();
this.enemySpawner.spawnNewEnemy(posX, posY, EnemyMovementType.Launch);
}
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "2deef32d-8a42-4617-8466-55c49b0a6439",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,73 @@
import { randomRange } from "cc";
import { GameTimer } from "../../../../Services/GameTimer";
import { randomPositiveOrNegative } from "../../../../Services/Utils/MathUtils";
import { WaveEnemySpawnerSettings } from "../../../Data/GameSettings";
import { Enemy } from "../Enemy";
import { EnemyMovementType } from "../EnemyMovementType";
import { EnemySpawner } from "../EnemySpawner";
import { EnemyType } from "../EnemyType";
export class WaveEnemySpawner {
private enemiesPerWave: number;
private waveLifetime: number;
private enemyType: EnemyType;
private spawnTimer: GameTimer;
private waves: EnemyWave[] = [];
public constructor(private enemySpawner: EnemySpawner, settings: WaveEnemySpawnerSettings) {
this.spawnTimer = new GameTimer(settings.cooldown);
this.enemiesPerWave = settings.enemiesPerWave;
this.waveLifetime = settings.waveLifetime;
this.enemyType = <EnemyType>settings.enemyType;
}
public gameTick(deltaTime: number): void {
this.spawnTimer.gameTick(deltaTime);
this.tryRemoveExpiredEnemies(deltaTime);
this.trySpawnNewGroup();
}
private tryRemoveExpiredEnemies(deltaTime: number): void {
for (let i = this.waves.length - 1; 0 <= i; i--) {
const wave: EnemyWave = this.waves[i];
wave.lifeTimeLeft -= deltaTime;
if (wave.lifeTimeLeft <= 0) {
for (const enemy of wave.enemies) {
if (enemy.Health.IsAlive) {
this.enemySpawner.returnEnemy(enemy);
}
}
this.waves.splice(i, 1);
}
}
}
private trySpawnNewGroup(): void {
if (this.spawnTimer.tryFinishPeriod()) {
const defaultPosX: number = 200 * randomPositiveOrNegative();
const defaultPosY: number = 200 * randomPositiveOrNegative();
const enemies: Enemy[] = [];
const side: number = Math.ceil(Math.sqrt(this.enemiesPerWave));
for (let i = 0; i < this.enemiesPerWave; i++) {
const randomOffsetX: number = randomRange(-20, 20);
const randomOffsetY: number = randomRange(-20, 20);
const posX: number = defaultPosX + randomOffsetX + 50 * (i % side);
const posY: number = defaultPosY + randomOffsetY + 50 * Math.floor(i / side);
const enemy = this.enemySpawner.spawnNewEnemy(posX, posY, EnemyMovementType.Launch);
enemies.push(enemy);
}
this.waves.push({ enemies, lifeTimeLeft: this.waveLifetime });
}
}
}
class EnemyWave {
public enemies: Enemy[];
public lifeTimeLeft: number;
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "d4d27dc6-0934-46d2-b657-6c1eb87f6824",
"files": [],
"subMetas": {},
"userData": {}
}