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

@ -58,5 +58,13 @@
"maxDiagonalProjectileUpgrades": 0,
"maxHaloProjectileUpgrades": 5,
"maxRegenerationUpgrades": 5
},
"enemyManager": {
"waveEnemySpawner": {
"cooldown": 5,
"enemiesPerWave": 30,
"waveLifetime": 20,
"enemyType": "Basic"
}
}
}

View File

@ -2080,7 +2080,7 @@
"_id": "936Vpv3ydL8JZMvakVgAP5"
},
{
"__type__": "7914boZbMpO4oIxuuvZ61Wb",
"__type__": "2260cGJEAdNlpJwzk5tNSzU",
"_name": "",
"_objFlags": 0,
"node": {
@ -2094,7 +2094,7 @@
"__expectedType__": "cc.Prefab"
}
],
"_id": "55UHuO7YRLaa/e/fP7FAK2"
"_id": "ebqmDEqu5OGJivYBW47skm"
},
{
"__type__": "839f4SZvHNBFaiDSpMi6pOJ",

View File

@ -1,6 +1,7 @@
export class GameSettings {
public player: PlayerSettings = new PlayerSettings();
public upgrades: UpgradeSettings = new UpgradeSettings();
public enemyManager: EnemyManagerSettings = new EnemyManagerSettings();
}
export class PlayerSettings {
@ -46,3 +47,14 @@ export class UpgradeSettings {
public maxHaloProjectileUpgrades = 0;
public maxRegenerationUpgrades = 0;
}
export class EnemyManagerSettings {
public waveEnemySpawner = new WaveEnemySpawnerSettings();
}
export class WaveEnemySpawnerSettings {
public cooldown = 0;
public enemiesPerWave = 0;
public waveLifetime = 0;
public enemyType = "";
}

View File

@ -52,7 +52,7 @@ export class GameBootstrapper extends Component {
this.playerCollisionSystem = new PlayerCollisionSystem(this.player, settings.player.collisionDelay);
new WeaponCollisionSystem(this.player.Weapon);
this.enemyManager.init(this.player.node);
this.enemyManager.init(this.player.node, settings.enemyManager);
this.haloProjectileLauncher = new HaloProjectileLauncher(
this.haloProjectileLauncherComponent,

View File

@ -1,15 +1,17 @@
import { Component, Node, _decorator } from "cc";
import { EnemyManagerSettings } from "../../Data/GameSettings";
import { XPSpawner } from "../../XP/XPSpawner";
import { CircularEnemySpawner } from "./CircularEnemySpawner";
import { Enemy } from "./Enemy";
import { EnemyMovementType } from "./EnemyMovementType";
import { EnemyMover } from "./EnemyMover";
import { EnemySpawner } from "./EnemySpawner";
import { EnemyMover } from "./EnemyMover/EnemyMover";
import { FollowTargetEnemyMover } from "./EnemyMover/FollowTargetEnemyMover";
import { WaveEnemyMover } from "./EnemyMover/WaveEnemyMover";
import { CircularEnemySpawner } from "./EnemySpawner/CircularEnemySpawner";
import { EnemySpawner } from "./EnemySpawner/EnemySpawner";
import { IndividualEnemySpawner } from "./EnemySpawner/IndividualEnemySpawner";
import { WaveEnemySpawner } from "./EnemySpawner/WaveEnemySpawner";
import { EnemyType } from "./EnemyType";
import { FollowTargetEnemyMover } from "./FollowTargetEnemyMover";
import { InvididualEnemySpawner as IndividualEnemySpawner } from "./InvididualEnemySpawner";
import { LaunchToTargetEnemyMover } from "./LaunchToTargetEnemyMover";
import { WaveEnemySpawner } from "./WaveEnemySpawner";
const { ccclass, property } = _decorator;
@ccclass("EnemyManager")
@ -23,24 +25,24 @@ export class EnemyManager extends Component {
private circularEnemySpawner: CircularEnemySpawner;
private waveEnemySpawner: WaveEnemySpawner;
public init(targetNode: Node): void {
public init(targetNode: Node, settings: EnemyManagerSettings): void {
this.enemySpawner.init(targetNode);
this.enemySpawner.EnemyAddedEvent.on(this.onEnemyAdded, this);
this.enemySpawner.enemyRemovedEvent.on(this.onRemoveEnemy, this);
this.individualEnemySpawner = new IndividualEnemySpawner(this.enemySpawner, EnemyType.Basic);
this.circularEnemySpawner = new CircularEnemySpawner(this.enemySpawner, 30, EnemyType.Basic);
this.waveEnemySpawner = new WaveEnemySpawner(this.enemySpawner, 30, 10, EnemyType.Basic);
this.waveEnemySpawner = new WaveEnemySpawner(this.enemySpawner, settings.waveEnemySpawner);
this.movementTypeToMover.set(EnemyMovementType.Follow, new FollowTargetEnemyMover(targetNode));
this.movementTypeToMover.set(EnemyMovementType.Launch, new LaunchToTargetEnemyMover(targetNode));
this.movementTypeToMover.set(EnemyMovementType.Launch, new WaveEnemyMover(targetNode));
this.xpSpawner.init();
}
public gameTick(deltaTime: number): void {
//this.individualEnemySpawner.gameTick(deltaTime);
//this.circularEnemySpawner.gameTick(deltaTime);
this.individualEnemySpawner.gameTick(deltaTime);
this.circularEnemySpawner.gameTick(deltaTime);
this.waveEnemySpawner.gameTick(deltaTime);
for (const kvp of this.movementTypeToMover) {

View File

@ -0,0 +1,12 @@
{
"ver": "1.1.0",
"importer": "directory",
"imported": true,
"uuid": "19a29ec1-9090-43e5-ab3f-8b7430e496ed",
"files": [],
"subMetas": {},
"userData": {
"compressionType": {},
"isRemoteBundle": {}
}
}

View File

@ -1,5 +1,5 @@
import { Node } from "cc";
import { Enemy } from "./Enemy";
import { Enemy } from "../Enemy";
export abstract class EnemyMover {
protected targetNode: Node;

View File

@ -1,8 +1,8 @@
import { Vec3 } from "cc";
import { Enemy } from "./Enemy";
import { Enemy } from "../Enemy";
import { EnemyMover } from "./EnemyMover";
export class LaunchToTargetEnemyMover extends EnemyMover {
export class WaveEnemyMover extends EnemyMover {
private enemyToDirection: Map<Enemy, Vec3> = new Map<Enemy, Vec3>();
private lastTargetPosition: Vec3 = new Vec3();
private lastDirection: Vec3 = new Vec3();

View File

@ -1,8 +1,8 @@
import { GameTimer } from "../../../Services/GameTimer";
import { roundToOneDecimal } from "../../../Services/Utils/MathUtils";
import { EnemyMovementType } from "./EnemyMovementType";
import { EnemySpawner } from "./EnemySpawner";
import { EnemyType } from "./EnemyType";
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);

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

@ -1,10 +1,10 @@
import { Component, Node, Prefab, Vec3, _decorator } from "cc";
import { ISignal } from "../../../Services/EventSystem/ISignal";
import { Signal } from "../../../Services/EventSystem/Signal";
import { ObjectPool } from "../../../Services/ObjectPool";
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";
import { Enemy } from "./Enemy";
import { EnemyMovementType } from "./EnemyMovementType";
const { ccclass, property } = _decorator;
@ccclass("EnemySpawner")

View File

@ -2,7 +2,7 @@
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "7914ba19-6cca-4ee2-8231-baebd9eb559b",
"uuid": "2260c189-1007-4d96-9270-ce4e6d352cd4",
"files": [],
"subMetas": {},
"userData": {}

View File

@ -1,11 +1,11 @@
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";
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 InvididualEnemySpawner {
export class IndividualEnemySpawner {
private spawnTimer: GameTimer = new GameTimer(1);
public constructor(private enemySpawner: EnemySpawner, private enemyType: EnemyType) {}

View File

@ -2,7 +2,7 @@
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "46674857-f5ad-4112-8b5d-c19879117904",
"uuid": "2deef32d-8a42-4617-8466-55c49b0a6439",
"files": [],
"subMetas": {},
"userData": {}

View File

@ -1,20 +1,26 @@
import { randomRange } from "cc";
import { GameTimer } from "../../../Services/GameTimer";
import { randomPositiveOrNegative } from "../../../Services/Utils/MathUtils";
import { Enemy } from "./Enemy";
import { EnemyMovementType } from "./EnemyMovementType";
import { EnemySpawner } from "./EnemySpawner";
import { EnemyType } from "./EnemyType";
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 spawnTimer: GameTimer = new GameTimer(5);
private enemiesPerWave: number;
private waveLifetime: number;
private enemyType: EnemyType;
private spawnTimer: GameTimer;
private waves: EnemyWave[] = [];
public constructor(
private enemySpawner: EnemySpawner,
private enemiesToSpawn: number,
private enemyLifeTime: number,
private enemyType: EnemyType
) {}
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);
@ -27,10 +33,13 @@ export class WaveEnemySpawner {
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);
}
@ -43,8 +52,8 @@ export class WaveEnemySpawner {
const defaultPosY: number = 200 * randomPositiveOrNegative();
const enemies: Enemy[] = [];
const side: number = Math.ceil(Math.sqrt(this.enemiesToSpawn));
for (let i = 0; i < this.enemiesToSpawn; i++) {
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);
@ -53,7 +62,7 @@ export class WaveEnemySpawner {
enemies.push(enemy);
}
this.waves.push({ enemies, lifeTimeLeft: this.enemyLifeTime });
this.waves.push({ enemies, lifeTimeLeft: this.waveLifetime });
}
}
}