【Cocos2d-x3.0学习笔记 09】游戏实例跑跑跑01

2023-11-10 12:10

本文主要是介绍【Cocos2d-x3.0学习笔记 09】游戏实例跑跑跑01,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.Tiled地图

Tiled Map Editor

官方网址:http://www.mapeditor.org

新建地图


将图片拖动到图块的地方


然后就可以绘制地图了

2.创建跑步场景

在场景中加入tiled地图

#include "TollgateScene.h"Scene* TollgateScene::createScene(){Scene* scene = Scene::create();auto layer = TollgateScene::create();scene->addChild(layer);return scene;
}bool TollgateScene::init(){if (!Layer::init()){return false;}TMXTiledMap* map = TMXTiledMap::create("level01.tmx");this->addChild(map);return true;}

运行,地图已经加载到场景中了

这边需要注意的是地图文件的图片路径经常会出错,改成相对路径即可

3.创建主角

还是习惯性的创建基类,主角类

Entity继承Node

#include "Entity.h"
void Entity::bindSprite(Sprite* sprite){mSprite = sprite;this->addChild(mSprite);
}
Player继承Entity
#include "Player.h"
bool Player::init(){return true;
}void Player::run(){}

在TollgateScene中添加addPlayer方法

//添加主角
void TollgateScene::addPlayer(TMXTiledMap* map){Size visibleSize = Director::getInstance()->getVisibleSize();Player* player = Player::create();player->bindSprite(Sprite::create("run1.png"));player->run();player->setPosition(Point(100,visibleSize.height/2));map->addChild(player);
}
运行后,主角加载到场景中

4.固定主角的出生点,对象层的使用

Tiled Map的对象层功能

图层-->添加对象层,命名为objects

选中对象层,插入矩形,更改属性,改名为playerpoint

//添加主角
void TollgateScene::addPlayer(TMXTiledMap* map){Size visibleSize = Director::getInstance()->getVisibleSize();Player* player = Player::create();player->bindSprite(Sprite::create("run1.png"));player->run();//获取对象层TMXObjectGroup* objectGroup = map->getObjectGroup("objects");//加载玩家坐标ValueMap playerPoint = objectGroup->getObject("PlayerPoint");float playerX = playerPoint.at("x").asFloat();float playerY = playerPoint.at("y").asFloat();player->setPosition(Point(playerX,playerY));map->addChild(player);
}
TmxObjectGroup对象存放了对象层的所有对象,通过getObjectGroup获取指定的对象层,于是我们就获得了对象层的所有对象,这些对象用一个Map的容器存放

ValueMap和Map类似,不过ValueMap限定了key值为string了

5.让主角跑起来,

我们可以用到上节的动画辅助类

void Player::run(){SpriteFrameCache* frameCache = SpriteFrameCache::getInstance();frameCache->addSpriteFramesWithFile("runs.plist","runs.png");Animation* action = AnimationUtil::createWithStringFrameName("run",0.1f,-1);mSprite->runAction(Animate::create(action));
}

6.添加角色控制器

采用组合的形式让主角向前跑,把向前跑作为一个功能单独写成一个类,主角只要增加一个成员变量(向前跑的类)就能实现向前跑的动作。

①先创建控制器的基类,继承Node对象

Controller:设置监听对象

#ifndef _CONTROLLER_H_
#define _CONTROLLER_H_
#include "cocos2d.h"
#include "ControllerListener.h"
USING_NS_CC;
class Controller : public Node
{
public://设置监听对象void setControllerListener(ControllerListener* listener);protected:ControllerListener* m_listener;
};
#endif#include "Controller.h"void Controller::setControllerListener(ControllerListener* listener){this->m_listener = listener;
}

②创建监听对象接口

要被控制的对象,只要继承ControllerListener接口,就可以被Controller控制

#ifndef _CONTROLLER_LISTENER_H_
#define _CONTROLLER_LISTENER_H_
#include "cocos2d.h"
class ControllerListener
{
public://两个都是虚函数,c++的虚函数就是在后面加=0,//设置目标坐标virtual void setTagPosition(int x,int y) = 0;//得到目标坐标virtual cocos2d::Point getTagPosition() = 0;
private:};
#endif

③创建简单移动控制器,继承自Controller

主要调用update来进行position的更新操作

#ifndef _SIMPLE_MOVE_CONTROLLER_H_
#define _SIMPLE_MOVE_CONTROLLER_H_
#include "Controller.h"
#include "cocos2d.h"
class SimpleMoveController : public Controller
{
public:CREATE_FUNC(SimpleMoveController);virtual bool init();virtual void update(float dt);//设置速度void setISpeed(int iSpeed);private:int m_iSpeed;
};#endif
#include "SimpleMoveController.h"
bool SimpleMoveController::init(){this->m_iSpeed = 0;//启用定时器this->scheduleUpdate();return true;
}//设置速度
void SimpleMoveController::setISpeed(int iSpeed){this->m_iSpeed = iSpeed;
}void SimpleMoveController::update(float dt){if (m_listener!=NULL){Point pos = m_listener->getTagPosition();//仅仅增加移动对象的x坐标pos.x+=m_iSpeed;m_listener->setTagPosition(pos.x,pos.y);}
}

m_listener是Controller的protected变量

④实体的基类继承ControllerListener类

实现了ControllerListener的两个方法,绑定Controller对象

#ifndef _ENTITY_H_
#define _ENTITY_H_
#include "cocos2d.h"
#include "ControllerListener.h"
#include "Controller.h"
USING_NS_CC;
class Entity : public Node,public ControllerListener
{
public:void bindSprite(Sprite* sprite);//实现SimpleMoveController的方法virtual void setTagPosition(int x,int y);virtual Point getTagPosition();//设置控制器void setController(Controller* controller);protected:Sprite* mSprite;Controller* mController;
};
#endif
#include "Entity.h"
void Entity::bindSprite(Sprite* sprite){mSprite = sprite;this->addChild(mSprite);
}
void Entity::setController(Controller* controller){//绑定Controller对象this->mController = controller;mController->setControllerListener(this);
}void Entity::setTagPosition(int x,int y){setPosition(Point(x,y));
}Point Entity::getTagPosition(){return getPosition();
}

⑤当然是创建简单移动控制器,并绑定主角

//添加主角
void TollgateScene::addPlayer(TMXTiledMap* map){Size visibleSize = Director::getInstance()->getVisibleSize();Player* player = Player::create();player->bindSprite(Sprite::create("run1.png"));player->run();//获取对象层TMXObjectGroup* objectGroup = map->getObjectGroup("objects");//加载玩家坐标ValueMap playerPoint = objectGroup->getObject("PlayerPoint");float playerX = playerPoint.at("x").asFloat();float playerY = playerPoint.at("y").asFloat();player->setPosition(Point(playerX,playerY));//创建简单的移动控制器SimpleMoveController* controller = SimpleMoveController::create();//设置速度为1controller->setISpeed(1);//添加到节点中,才能调用刷新函数this->addChild(controller);//给主角加上控制器player->setController(controller);map->addChild(player);}

运行,截图(本想qq截图的,但是看下360,就没开qq了)




这篇关于【Cocos2d-x3.0学习笔记 09】游戏实例跑跑跑01的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/382588

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;