Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角

2023-11-11 15:50

本文主要是介绍Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

好了,前面说了那么多废话,终于要进入正题了(等等,敢情前面你都是在耍我们么?)

 

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址: http://www.benmutou.com/blog/archives/872

文章来源:笨木头与游戏开发

 

添加主角实在是太简单了,这个主角要拥有以下一些超能力:

1. 可爱的样子

2. 不会飞

3. 会往下掉

4. 撞墙会反弹

5. 可以左右移动

6. 必杀技是:放屁

(小若:不知道是不是幻觉,总感觉这些能力是个人就能拥有)

(木头:哦呵呵,旁白,别傻了,就第一条你就无法拥有)

 

本篇教程要用到的图片只有这张:

player.pngplayer.png

 

让主角出现

上面说了这么多超能力,感觉很复杂,我们还是从简单做起吧,让主角先出现在场景里。

创建一个Player类,头文件如下:

 
  1. #ifndef Player_H
  2. #define Player_H
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class Player : public Node
  6. {
  7. public:
  8.     Player();
  9.     ~Player();
  10.     CREATE_FUNC(Player);
  11.     virtual bool init();
  12.     void logic(float dt);
  13. private:
  14.     CC_SYNTHESIZE(int, m_iHP, iHP);
  15. };
  16. #endif

OK,很明显,主角也有一个logic函数,先留空什么都不做,然后主角还有一个HP属性,也先留着。

 

看看CPP文件:

 
  1. #include "Player.h"
  2. Player::Player()
  3. {
  4.     m_iHP = 100;
  5. }
  6. Player::~Player()
  7. {
  8. }
  9. bool Player::init()
  10. {
  11.     auto playerSp = Sprite::create("player.png");
  12.     this->addChild(playerSp);
  13.     auto body = PhysicsBody::createCircle(playerSp->getContentSize().width * 0.4f);
  14.     body->getShape(0)->setFriction(0);
  15.     body->getShape(0)->setRestitution(1.0f);
  16.     body->setCategoryBitmask(1);    // 0001
  17.     body->setCollisionBitmask(1);   // 0001
  18.     body->setContactTestBitmask(1); // 0001
  19.     this->setPhysicsBody(body);
  20.     /* 给角色添加推力 */
  21.     this->getPhysicsBody()->applyImpulse(Vect(0-40000));
  22.     return true;
  23. }
  24. void Player::logic(float dt)
  25. {
  26. }

前面已经介绍过怎么创建物理对象了,大家应该不会生疏了,用createCircle创建圆形刚体,为什么是圆形不是正方形呢?因为主角的图片不太正方,用圆形在碰撞的时候会好一些。

 

然后通过getShape(0)获取刚体的皮肤,setFriction设置摩擦力,setRestitution设置弹力。

 

最后,给刚体一个初始的向下推力(applyImpulse),这样主角就会往下掉,是的,这个游戏的主角就是一直往下掉,然后碰到东西弹来弹去~

 

OK,测试一下吧,在TollgateScene的init函数里添加Player对象:

 
  1. bool TollgateScene::init()
  2. {
  3.     if (!Layer::init())
  4.     {
  5.         return false;
  6.     }
  7.     /* 创建主角 */
  8.     Size visibleSize = Director::getInstance()->getVisibleSize();
  9.     m_player = Player::create();
  10.     m_player->setPosition(Point(visibleSize.width * 0.5f, visibleSize.height * 0.85f));
  11.     this->addChild(m_player, 5);
  12.     this->schedule(schedule_selector(TollgateScene::logic));
  13.     return true;
  14. }

主角的初始位置是屏幕中间上方。

好了,运行一下,效果如图所示:

Cocos2d-x3.0游戏实例之《别救我》第四篇-截图

 

你应该会看到主角一开始往下掉,然后碰到下面的锯齿就反弹~

证明我们的物理世界已经在起作用了~

 

左右喷射

好了,现在主角只会往下掉,那还玩什么呢?我们给主角赋予3种操作吧:向左冲、向右冲、放屁。(小若:等等!放屁又是怎么回事?)

 

放屁就是往下冲,嗯。

 

如果大家还记得主角是怎么添加初始推力的话,那这三种操作就很简单了。直接看代码吧,首先添加几个函数声明,现在的Player.h文件如下:

 
  1. #ifndef Player_H
  2. #define Player_H
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class Player : public Node
  6. {
  7. public:
  8.     Player();
  9.     ~Player();
  10.     CREATE_FUNC(Player);
  11.     virtual bool init();
  12.     void moveToRight();
  13.     void moveToLeft();
  14.     void quickMove();
  15.     void logic(float dt);
  16. private:
  17.     CC_SYNTHESIZE(int, m_iHP, iHP);
  18. };
  19. #endif

为什么放屁的函数名要叫做quickMove呢?那是因为放屁是大招,冲得特别快,所以我选择了这个特别的名字。(小若:别鬼扯了,不就是不知道放屁的英文怎么写嘛)

 

O_O那个,我们别里旁白,继续….

 

看看三个函数的实现:

 
  1. void Player::moveToRight()
  2. {
  3.     this->getPhysicsBody()->applyImpulse(Vect(500000));
  4. }
  5. void Player::moveToLeft()
  6. {
  7.     this->getPhysicsBody()->applyImpulse(Vect(-500000));
  8. }
  9. void Player::quickMove()
  10. {
  11.     this->getPhysicsBody()->applyImpulse(Vect(0-200000));
  12. }

怎么样?很简单吧,看到quickMove函数没?它给主角添加的推力是特别大的~

 

可是,怎么测试呢?怎么调用这些函数?没按钮吖…

对,没按钮,于是,我们又要做一下思维跳跃了…

 

下一篇,简单介绍一下Cocostudio的UI编辑器,我们用它来编写几个按钮。

 

 

 

这篇关于Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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 棋盘类

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |