mirror of
https://github.com/MartinKral/Slash-The-Hordes
synced 2025-09-24 04:39:05 +00:00
Folder structure
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "2e8e236a-fcdd-4995-aaff-be8802488d8c",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"ver": "1.1.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "c3d97e6e-d624-48f8-a337-7bc21688eb22",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"compressionType": {},
|
||||
"isRemoteBundle": {}
|
||||
}
|
||||
}
|
54
assets/Scripts/Game/Unit/Enemy/EnemySpawner/EnemySpawner.ts
Normal file
54
assets/Scripts/Game/Unit/Enemy/EnemySpawner/EnemySpawner.ts
Normal 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);
|
||||
}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "2260c189-1007-4d96-9270-ce4e6d352cd4",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "2deef32d-8a42-4617-8466-55c49b0a6439",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "d4d27dc6-0934-46d2-b657-6c1eb87f6824",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
Reference in New Issue
Block a user