关于cocoscreator的游戏设计模式,你需要知道的

521 阅读4分钟

游戏设计模式是游戏开发中常用的编程模式和架构思想,用于解决常见的游戏开发问题,如对象管理、状态切换、事件处理等。以下是一些常见的游戏设计模式,并结合 Cocos Creator 给出实现示例。

1. 单例模式(Singleton Pattern)

概念

单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。在游戏开发中,常用于管理全局资源,像音效管理器、游戏数据管理器等,因为这些资源在整个游戏生命周期中通常只需要一个实例。

// SoundManager.ts
// 定义音效管理类,采用单例模式
export class SoundManager {
    // 用于存储单例实例的静态变量
    private static instance: SoundManager;

    // 私有构造函数,防止外部直接实例化该类
    private constructor() {}

    // 静态方法,用于获取单例实例
    public static getInstance(): SoundManager {
        // 如果实例还未创建,则创建一个新实例
        if (!this.instance) {
            this.instance = new SoundManager();
        }
        // 返回单例实例
        return this.instance;
    }

    // 播放音效的方法
    public playSound(soundName: string) {
        console.log(`Playing sound: ${soundName}`);
    }
}

使用场景

在 Cocos Creator 中,当你需要在不同的脚本中播放音效时,可以使用单例模式的音效管理器。例如,在玩家得分、碰撞等事件发生时播放相应的音效。

import { SoundManager } from './SoundManager';

// 获取音效管理器的单例实例
const soundManager = SoundManager.getInstance();
// 播放背景音效
soundManager.playSound('background_music');

对设计模式感兴趣的朋友可以 看看这里

2. 观察者模式(Observer Pattern)

概念

观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在游戏中,常用于处理事件和消息传递,如角色状态变化通知、游戏关卡结束通知等。

// EventManager.ts
// 定义事件管理类,采用观察者模式
export class EventManager {
    // 用于存储单例实例的静态变量
    private static instance: EventManager;
    // 存储事件监听器的对象,键为事件名,值为回调函数数组
    private eventListeners: { [eventName: string]: Function[] } = {};

    // 私有构造函数,防止外部直接实例化该类
    private constructor() {}

    // 静态方法,用于获取单例实例
    public static getInstance(): EventManager {
        // 如果实例还未创建,则创建一个新实例
        if (!this.instance) {
            this.instance = new EventManager();
        }
        // 返回单例实例
        return this.instance;
    }

    // 注册事件监听器的方法
    public on(eventName: string, callback: Function) {
        // 如果该事件名还没有对应的监听器数组,则创建一个
        if (!this.eventListeners[eventName]) {
            this.eventListeners[eventName] = [];
        }
        // 将回调函数添加到对应的监听器数组中
        this.eventListeners[eventName].push(callback);
    }

    // 移除事件监听器的方法
    public off(eventName: string, callback: Function) {
        // 如果该事件名有对应的监听器数组
        if (this.eventListeners[eventName]) {
            // 查找回调函数在数组中的索引
            const index = this.eventListeners[eventName].indexOf(callback);
            // 如果找到,则从数组中移除该回调函数
            if (index !== -1) {
                this.eventListeners[eventName].splice(index, 1);
            }
        }
    }

    // 触发事件的方法
    public emit(eventName: string, ...args: any[]) {
        // 如果该事件名有对应的监听器数组
        if (this.eventListeners[eventName]) {
            // 遍历监听器数组,依次调用每个回调函数,并传递参数
            this.eventListeners[eventName].forEach(callback => {
                callback(...args);
            });
        }
    }
}

使用场景

在 Cocos Creator 中,当多个脚本需要监听某个事件时,可以使用观察者模式的事件管理器。例如,当玩家生命值为 0 时,需要通知多个脚本执行不同的操作,如显示游戏结束界面、保存游戏数据等。

import { EventManager } from './EventManager';

// 获取事件管理器的单例实例
const eventManager = EventManager.getInstance();

// 定义回调函数
const callback = (message: string) => {
    console.log(`Received message: ${message}`);
};

// 订阅事件
eventManager.on('gameOver', callback);

// 发布事件
eventManager.emit('gameOver', 'You have completed the game!');

// 取消订阅
eventManager.off('gameOver', callback);

3. 状态模式(State Pattern)

概念

状态模式允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。在游戏中,常用于处理角色的不同状态,如站立、行走、奔跑、攻击等。

