创作灵感来自于2024年7月25号上架steam端的一个塔防游戏《王国保卫战5:联盟》,是一款比较经典的塔防游戏,第一次接触是在4399网页端的版本,这个版本于2024年7月28号通过普通模式的最后一关,总体上就是好玩,同时也萌发了写塔防游戏的想法,不过在正式开写之前打算通过接口的方式初步摸索一下里面的系统设计,于是有了下面的这篇文章。
主要是一些接口的初步设计,后续不一定要沿用这个模版,不过大体上思路是这样的,话不多说,直接上代码(后续有时间会继续迭代这个版本,同时借助Cocos或者untiy实现游戏的原型)
// 塔防游戏 接口设计
export namespace TowerDefense {
// 属性命名空间
export namespace Property {
/*
描述
@param name 名字
@param introduce 介绍
*/
export interface Description {
name: string;
introduce: string;
}
/*
攻击
@param base 基础伤害
@param physical 物理穿透
@param magimic 魔方穿透
*/
export interface Attack {
base: number;
physical: number;
magimic: number;
}
/*
防御
@param base 基础防御
@param physical 物理防御
@param magimic 魔方防御
*/
export interface Defense {
base: number;
physical: number;
magimic: number;
}
/*
生命周期
@method create 创建
@method update 更新
@method destroy 销毁
*/
export interface LifeCycleComponent {
create(): void;
update(): void;
destroy(): void;
}
/*
游戏实体
@param des 描述
@param attack 攻击
@param defense 防御
@param speed 速度
@param hp 血量
@param state 状态
*/
export interface GameEntity extends LifeCycleComponent {
des: Property.Description;
attack: Property.Attack;
defense: Property.Defense;
speed: number;
hp: number;
state: State.GameStateManager;
}
}
// 状态命名空间
export namespace State {
/*
状态
@param des 描述
@param time 持续时间
@method execute 防御
*/
export interface BaseState {
des: Property.Description;
time: number;
execute(): void;
}
/*
冰冻状态
*/
export interface FrozenState extends BaseState {
}
/*
燃烧状态
@param attack 伤害
*/
export interface BurningState extends BaseState {
attack: Property.Attack;
}
/*
护盾状态
@param defense 防御
*/
export interface ShieldedState extends BaseState {
defense: Property.Defense;
}
/*
治愈状态
@param health 恢复值
*/
export interface HealthState extends BaseState {
health: number;
}
/*
速度状态
@param speed 速度变化值
*/
export interface SpeedState extends BaseState {
speed: number;
}
/*
状态管理类
@param states 状态列表
@method execute 执行状态
@method addState 添加状态
@method removeState 移除状态
*/
export interface GameStateManager {
states: Array<BaseState>;
execute(): void;
addState(state: BaseState): void;
removeState(state: BaseState): void;
}
}
// 技能命名空间
export namespace Skill {
/*
技能接口
@param des 描述
@param cd 冷却时间
@method release 释放技能
*/
export interface ISkill {
des: Property.Description;
cd: number;
release(): void;
}
/* 敌人技能接口 */
export interface IEnemySkill extends ISkill {
}
/* 英雄技能接口 */
export interface IHeroSkill extends ISkill {
}
}
// 敌人命名空间
export namespace Enemy {
/*
敌人攻击
@param damage 对基地造成的伤害
*/
export interface EnemyAttack extends Property.Attack {
damage: number;
}
/*
敌人
@param attack 攻击
@param skills 技能列表
*/
export interface IEnemy extends Property.GameEntity {
attack: EnemyAttack;
skills: Array<Skill.IEnemySkill>;
}
}
// 英雄命名空间
export namespace Hero {
/*
英雄
@param skills 技能列表
*/
export interface IHero extends Property.GameEntity {
skills: Array<Skill.IHeroSkill>;
}
}
// 游戏地图命名空间
export namespace Map {
/*
二维坐标
@param x x坐标
@param y y坐标
*/
export interface Coordinate {
x: number;
y: number;
}
/*
路径
@param start 起点
@param end 终点
@param width 宽度
*/
export interface IPath {
start: Coordinate;
end: Coordinate;
width: number;
}
/*
塔槽
@param coordinate 坐标
*/
export interface ITowerSlot {
coordinate: Coordinate;
}
/*
地图
@param paths 路径
@param towerSlots 塔槽
*/
export interface IMap {
paths: Array<IPath>;
towerSlots: Array<ITowerSlot>;
}
}
// 防御塔命名空间
export namespace Tower {
/*
塔升级
@param level 等级
@param cost 升级花费
*/
export interface TowerUpgrade {
level: number;
cost: number;
}
/*
防御塔
@param slot 塔槽
@param radius 塔半径
@param upgradeList 升级列表
@method upgrade 升级
*/
export interface ITower extends Property.GameEntity {
slot: Map.ITowerSlot;
radius: number;
upgradeList: Array<TowerUpgrade>;
upgrade(): void;
}
}
// 关卡命名空间
export namespace Level {
/*
敌人批次
@param enemies 敌人列表
@param delay 敌人生成延迟
@param time 敌人生成时间
@param path 敌人路径
*/
export interface IEnemyBatch {
enemies: Array<Enemy.IEnemy>;
delay: number;
time: number;
path: Array<Map.IPath>;
}
/*
敌人波次
@param enemyBatches 敌人批次
@method execute 进入波次时触发
*/
export interface IEnemyWave {
enemyBatches: Array<IEnemyBatch>;
execute(): void;
}
/*
关卡
@param map 地图
@param waves 敌人波次
*/
interface ILevel {
map: Map.IMap;
waves: Array<IEnemyWave>;
}
}
}