游戏使用说明(细节超极丰富的星露谷游戏):
商店:按O打开商店,按上下左右键切换商品,按enter键出售物品(如果背包中有对应物品)商店价格随着出售物品数变化
人物UI:体力值,烹饪、挖矿经验,只有烹饪达到一定等级才可以将红色的鱼和黄色的鱼烹饪成蛋糕,初始只能烹饪蓝色的鱼,挖矿经验增加后每次挖矿矿物耐久度减少增多
烹饪:在背包中选中鱼后,按C键可烹饪成蛋糕,按P键食用蛋糕,恢复体力,蛋糕还可以在商店出售
节日:点击餐桌回满体力,点击集市向商店卖物品可以得到更多的钱
矿场:挖矿
工具栏:按1-5数字键切换工具,斧头砍树,稿子挖矿,鱼竿钓鱼,水壶浇水,锄头收获
森林: 钓鱼:摁数字键1切出鱼竿,点击离人物角色5格内水塘,等待2秒后自动钓到
砍树:摁数字键4切出斧头,点击角色附近1格内树木可砍树。大树桩使用鼠标左键随意点击任意部位5次,正常树木鼠标左键点击树桩那一格5次就可以把树砍掉
采集:瞄准需要采集物品摁鼠标右键,可采集物需在人物周围一格范围内。
切换地图:走到设计好的地图切换点自动切换。
背包功能:
按E键 打开/关闭 打开后,鼠标滑轮可以选择背包物品
小镇--送礼:
走近NPC(一共三个),自动跳出弹窗,询问是否赠送礼物。
点击N 关闭弹窗
点击Y 则打开背包,鼠标滑轮选定后,点击send,送出成功则会提示人物好感度弹窗,点击close则可关闭全部弹窗。
农场:
种植作物:按 数字键2选择工具后鼠标右键种植,数字键3选择工具后鼠标右键最后收获。
浇水:不同的植物有不同的生长周期(共有三种植物,按字母键Z(每天浇水情况下是3天) X(4天) C(4天)进行选择,默认是胡萝卜),只有浇水才能生长,一天只能长一次,如果下雨了,则不用浇水。
时间系统:
游戏世界里的一天是现实的2分钟,屏幕右上角会显示游戏的星期和具体时间。
光影:从18:00开始,屏幕会变暗,一直到晚上24:00,第二天在变亮。
天气:每天有一定的概率下雨,影响作物生长。
家: 床的交互:点击床即表示人物睡觉,系统强制进入下一天,所有作物刷新。
下面是具体的类的实现
WeatherSystem - 游戏天气管理系统
概述 WeatherSystem 类负责管理游戏中的天气系统,模拟不同天气条件的变化,并实时更新天气信息。它通过提供单例模式(getInstance)来确保全局只有一个天气系统实例,并且能够动态更新游戏中的天气显示。当前的天气包括晴天和雨天,并且每天的天气会随机生成。 功能
- 天气初始化:初始化天气系统,并设置默认的天气为晴天。
- UI更新:创建并更新显示当前天气状态的标签。
- 生成新一天的天气:每天生成新的天气,并根据随机概率设定天气状态(晴天或雨天)。
- 天气状态切换:根据生成的天气状态(如晴天或雨天),更新天气显示。 类定义 WeatherSystem WeatherSystem 类负责处理天气的初始化、更新及显示。它通过单例模式确保游戏中只有一个天气系统实例,并提供天气变化、UI更新等功能。 成员函数 • getInstance() 返回 WeatherSystem 的单例对象。确保天气系统全局只有一个实例,并在首次调用时初始化天气系统。 • static WeatherSystem* getInstance(); • init() 初始化天气系统,并设置默认的天气为晴天。调用 initWeatherUI() 来初始化天气显示的 UI 元素。 • bool init(); • initWeatherUI() 创建一个标签并将其添加到界面,用于显示当前的天气状态(晴天或雨天)。 • void initWeatherUI(); • generateNewDayWeather() 根据随机数生成一个新的天气状态,并设置当前天气为晴天或雨天(30% 概率下雨)。 • void generateNewDayWeather(); • setWeather(Weather weather) 设置当前天气状态,并更新天气标签的文字显示。 • void setWeather(Weather weather); 私有成员 • _instance:WeatherSystem 的单例实例。 • _currentWeather:当前的天气状态(晴天或雨天)。 • _weatherLabel:用于显示当前天气状态的 UI 标签。 示例用法 // 获取天气系统的单例实例 WeatherSystem* weatherSystem = WeatherSystem::getInstance();
// 生成新一天的天气 weatherSystem->generateNewDayWeather();
// 获取当前天气并更新显示 weatherSystem->setWeather(Weather::RAINY); 详细说明 • getInstance: 此方法返回天气系统的唯一实例。如果实例尚未创建,将初始化 WeatherSystem 并返回。 • init: 初始化天气系统,设置初始天气为晴天,并调用 initWeatherUI 方法来初始化显示天气的 UI 标签。 • initWeatherUI: 创建一个标签并将其添加到屏幕上,用于显示当前天气。标签的样式包括阴影和描边效果,增强视觉效果。 • generateNewDayWeather: 根据随机数生成一个新天气状态,并设置当前天气为晴天或雨天。通过概率来决定天气类型,30% 的概率为雨天,70% 为晴天。 • setWeather: 根据传入的天气类型(晴天或雨天),更新 _currentWeather 和 UI 标签的显示内容。 UI显示 • 天气显示标签的字体使用了 pixel_font.ttf 字体,并具有黑色文字、灰色阴影和白色描边效果。标签的位置固定在屏幕的右上方。 依赖 • Weather:WeatherSystem 类中的天气类型(Weather::SUNNY 和 Weather::RAINY)由 Weather 枚举表示。 • Node:WeatherSystem 类继承自 Node,因此可以将天气标签作为子节点添加到场景中。
Test - 测试场景管理 概述 Test 类是一个用于测试和调试场景功能的类,主要用于创建并初始化一个测试场景。在该场景中,玩家角色和工具栏将被加载并显示。该类继承自 BaseMapLayer,并通过加载地图和设置玩家角色以及UI元素来构建场景。它主要用于游戏开发中的测试阶段,确保地图、玩家和UI元素能够正确初始化并展示。 功能
- 场景创建与初始化:创建一个新的 Test 场景,并初始化其中的地图、玩家和UI元素。
- 加载地图:使用 loadMap 方法加载一个指定的地图文件(Test/Test.tmx)。
- 玩家初始化:根据指定的生成点(spawnPointName)初始化玩家角色。
- 工具栏加载:通过工具栏单例(Toolbar::getInstance())加载并显示一个工具栏。 类定义 Test Test 类是一个继承自 BaseMapLayer 的类,用于加载一个测试场景。它包含了创建、初始化、加载地图和UI元素等功能。通过 Test::createScene() 和 Test::create() 方法可以初始化并返回一个 Test 场景对象。 成员函数 • createScene(const std::string& spawnPointName) 创建一个新的 Scene,并初始化场景中的地图和玩家。 • Scene* Test::createScene(const std::string& spawnPointName); • create(const std::string& spawnPointName) 创建一个新的 Test 对象,并初始化相关内容,如地图和玩家角色。 • Test* Test::create(const std::string& spawnPointName); • init() 初始化基础地图层。该函数在 Test 类中被重写,调用父类 BaseMapLayer::init() 来完成基本初始化操作。 • bool Test::init(); • initMap(const std::string& spawnPointName) 加载地图并初始化玩家,同时创建和添加工具栏。通过 spawnPointName 来设置玩家初始位置。 • bool Test::initMap(const std::string& spawnPointName); 私有成员 • Test(): 构造函数,用于初始化 Test 对象。 • ~Test(): 析构函数,用于销毁 Test 对象。 示例用法 // 创建并初始化测试场景 Scene* testScene = Test::createScene("spawnPoint1");
// 在某个场景中切换到测试场景 Director::getInstance()->replaceScene(testScene); 详细说明 • createScene: 此方法返回一个新创建的场景对象,场景中会加载指定的地图,并通过 spawnPointName 初始化玩家位置。 • initMap: 这是测试场景的核心初始化方法,调用了 loadMap 方法来加载地图,同时根据传入的 spawnPointName 来设置玩家角色的初始位置。此外,还创建了一个 UI 层,并将工具栏添加到该层中。 工具栏初始化 工具栏通过 Toolbar::getInstance() 获取单例对象,并将其添加到一个新的 UI 布局中。工具栏的位置被设置在屏幕的垂直中心位置,并被添加到布局中。 依赖 • BaseMapLayer:Test 类继承自 BaseMapLayer,因此需要确保 BaseMapLayer 类实现了基本的地图层功能。 • Toolbar:工具栏是通过 Toolbar 类管理的,因此需要确保工具栏相关功能已经实现并能够正常加载. MarketPriceSystem - 游戏市场价格系统 概述 MarketPriceSystem 类负责管理游戏内物品的价格与销量,并提供动态调整价格的功能。该系统模拟了一个简单的市场经济,通过物品销量、促销活动以及价格波动等机制影响商品价格。它是一个单例类,在游戏中唯一存在,用于维护商品价格、记录销量和执行价格调整。 功能
- 获取商品价格:可以根据商品名称获取当前的市场价格。
- 促销活动:通过随机调整价格,模拟市场的促销活动,提升价格或降低价格。
- 根据销量调整价格:根据商品的销售数量动态调整价格,销量越多,价格可能下降。
- 价格波动:每隔一段时间,价格可能会在一定范围内波动,模拟市场的不稳定性。
- 记录销量:记录每种商品的销售数量,影响价格的调整。
- 初始化商品价格:系统初始化时会设置商品的初始价格,并可以在之后进行调整。 类定义 MarketPriceSystem MarketPriceSystem 类是一个单例模式类,用于管理商品的价格和销量。它提供了多个接口来获取和更新商品价格,以及记录商品销量。 成员函数 • getInstance() 返回 MarketPriceSystem 的单例实例。 • static MarketPriceSystem& getInstance(); • getPrice(const std::string& itemName) 根据商品名称返回当前商品的价格。如果商品不存在,则返回 0。 • int getPrice(const std::string& itemName) const; • applyPromotion() 随机调整所有商品的价格,在 0 到 20 的范围内波动。 • void applyPromotion(); • updatePricesBasedOnSales() 根据记录的商品销量动态调整商品价格。销量越高,价格越低。 • void updatePricesBasedOnSales(); • resetPricesWithVariation() 重置商品价格为初始值,并在此基础上加入小幅度的随机变化,模拟市场波动。 • void resetPricesWithVariation(); • recordSale(const std::string& itemName, int quantity) 记录商品的销售量。每次商品销售时,调用此方法更新销量。 • void recordSale(const std::string& itemName, int quantity); • printPrices() 打印所有商品的当前价格,通常用于调试。 • void printPrices() const; • initializePrices() 初始化所有商品的价格,并设置初始值。 • void initializePrices(); 私有成员 • prices: 使用 std::map 存储商品名称与价格的对应关系。 • sales: 使用 std::unordered_map 存储商品名称与销量的对应关系。 • srand(): 用于随机生成促销活动的价格波动,并设置随机种子。 示例用法 // 获取商品的价格 int price = MarketPriceSystem::getInstance().getPrice("flower");
// 记录商品销量 MarketPriceSystem::getInstance().recordSale("flower", 10);
// 应用促销活动,随机调整所有商品的价格 MarketPriceSystem::getInstance().applyPromotion();
// 根据销量更新商品价格 MarketPriceSystem::getInstance().updatePricesBasedOnSales();
// 打印所有商品的价格 MarketPriceSystem::getInstance().printPrices(); MarketPriceSystem 类提供了一个基本的市场系统模拟,可以根据物品的销量、促销活动和市场波动动态调整价格。通过这一系统,游戏能够更加生动地反映市场经济的变化,并增强玩家的沉浸感。 SceneManager - 游戏场景管理系统 概述 SceneManager 类负责管理游戏中的各个场景,并提供场景切换的功能。它允许游戏在多个地图(如农场、矿洞、森林等)之间自由切换,支持玩家在不同场景之间移动。该类是一个核心组件,能够有效管理游戏中的场景转换,并确保每个场景的顺利加载与切换。 功能
- 场景切换:提供场景切换功能,能够在不同的游戏地图(如农场、矿洞、森林等)之间进行跳转。
- 场景返回:支持玩家从当前地图返回到上一个地图,能够处理场景的后退操作。
- 支持多地图切换:根据不同的地图名称(如“farm”、“mine”、“forest”等)创建并切换到相应的场景。
- 自动场景加载:根据玩家当前所在的地图,自动加载对应的新地图。 类定义 SceneManager SceneManager 类是一个单例模式类,负责游戏中场景的管理与切换。它提供了以下功能: • 使用单例模式,确保全局唯一的场景管理器实例。 • 提供场景切换和返回上一场景的操作接口。 • 根据地图名称动态创建场景,并进行相应的场景切换。 成员函数 • getInstance() 返回 SceneManager 的单例对象。 • SceneManager& SceneManager::getInstance(); • goToScene(Scene newScene)* 切换到新的场景,替换当前场景。 • void SceneManager::goToScene(Scene* newScene); • returnToPreviousScene() 返回上一场景,弹出当前场景并切换回之前的场景。 • void SceneManager::returnToPreviousScene(); • switchMap(const std::string& mapName, const std::string& mapName_now, Scene _scene)* 根据地图名称切换到新的场景。支持多个地图(如“farm”、“mine”、“forest”等)的切换。 • void SceneManager::switchMap(const std::string& mapName, const std::string& mapName_now, Scene* _scene); 获取当前场景 • getCurrentSceneName() 获取当前场景的名称。 • std::string SceneManager::getCurrentSceneName(); 私有成员 • _instance: SceneManager 的单例实例。 • _currentScene: 当前场景对象,记录游戏当前所处的场景。 • _previousScenes: 用于保存场景历史记录,以支持返回上一场景的操作。 示例用法 在游戏中,你可以通过 SceneManager 来切换不同的场景,例如: // 切换到矿洞地图 SceneManager::getInstance().switchMap("mine", "farm", currentScene);
// 切换到森林地图 SceneManager::getInstance().switchMap("forest", "mine", currentScene);
// 返回上一场景 SceneManager::getInstance().returnToPreviousScene(); 总结 通过该 SceneManager 类,游戏中的场景管理变得更加高效与便捷,能够帮助玩家流畅地在不同的地图之间切换,同时支持简单的返回操作。 BaseMapLayer 地图基类 概述 BaseMapLayer 类负责游戏中的基础地图层管理,提供了地图的加载、玩家的初始化和移动、碰撞检测、视图管理等功能。它基于 Cocos2d-x 引擎构建,适用于一个具有角色和交互环境的游戏。该类实现了玩家的移动控制、地图切换、碰撞检测、物体交互等功能,并通过监听键盘和鼠标事件提供互动性。 功能
-
地图加载与管理 通过 TMXTiledMap 加载地图,支持从 TMX 文件中读取地图数据,并根据地图大小与缩放比例调整视图。
-
玩家管理 初始化并管理玩家角色,包括设置玩家初始位置、缩放比例,控制玩家的移动及动画播放。
-
碰撞检测 检测玩家在地图上移动时是否与障碍物发生碰撞,避免穿越障碍物。
-
视角控制 确保玩家始终在视窗中央,且地图视角不会超出边界。
-
事件处理 监听键盘输入以控制玩家移动,监听鼠标滚动和点击事件来执行物品操作和交互行为(如种树)。
-
地图切换 检查玩家是否与特定区域发生交互,并根据条件切换到新的地图。 class BaseMapLayer : public cocos2d::Layer { // 类构造函数 BaseMapLayer();
// 初始化地图层 bool init(); bool initMap(const std::string& tmxFile);
// 加载地图 void loadMap(const std::string& tmxFile);
// 初始化玩家 void initializePlayer(const std::string& spawnPointName);
// 设置玩家出生点 void setPlayerPosition(const std::string& objectGroupName, const std::string& spawnPointName);
// 碰撞检测 bool isCollisionAtNextPosition(const cocos2d::Vec2& nextPosition);
// 处理玩家的移动 void handlePlayerMovement(const cocos2d::Vec2& direction);
// 更新函数(每帧调用) void update(float delta);
// 键盘按键按下事件 void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);
// 键盘按键松开事件 void onKeyReleased(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);
// 设置视角中心 void setViewPointCenter(cocos2d::Point position);
// 初始化鼠标事件 void initMouseEvent();
// 鼠标滚轮事件 void onMouseScroll(cocos2d::Event* event);
// 种树操作 void plantTree(cocos2d::Vec2 position);
// 检查是否能在指定位置种树 bool canPlantTreeAtPosition(cocos2d::Vec2 position);
// 检查是否需要切换地图 void checkChangeMap(const cocos2d::Vec2& nextPosition); };
主要成员变量 • _map: 当前地图的 TMXTiledMap 实例。 • _playerInstance: 当前玩家的实例。 • _moveDirection: 玩家移动的方向向量。 • _treesVector: 存储所有种植的树。 • _mouseListener: 监听鼠标事件的对象。 • _currentDirection: 当前玩家的移动方向。 说明 • 地图管理:BaseMapLayer 负责加载和显示地图,并支持缩放和平移。通过设置 setViewPointCenter,确保玩家始终位于视窗中央。 • 玩家管理:initializePlayer 和 setPlayerPosition 方法确保玩家能够根据地图数据正确生成,并且支持玩家的缩放和动画切换。 • 碰撞检测:通过 isCollisionAtNextPosition 检测玩家是否碰到障碍物,避免玩家穿越不可通过区域。 • 地图切换:checkChangeMap 方法允许玩家进入某个特定区域后切换到另一个地图,实现不同场景的切换。 • 物品交互:通过监听键盘和鼠标事件,可以进行物品查看、种树等互动。 总结 BaseMapLayer 是游戏中的核心地图管理类,它不仅管理地图和玩家的交互,还提供了碰撞检测、视图控制、物品交互等功能。通过灵活的事件监听机制,它能够响应玩家的输入,提供丰富的游戏体验。
CropSystem 作物系统 简介 CropSystem 是一个模拟农场作物管理的系统,灵感来源于《星露谷物语》类游戏。该系统负责作物的种植、浇水、生长和收获等功能,并与游戏中的昼夜循环和天气系统相结合,提供真实的农耕体验。 功能 • 作物种植:玩家可以在农场的网格上种植胡萝卜、小树和红花等作物。 • 浇水:作物需要浇水才能生长,如果下雨,作物会自动浇水。 • 生长系统:作物会根据浇水的天数从种子状态逐步成长为成熟作物。 • 收获:成熟的作物可以被收获,玩家会获得相应的奖励。 • 每日更新:每个游戏日开始时,作物的浇水状态会被重置,并检查作物的生长状态。 • 网格系统:农场被划分为网格,作物只能在特定的位置种植。 组成部分
- Crop 类 • 作用:管理每个作物的状态、类型和生长过程。 • 主要特点: o 生长阶段:种子、成长中、成熟。 o 浇水:作物需要浇水才能生长。 o 更新精灵:根据作物的生长阶段,更新其显示的图像。 • 函数: o create():初始化一个作物对象,设置位置和类型。 o grow():根据浇水天数推进作物的生长阶段。 o updateSprite():根据生长状态更新作物的图像。 o water():为作物浇水,标记当天已浇水。
- CropSystem 类 • 作用:管理整个作物系统,包括种植、浇水、成长检查等。 • 主要特点: o 基于网格的种植系统:作物被种植在一个二维网格上。 o 种植作物:玩家可以在有效的位置种植作物。 o 浇水:作物可以手动浇水或在下雨时自动浇水。 o 生长监测:系统会定时检查作物的生长状态。 o 收获:玩家可以收获成熟的作物。 • 函数: o plantCrop():在指定位置种植作物,若位置有效则返回 true。 o removeCrop():移除指定位置的作物。 o waterCrop():为指定位置的作物浇水。 o harvestCrop():收获指定位置的成熟作物。 o checkGrowth():定期检查作物的生长状态。 o onNewDay():在新的一天开始时,重置作物的浇水状态并检查生长。
- 与 TimeManager 的集成 • 作物系统与 TimeManager 配合工作,根据游戏中的时间推进作物的生长。 • 每分钟检查一次作物的生长状态,并根据时间推进生长。
- 天气系统集成 • 系统与天气系统集成,自动在下雨天为作物浇水。
TimeManager - 游戏时间管理系统 概述 TimeManager 类负责管理游戏中的时间系统,模拟白天与黑夜的循环,以及处理与时间相关的事件(如新的一天开始、时间显示、屏幕亮度调整等)。它是一个在 cocos2d-x 上开发的类星露谷风格游戏中的核心组件,用于管理游戏内的日夜交替、玩家行为与环境反应。 功能
- 游戏时间控制:将现实世界的时间与游戏中的时间进行映射。1天游戏时间等于2分钟现实时间。
- 时间显示:实时更新显示游戏的时间和星期几。
- 天气系统交互:每到新的一天,自动通知天气系统生成新的天气。
- 屏幕亮度调节:根据时间变化调整屏幕的亮度,模拟日夜效果。
- 玩家睡觉:玩家可以选择睡觉,跳转到第二天。 类定义 TimeManager TimeManager 类继承自 Node,并实现了游戏时间的管理、UI更新和屏幕亮度调节。它包括以下功能: • 游戏时间推进:每2分钟现实时间,游戏内时间推进24小时,更新时间、日期和星期几。 • 新的一天:每个游戏日结束时,触发新的一天事件,更新游戏时间和日期。 • UI更新:显示游戏时间和当前星期几,提供清晰的视觉反馈。 成员函数 getInstance() 返回 TimeManager 的单例对象。 init() 初始化时间管理系统,包括设置初始时间、星期几和相关UI元素。 update(float dt) 每帧更新游戏时间,推进游戏内时间,并处理时间变化、星期几和亮度等状态。 adjustScreenBrightness() 根据当前游戏时间调整屏幕亮度,模拟日夜交替效果。 updateWeekdayUI() 更新星期几的显示。 playerGoToBed() 玩家进入睡眠状态,游戏时间跳转到第二天。 获取当前时间 • getCurrentWeekday(): 获取当前星期几(0 - 6, 分别代表星期一到星期日)。 • getCurrentDay(): 获取当前游戏日期。 • getCurrentHour(): 获取当前游戏小时。 • getCurrentMinutes(): 获取当前游戏分钟。 私有成员 • _instance: TimeManager 的单例实例。 • _minutesPerDay: 每天的游戏时间所对应的现实时间(单位:分钟)。 • _currentGameMinutes: 当前游戏内的分钟数。 • _currentGameHour: 当前游戏内的小时数。 • _currentGameDay: 当前游戏的日期。 • _currentWeekday: 当前星期几(0为星期一,6为星期日)。 • _timeLabel: 显示时间的UI标签。 • _weekdayLabel: 显示星期几的UI标签。 • _darkLayer: 用于模拟日夜变化的黑色遮罩层。
AudioManager 音频类 概述 AudioManager 类是一个音频管理器,用于处理游戏中的音效和背景音乐。它使用 Cocos2d-x 提供的 AudioEngine 模块来播放音频文件。该类允许播放和停止背景音乐,播放音效,以及控制音量等设置。 类定义 静态成员变量 • _instance: AudioManager* AudioManager 的单例实例指针。此变量用于实现单例模式,确保在整个应用程序中只有一个音频管理实例。 成员函数 • getInstance(): 返回 AudioManager 的单例实例。如果实例不存在,则创建一个新的实例并返回它。该函数确保 AudioManager 是全局唯一的。 • playBackgroundMusic(const std::string& filePath, bool loop = false, float volume = 1.0f): 播放指定路径的背景音乐文件。如果已有背景音乐正在播放,则先停止当前背景音乐。支持设置是否循环播放以及音量大小。 o filePath: 背景音乐文件的路径。 o loop: 是否循环播放背景音乐,默认为 false(不循环)。 o volume: 音量大小,取值范围为 0.0 到 1.0,默认为 1.0(最大音量)。 • stopBackgroundMusic(): 停止当前播放的背景音乐,并将背景音乐 ID 设置为 -1,表示没有背景音乐正在播放。 • playEffect(const std::string& filePath, float volume = 1.0f): 播放指定路径的音效文件。音效文件是一次性的播放,不支持循环播放。支持设置音量大小。 o filePath: 音效文件的路径。 o volume: 音量大小,取值范围为 0.0 到 1.0,默认为 1.0(最大音量)。 成员变量 • _backgroundMusicId: int 当前播放背景音乐的 ID,默认为 -1,表示没有播放背景音乐。通过该 ID 管理背景音乐的播放和停止。 总结 AudioManager 类封装了背景音乐和音效的播放功能,确保游戏中音频的统一管理。通过单例模式,AudioManager 提供了全局唯一的接口来操作游戏的音频资源,方便控制背景音乐和音效的播放、暂停与音量调节。
Toolbar 工具栏 概述 Toolbar 类是一个工具栏管理器,用于在游戏或应用中显示和切换不同的工具。它通过键盘事件监听来控制不同工具的切换。工具栏包含多个工具图标,可以通过数字键(1到5)进行切换,每次切换会显示不同的工具图标。工具栏默认显示在屏幕的左侧中间。 功能 • 管理多个工具(工具图标)。 • 监听键盘事件,通过按下数字键(1至5)切换不同工具。 • 控制工具的显示和隐藏。 • 提供当前选中工具的索引信息。 • 支持将工具栏固定在屏幕左侧中间。 类定义 静态成员变量 • _instance: Toolbar* Toolbar 类的单例实例指针。此变量用于确保工具栏在整个应用中只有一个实例。 成员函数 • getInstance(): 获取 Toolbar 类的单例实例。如果实例尚未创建,则创建一个新的实例,并返回该实例。确保工具栏在应用中全局唯一。 • init(): 初始化函数,设置工具栏的基础布局和图标。会创建 5 个工具图标,并通过循环将它们添加到工具栏中。初始化时,所有工具图标都被隐藏。并设置键盘事件监听器,监听用户按下数字键(1至5)时切换工具。 • onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event): 处理键盘按键事件。根据按下的键值,调用 switchTool 函数切换对应的工具。支持数字键 1 至 5。 • switchTool(int toolIndex): 根据 toolIndex 隐藏当前显示的工具图标,并显示指定索引的工具图标。索引范围为 1 到 5。 o toolIndex: 要切换的工具索引,范围从 1 到 5。 • getCurrentToolIndex(): 返回当前选中的工具的索引。 • setPositionOnLeft(): 设置工具栏的位置,使其显示在屏幕左侧中间。工具栏的锚点设置为左边中点,位置根据屏幕的大小动态调整。 成员变量 • currentToolIndex: int 当前选中工具的索引,范围为 -1(无工具选中)到 5(选中工具 1-5)。初始值为 -1。 • _tools: Vector<Sprite*> 存储所有工具的图标。使用 cocos2d::Sprite 来表示每个工具图标。工具数量固定为 5。 示例用法 // 获取工具栏单例 Toolbar* toolbar = Toolbar::getInstance();
// 初始化工具栏 toolbar->init();
// 切换到工具 1 toolbar->switchTool(1);
// 获取当前选中的工具索引 int currentTool = toolbar->getCurrentToolIndex(); CCLOG("当前工具索引:%d", currentTool);
// 将工具栏设置为左侧中间 toolbar->setPositionOnLeft(); 总结 Toolbar 类提供了一个简洁的方式来管理游戏或应用中的工具栏。它支持工具的切换,并通过数字键 1 到 5 实现工具的快速选择。工具栏的图标会在切换时显示与隐藏,通过 setPositionOnLeft 函数,可以将工具栏固定在屏幕的左侧中间。该类是通过单例模式实现的,确保工具栏在整个应用中只有一个实例,避免重复创建。
MyFarm 农场 概述 MyFarm 类是游戏中的农场场景管理器,负责创建和初始化农场场景,管理作物系统、天气系统、时间管理器以及工具栏。它通过处理键盘和鼠标事件来实现农场管理操作,如种植、收获和浇水。MyFarm 使用 Cocos2d-x 引擎,并利用单例模式和事件监听器来与其他系统和用户输入交互。 功能 • 创建和初始化农场场景。 • 添加并管理时间、天气系统。 • 管理作物系统,允许玩家通过工具栏进行农场操作(种植、收获、浇水)。 • 处理键盘和鼠标事件,实现用户交互。 • 初始化和管理工具栏,并通过键盘快捷键切换工具。 类定义 静态成员函数 • createScene(const std::string& spawnPointName): 创建并初始化农场场景。该函数会创建 MyFarm 层,添加时间管理器、天气系统、工具栏,并初始化作物系统。最终返回一个包含所有子系统的场景对象。 • create(const std::string& spawnPointName): 创建并初始化 MyFarm 实例。该函数首先调用 initMap 来加载地图、初始化作物系统和其他游戏系统。 构造函数 • MyFarm() 默认构造函数,初始化各个成员变量(如作物系统、时间管理器、天气系统等)。 成员函数 • init(): 初始化 MyFarm 实例,调用 BaseMapLayer::init() 来初始化地图层。该函数还会注册 scheduleUpdate 更新回调函数。 • initCropSystem(): 初始化作物系统。创建一个新的 CropSystem 实例并将其添加到 MyFarm 层级中,以便管理作物的种植和收获。 • initMap(const std::string& spawnPointName): 初始化地图,包括加载地图文件(Farm3.tmx),初始化玩家角色和作物系统。还会注册鼠标和键盘事件监听器,用于捕捉用户输入。 • onKeyPressed1(EventKeyboard::KeyCode keyCode, Event* event): 处理键盘按键事件。根据按下的键选择工具(数字键 1-5),或选择作物类型(Q、W、E、R 键)。通过调用作物系统的 selectCropType 来切换作物类型。 • onMouseDown1(EventMouse* event): 处理鼠标点击事件,特别是右键点击事件。根据当前选中的工具(如种植、收获、浇水工具)在点击位置执行相应的操作。 成员变量 • _cropSystem: CropSystem* 管理作物的系统,负责作物的种植、收获、浇水等操作。 • _playerInstance: Player* 玩家实例,管理玩家的状态和背包等。 子系统 • 时间管理器: TimeManager* 管理游戏中的时间流逝。它通过调度来控制游戏的时间进程,确保不同时间段可以触发不同的事件。 • 天气系统: WeatherSystem* 管理游戏中的天气变化,可以根据时间和其他因素产生不同的天气效果(如晴天、雨天等)。 • 工具栏: Toolbar* 管理游戏中的工具(如种植工具、收获工具、浇水工具)。用户通过工具栏选择不同的工具进行操作。 示例用法 // 创建并初始化农场场景 auto scene = MyFarm::createScene("SpawnPointName");
// 进入场景 Director::getInstance()->replaceScene(scene);
// 初始化作物系统 MyFarm* myFarmLayer = dynamic_cast<MyFarm*>(scene->getChildByName("MyFarmLayer")); if (myFarmLayer) { myFarmLayer->initCropSystem(); }
// 处理工具栏和作物选择 auto toolbar = Toolbar::getInstance(); toolbar->switchTool(1); // 默认选择工具 1 (种植工具) 事件处理 • 键盘事件: o 按下 1-5 键:切换工具栏中的工具。 o 按下 Z/X/C 键:选择作物类型(如胡萝卜、小树、红花等)。 • 鼠标事件: o 右键点击:根据当前选择的工具执行相应操作(如种植、收获、浇水)。 总结 MyFarm 类是一个综合的农场场景管理器,负责创建、初始化并管理整个农场游戏场景。它集成了作物系统、天气系统、时间管理器和工具栏,通过事件监听器来处理用户输入。玩家可以通过键盘和鼠标与游戏互动,进行种植、收获等农场操作。
Shop 商店 概述 Shop 类表示游戏中的商店系统,提供物品购买和出售的功能。玩家可以在商店中出售物品(如采集物、鱼类、矿石等)来赚取金钱,或者购买种子和其他物品。商店通过 TMX 地图加载并显示,支持键盘控制物品的选择和购买。商店价格基于市场需求和销售情况动态调整。 功能 • 商店显示与隐藏:通过调用 displayShop() 来切换商店的显示状态。 • 物品选择:通过键盘箭头键选择不同的商店物品,使用 ENTER 键查看选中物品的坐标,使用 SPACE 键购买或出售物品。 • 物品出售:玩家可以出售背包中的物品并获得相应的金钱,销售记录会被保存。 • 物品购买:玩家可以购买种子等物品,消耗金钱并更新背包。 • 市场动态定价:根据物品的销量,价格会发生变化。 类定义 静态成员函数 • getInstance(): 获取商店单例实例。如果实例尚未创建,则会进行初始化。 构造函数和析构函数 • Shop(): 私有构造函数,防止外部直接创建实例。 • ~Shop(): 私有析构函数,用于清理资源。 成员函数 • init(): 初始化商店,加载 TMX 地图并获取物品图层。同时初始化商店中物品的坐标,设置键盘事件监听器,以及显示玩家持有的金钱。 • displayShop(): 切换商店的显示状态。如果商店未显示,则添加到当前场景并显示;如果已经显示,则隐藏商店。 • highlightSelectedItem(): 高亮显示当前选中的物品,通过调整物品缩放来实现选中效果。 • isWithinShopArea(Vec2 itemCoord): 检查物品坐标是否在商店的有效区域内。 • onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event): 处理键盘事件,根据按键更新选中物品的坐标(上下左右箭头),以及进行物品的购买或出售(ENTER 和 SPACE 键)。 • displayPlayerMoney(): 显示玩家当前持有的金钱,使用文本标签显示在商店的左上角。 • updatePlayerMoneyDisplay(int newMoney): 更新显示的玩家金钱数。 • logSelectedItemCoord(): 打印当前选中的物品坐标,并处理物品的出售。根据选中的物品类型,检查玩家背包并进行出售,增加玩家的金钱。 • setVisible(bool visible): 控制商店的可见性,并根据商店的显示状态动态启用或禁用键盘事件监听器。 • buySelectedItemCoord(): 处理物品的购买操作。根据选中的物品坐标,检查是否有足够的金钱,并将物品添加到玩家背包中。 成员变量 • _instance: Shop* 商店的单例实例。 • _tileMap: TMXTiledMap* 商店的 TMX 地图对象,包含商店的地图数据。 • _itemsLayer: TMXLayer* 商店中的物品图层,包含所有可以出售和购买的物品。 • _selectedItemCoord: Vec2 当前选中的物品坐标。 • _moneyLabel: Label* 显示玩家金钱的文本标签。 事件处理 • 键盘事件: o 方向键 (UP, DOWN, LEFT, RIGHT):用来在商店中移动选择框,改变选中的物品。 o ENTER:查看当前选中的物品坐标并打印信息。 o SPACE:购买或出售当前选中的物品。 • 鼠标事件: 本类目前不处理鼠标事件,所有交互都是通过键盘完成。 物品操作 • 出售物品: 玩家可以在商店中出售自己的物品(如 flower, wood, fish1 等)。出售时,物品会从玩家的背包中移除,玩家将根据市场价格获得相应的金钱。 • 购买物品: 玩家可以购买商店中的种子等物品(如 seed1, seed2)。购买时,金钱会被扣除,相应物品会被添加到玩家的背包。 • 市场价格: 商店的物品价格会根据销量动态调整。当玩家出售物品时,价格会被更新,以反映市场需求。 示例用法 // 获取商店实例并显示商店 Shop* shop = Shop::getInstance(); shop->displayShop();
// 处理玩家出售物品 shop->logSelectedItemCoord(); // 打印当前选中的物品坐标 shop->buySelectedItemCoord(); // 执行物品购买或出售操作
// 更新玩家金钱显示 shop->updatePlayerMoneyDisplay(newMoney); 总结 Shop 类提供了一个完整的商店系统,玩家可以在其中出售物品赚取金钱,或者购买种子等物品。商店界面通过 TMX 地图加载,玩家可以通过键盘事件在商店中进行交互。商店的物品价格是动态变化的,基于市场需求和物品销量进行调整。
UI 类说明文档 概述 UI 类用于管理游戏中的用户界面(UI)。该类负责显示和更新玩家的各种状态信息(如健康、体力、中特、钓鱼进度、挖矿进度等)。这些信息会以标签的形式显示在屏幕顶部,并且在游戏中随着玩家状态的变化实时更新。UI 类是一个单例类,确保在整个游戏中只有一个 UI 实例。 功能 • UI 显示与隐藏:通过调用 showUI() 方法切换 UI 的显示状态。 • UI 更新:通过调用 updateUI() 方法实时更新显示的玩家状态信息。 • 单例模式:UI 类采用单例模式,确保只有一个 UI 实例在整个游戏中存在。 类定义 静态成员函数 • getInstance(): 获取 UI 类的单例实例。如果实例尚未创建,则会进行初始化。 构造函数与析构函数 • UI(): 构造函数,初始化 UI 元素(如健康、体力等标签),并将其添加到场景中。UI 标签会显示在屏幕的上方,并且随着玩家的状态变化实时更新。 成员函数 • updateUI(): 更新 UI 中显示的玩家状态信息,包括玩家的健康、体力、中特、钓鱼进度、挖矿进度等。这些信息会从 Player 类实例中获取,并更新相应的标签显示。 • showUI(): 控制 UI 的显示和隐藏。若 UI 尚未添加到场景中,则将其添加到当前场景;否则,根据当前 UI 的显示状态切换其可见性。 成员变量 • _instance: UI* UI 类的单例实例。 • _healthLabel: Label* 显示玩家健康的标签。 • _staminaLabel: Label* 显示玩家体力的标签。 • _zhongdiLabel: Label* 显示玩家中的土地数量的标签。 • _diaoyuLabel: Label* 显示玩家的钓鱼进度的标签。 • _wakuangLabel: Label* 显示玩家的挖矿进度的标签。 示例用法 // 获取 UI 实例并显示 UI UI* ui = UI::getInstance(); ui->showUI();
// 更新 UI ui->updateUI(); 事件处理 • UI 切换: o showUI() 方法会检查 UI 当前的可见性,若 UI 不可见,则显示 UI;若 UI 已可见,则切换其可见性。 • UI 更新: o updateUI() 方法会从 Player 类获取玩家的当前状态并更新 UI 标签显示。 UI 布局 • 标签位置: UI 元素(标签)会显示在屏幕的上方,具体位置通过 setPosition() 方法设置。所有标签的初始位置均基于屏幕尺寸进行居中,并略微上移。 o _healthLabel:显示健康信息,位于屏幕顶部。 o _staminaLabel:显示体力信息,位于健康标签下方。 o _zhongdiLabel:显示中地信息,位于体力标签下方。 o _diaoyuLabel:显示钓鱼进度,位于中地标签下方。 o _wakuangLabel:显示挖矿进度,位于钓鱼标签下方。 总结 UI 类提供了一个简单的用户界面,显示玩家的多项状态信息。通过使用单例模式,确保了游戏中的 UI 只有一个实例,并且通过 showUI() 和 updateUI() 方法,玩家状态信息可以随时更新并实时显示。此 UI 类适用于实时显示与更新玩家的健康、体力等状态的场景。
Festival 类说明文档 概述 Festival 类是游戏中的一个场景类,继承自 BaseMapLayer,负责处理节日活动的地图加载、玩家初始化和鼠标事件交互等功能。该类为一个自定义的游戏层,允许玩家与地图中的不同元素进行互动(如食物、商店等),并且通过鼠标点击来触发相应的事件。 功能 • 创建场景:提供一个静态方法来创建场景,并确保相关的管理器(如 TimeManager)被正确初始化。 • 地图加载:加载并显示节日活动的地图,处理地图层次的显示和初始化。 • 玩家初始化:根据指定的出生点名称初始化玩家的位置。 • 鼠标事件:监听鼠标点击事件,允许玩家与地图中的特定区域(如食物或商店)进行交互。 • 瓦片属性交互:根据点击位置的瓦片属性(如是否为食物或商店)触发不同的逻辑,例如恢复玩家健康或应用商店促销。 类定义 构造函数与析构函数 • Festival(): 构造函数,初始化 Festival 实例,未进行具体初始化。 • ~Festival(): 析构函数,销毁 Festival 实例,释放资源。 静态成员函数 • createScene(const std::string& spawnPointName): 创建一个新的 Scene,并初始化 Festival 层。调用此函数会确保 TimeManager 只被初始化一次,并且其父节点设置正确。 • create(const std::string& spawnPointName): 创建 Festival 层并初始化。如果初始化成功,返回 Festival 实例,否则返回 nullptr。 成员函数 • init(): 初始化 Festival 层,确保其继承自 BaseMapLayer 并成功初始化。 • initMap(const std::string& spawnPointName): 初始化地图并加载 Festival.tmx 地图文件。此函数会加载地图、初始化玩家并设置鼠标事件。 • initMouseEvent(): 设置和管理鼠标事件监听器。创建新的 EventListenerMouse,并处理鼠标按下事件(如检测是否点击到食物或商店)。此函数会处理瓦片的 GID 和属性检查,并触发相应的游戏逻辑。 • getTileCoordForPosition(cocos2d::Vec2 position): 将屏幕坐标转换为地图上的瓦片坐标。计算公式基于瓦片的尺寸(假设每个瓦片宽度为 17.83),并返回相应的 Vec2 坐标。 成员变量 • festivalMap: TMXTiledMap* 保存当前加载的节日活动地图 (Festival.tmx)。 • _mouseListener: EventListenerMouse* 用于监听和处理鼠标事件的监听器。 • _map: TMXTiledMap* 当前地图对象,用于访问地图的各个层和瓦片。 • mineralsLayer: TMXLayer* 获取并操作矿物图层(暂时未使用)。 事件处理 • 鼠标按下事件:当鼠标点击时,首先将鼠标位置转换为世界坐标,然后根据位置计算瓦片坐标。接着,通过瓦片的 GID 获取其属性,如食物或商店。如果点击的是食物,会恢复玩家健康;如果点击的是商店,会应用商店的促销。 o 食物属性:当瓦片具有 food 属性且为 true 时,恢复玩家健康值。 o 商店属性:当瓦片具有 shop 属性且为 true 时,应用商店促销(仅在第一次点击时应用)。 地图与瓦片交互 • Festival.tmx: 使用 TMXTiledMap 加载的节日活动地图。 • 瓦片坐标计算:通过 getTileCoordForPosition() 方法,根据鼠标点击位置计算出瓦片坐标(通过瓦片大小进行转换)。 依赖组件 • BaseMapLayer: Festival 类继承自 BaseMapLayer,因此必须依赖 BaseMapLayer 的初始化和功能。 • TimeManager: 管理游戏时间的模块,确保 TimeManager 在场景加载时正确初始化和添加到场景。 • Player: 代表玩家角色,处理健康值等属性的修改。 • MarketPriceSystem: 用于商店促销系统,应用商店的价格变动。 示例用法 // 创建一个 Festival 场景并设置出生点 Scene* festivalScene = Festival::createScene("spawn_point_name");
// 获取 Festival 实例并初始化地图 Festival* festivalLayer = Festival::create("spawn_point_name");
// 在游戏主场景中加入 Festival 层 Director::getInstance()->getRunningScene()->addChild(festivalLayer); 总结 Festival 类负责加载节日活动地图、初始化玩家、处理鼠标点击事件以及根据地图瓦片的属性执行不同的游戏逻辑。通过鼠标事件,玩家可以与地图中的食物或商店进行交互,恢复健康值或触发商店促销。
Forest 类说明文档 概述 Forest 类是游戏中的一个场景类,继承自 BaseMapLayer,用于处理森林场景的加载和交互。玩家可以在森林中进行钓鱼、砍树、采集等活动。该类还处理鼠标点击事件,并根据玩家的选择执行相应的操作(如钓鱼、砍树、采集物品)。 功能 • 创建场景:提供静态方法创建森林场景,并确保 TimeManager 和 Toolbar 被正确初始化和添加到场景中。 • 地图加载:加载森林场景地图,并调整其缩放和位置。 • 玩家初始化:根据指定的出生点名称初始化玩家。 • 鼠标事件监听:监听鼠标点击事件,支持左键和右键点击,分别对应不同的操作(钓鱼、砍树、采集)。 • 钓鱼、砍树、采集:根据鼠标点击的位置,执行钓鱼、砍树或采集物品的操作。 • 音效播放:在执行特定操作时(如钓鱼、砍树),播放对应的音效。 类定义 构造函数与析构函数 • Forest(): 构造函数,初始化 Forest 类的实例,暂时未进行具体初始化。 • ~Forest(): 析构函数,销毁 Forest 类的实例,释放资源。 静态成员函数 • createScene(const std::string& spawnPointName): 创建一个新的 Scene,并初始化 Forest 层。确保 TimeManager 只初始化一次,并且正确设置其父节点。此外,创建并添加工具栏层(Toolbar)到场景中。 • create(const std::string& spawnPointName): 创建 Forest 层并初始化。如果初始化成功,返回 Forest 实例,否则返回 nullptr。 成员函数 • init(): 初始化 Forest 层,确保其继承自 BaseMapLayer 并成功初始化。 • initMap(const std::string& spawnPointName): 初始化地图并加载 Forest.tmx 地图文件,设置地图缩放和位置,并初始化玩家。地图中包括多个层(如 fishing、cutting),并设置其可见度。 • initMouseEvent(): 设置并管理鼠标事件监听器。根据鼠标点击的类型(左键或右键),分别调用钓鱼、砍树或采集功能。 • getTileCoordForPosition(cocos2d::Vec2 position): 将屏幕坐标转换为地图上的瓦片坐标。计算公式基于瓦片的尺寸(假设每个瓦片宽度为 17.83),并返回相应的 Vec2 坐标。 • Fishing(cocos2d::Vec2 position): 处理钓鱼操作。检查玩家是否靠近钓鱼区域,并播放钓鱼动画。如果钓到鱼,会将鱼添加到玩家的背包中。 • deleteWholeObject(cocos2d::Vec2 position, cocos2d::TMXLayer* layer): 递归删除指定位置的瓦片及其相邻的瓦片。用于砍树或收集物品时删除物品。 • collect(cocos2d::Vec2 position): 处理采集物品的操作。根据鼠标点击的位置判断玩家是否靠近采集物,并将相应的物品添加到玩家背包中。 • cutTree(cocos2d::Vec2 position): 处理砍树操作。判断玩家是否靠近树,并通过播放砍树动画以及延迟处理树木的删除,最终将木材添加到玩家的背包中。 成员变量 • _map: TMXTiledMap* 保存当前加载的森林场景地图 (Forest.tmx)。 • _mouseListener: EventListenerMouse* 用于监听和处理鼠标事件的监听器。 • _playerInstance: Player* 当前玩家实例,用于获取玩家的状态和位置,并执行相关操作(如添加物品到背包)。 事件处理 • 鼠标按下事件:当鼠标点击时,首先将鼠标位置转换为世界坐标,然后计算对应的瓦片坐标。如果玩家使用左键,会根据当前工具(如钓鱼或砍树)执行相应操作;如果使用右键,则进行物品采集操作。 o 钓鱼操作:当点击的区域属于钓鱼区域时,播放钓鱼动画并延迟两秒后将鱼添加到玩家背包。 o 砍树操作:玩家需要靠近树木才能砍伐。每次点击后,会播放砍树动画,并且在连续点击一定次数后,树木被砍伐并奖励木材。 o 采集操作:玩家靠近可收集的物品(如浆果、植物、花朵)时,右键点击会将相应物品添加到背包。 音效管理 • AudioManager:使用 AudioManager 播放与操作相关的音效,例如钓鱼 (fish.mp3)、砍树 (wood.mp3) 和采集 (shouji.mp3)。 地图与瓦片交互 • Forest.tmx:使用 TMXTiledMap 加载的森林场景地图。地图包括多个层,例如 fishing(钓鱼区)、cutting(砍树区)、collecting1、collecting2、collecting3(采集物品区)。 • 瓦片坐标计算:通过 getTileCoordForPosition() 方法,将鼠标点击位置转换为瓦片坐标。 依赖组件 • BaseMapLayer: Forest 类继承自 BaseMapLayer,因此必须依赖 BaseMapLayer 的初始化和功能。 • TimeManager: 管理游戏时间的模块,确保 TimeManager 在场景加载时正确初始化和添加到场景。 • Toolbar: 工具栏,用于选择玩家当前的工具(如钓鱼、砍树等)。 • AudioManager: 管理和播放音效的系统。 示例用法 // 创建一个 Forest 场景并设置出生点 Scene* forestScene = Forest::createScene("spawn_point_name");
// 获取 Forest 实例并初始化地图 Forest* forestLayer = Forest::create("spawn_point_name");
// 在游戏主场景中加入 Forest 层 Director::getInstance()->getRunningScene()->addChild(forestLayer);