// CharacterState.ts
// 定义角色状态接口
export interface CharacterState {
    // 进入状态时执行的方法
    enter(): void;
    // 状态更新时执行的方法
    update(): void;
    // 离开状态时执行的方法
    exit(): void;
}

// StandingState.ts
// 定义站立状态类,实现 CharacterState 接口
export class StandingState implements CharacterState {
    // 引用角色对象
    private character: any;

    // 构造函数,接收角色对象作为参数
    constructor(character: any) {
        this.character = character;
    }

    // 进入站立状态时执行的方法
    enter() {
        console.log('Character is standing.');
    }

    // 站立状态更新时执行的方法
    update() {
        // 处理站立状态的逻辑
    }

    // 离开站立状态时执行的方法
    exit() {
        console.log('Character is leaving standing state.');
    }
}

// WalkingState.ts
// 定义行走状态类,实现 CharacterState 接口
export class WalkingState implements CharacterState {
    // 引用角色对象
    private character: any;

    // 构造函数,接收角色对象作为参数
    constructor(character: any) {
        this.character = character;
    }

    // 进入行走状态时执行的方法
    enter() {
        console.log('Character is walking.');
    }

    // 行走状态更新时执行的方法
    update() {
        // 处理行走状态的逻辑
    }

    // 离开行走状态时执行的方法
    exit() {
        console.log('Character is leaving walking state.');
    }
}

// Character.ts
// 定义角色类
export class Character {
    // 当前角色状态
    private currentState: CharacterState;

    // 构造函数,初始化角色状态为站立状态
    constructor() {
        this.currentState = new StandingState(this);
        // 进入当前状态
        this.currentState.enter();
    }

    // 改变角色状态的方法
    public changeState(newState: CharacterState) {
        // 离开当前状态
        this.currentState.exit();
        // 更新当前状态
        this.currentState = newState;
        // 进入新状态
        this.currentState.enter();
    }

    // 更新角色状态的方法
    public update() {
        // 调用当前状态的更新方法
        this.currentState.update();
    }
}

使用场景

在 Cocos Creator 中,当需要根据角色的不同状态执行不同的逻辑时,可以使用状态模式。例如,根据玩家的输入(如按下移动键、攻击键等)切换角色的状态。

import { Character, StandingState, WalkingState } from './Character';

// 创建角色对象
const character = new Character();
// 改变角色状态为行走状态
character.changeState(new WalkingState(character));

4. 工厂模式(Factory Pattern)

概念

工厂模式定义了一个创建对象的接口,让子类决定实例化哪个类。在游戏中,常用于创建不同类型的游戏对象,如敌人、道具等。

// Enemy.ts
// 定义敌人抽象类
export abstract class Enemy {
    // 抽象方法,用于敌人攻击
    public abstract attack(): void;
}

// Zombie.ts
// 定义僵尸类,继承自 Enemy 抽象类
export class Zombie extends Enemy {
    // 实现攻击方法
    public attack() {
        console.log('Zombie attacks!');
    }
}

// Skeleton.ts
// 定义骷髅类,继承自 Enemy 抽象类
export class Skeleton extends Enemy {
    // 实现攻击方法
    public attack() {
        console.log('Skeleton attacks!');
    }
}

// EnemyFactory.ts
// 定义敌人工厂类
export class EnemyFactory {
    // 创建敌人的方法,根据传入的类型创建不同的敌人实例
    public createEnemy(type: string): Enemy {
        switch (type) {
            case 'zombie':
                return new Zombie();
            case 'skeleton':
                return new Skeleton();
            default:
                throw new Error('Invalid enemy type');
        }
    }
}

使用场景

在 Cocos Creator 中,当需要根据不同的条件创建不同类型的游戏对象时,可以使用工厂模式。例如,在不同的关卡中生成不同类型的敌人。

import { EnemyFactory } from './EnemyFactory';

// 创建敌人工厂对象
const enemyFactory = new EnemyFactory();
// 创建僵尸敌人实例
const zombie = enemyFactory.createEnemy('zombie');
// 僵尸发动攻击
zombie.attack();

这些设计模式可以帮助我们更好地组织 Cocos Creator 游戏开发中的代码,提高代码的可维护性和可扩展性。根据具体的游戏需求,可以选择合适的设计模式来解决问题。有疑问的朋友也可以在评论区提问或交流。