【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

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清