转载请注明,原文地址: http://www.benmutou.com/archives/872
文章来源:笨木头与游戏开发
 

 

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

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

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

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

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

1. 可爱的样子

2. 不会飞

3. 会往下掉

4. 撞墙会反弹

5. 可以左右移动

6. 必杀技是:放屁

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

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

 
本篇教程要用到的图片到这里下载:http://download.csdn.net/detail/musicvs/7392931
 

让主角出现

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

创建一个Player类,头文件如下:
[cce_cpp]
#ifndef Player_H
#define Player_H
#include "cocos2d.h"
USING_NS_CC;
class Player : public Node
{
public:
    Player();
    ~Player();
    CREATE_FUNC(Player);
    virtual bool init();

  void logic(float dt); private:   CC_SYNTHESIZE(int, m_iHP, iHP); }; #endif [/cce_cpp]

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

 

看看CPP文件:
[cce_cpp]
#include "Player.h"

Player::Player() {   m_iHP = 100; }

Player::~Player() { }

bool Player::init() {   auto playerSp = Sprite::create("player.png");   this->addChild(playerSp);

  auto body = PhysicsBody::createCircle(playerSp->getContentSize().width * 0.4f);   body->getShape(0)->setFriction(0);   body->getShape(0)->setRestitution(1.0f);   body->setCategoryBitmask(1); // 0001   body->setCollisionBitmask(1); // 0001   body->setContactTestBitmask(1); // 0001   this->setPhysicsBody(body);

  /* 给角色添加推力 */   this->getPhysicsBody()->applyImpulse(Vect(0, -40000));

  return true; }

void Player::logic(float dt) { } [/cce_cpp]

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

 

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

 

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

 

OK,测试一下吧,在TollgateScene的init函数里添加Player对象:
[cce_cpp]
bool TollgateScene::init()
{
    if (!Layer::init())
    {
        return false;
    }
    /* 创建主角 */
    Size visibleSize = Director::getInstance()->getVisibleSize();

  m_player = Player::create();   m_player->setPosition(Point(visibleSize.width * 0.5f, visibleSize.height * 0.85f));   this->addChild(m_player, 5);

  this->schedule(schedule_selector(TollgateScene::logic));   return true; } [/cce_cpp]

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

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

[caption id="attachment_886" align="aligncenter" width="221"]Cocos2d-x3.0游戏实例之《别救我》第四篇-截图 Cocos2d-x3.0游戏实例之《别救我》第四篇-截图[/caption]

 

 

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

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

 

左右喷射

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

 

放屁就是往下冲,嗯。

 

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

#include "cocos2d.h" USING_NS_CC;

class Player : public Node { public:   Player();   ~Player();   CREATE_FUNC(Player);   virtual bool init();

  void moveToRight();   void moveToLeft();   void quickMove();

  void logic(float dt); private:   CC_SYNTHESIZE(int, m_iHP, iHP); };

#endif [/cce_cpp]

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

 

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

 

看看三个函数的实现:
[cce_cpp]
void Player::moveToRight()
{
    this->getPhysicsBody()->applyImpulse(Vect(50000, 0));
}

void Player::moveToLeft() {   this->getPhysicsBody()->applyImpulse(Vect(-50000, 0)); }

void Player::quickMove() {   this->getPhysicsBody()->applyImpulse(Vect(0, -200000)); } [/cce_cpp]

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

 

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

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

 

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

 
26 条评论
  • 水水水水 2016-09-23 14:09:47

    你好,木头老师,第三章那个锯齿setRotation方法怎么不能旋转?
    0回复
  • Vanessa Smith 2015-03-08 05:05:09

    I liked your blog very much.

    I want to thank you for the contribution.
    0回复
  • dddrj 2014-12-03 21:20:57

    我想用这个做个平台刚体该怎么弄... 设置了不受重力 摩擦什么都为0 最后还有个作用力 求教下怎么解决
    0回复
    • 博主 糟糕_树叶的mut 2014-12-04 08:02:23

      要球体和墙面都设置才行,你是不是只设置了一个?
      0回复
  • 十八 2014-08-18 14:30:45

    下载的图片资源里面是不是少了player的 = =。
    0回复
    • 博主 糟糕_树叶的mut 2014-08-18 15:52:38

      嗯嗯,不过就是一张图片,可以随便用一张图片替代
      0回复
  • 刘盛世 2014-06-26 10:46:42

    木头蜀黍,为什么下的资源里面第四篇的是空文件夹。。。。
    0回复
  • lualua 2014-05-22 18:30:47

    按照上面的教程,我用lua重写了一遍,结果向下推力(applyImpulse)这个不起效,求教!
    0回复
    • 博主 糟糕_树叶的mut 2014-05-22 20:08:41

      我没试过。。你可以看看lua的demo,物理引擎部分,看看是不是这个方法有替代的~
      0回复
  • yxlovemoney 2014-05-15 07:39:00

    能简单解释一下CC_SYNTHESIZE么?网上给的答案看不十分明白
    0回复
    • yxlovemoney 2014-05-15 07:40:47

      难道是类似C#里面的GET,SET方法么?
      0回复
    • 博主 糟糕_树叶的mut 2014-05-15 09:24:49

      这是C++的宏,你可以看看这方面的资料~
      0回复
      • 11电信张强 2014-09-06 17:46:27

        CC_SYNTHESIZE 是C++的宏吗 怎么用?
        0回复
        • 博主 糟糕_树叶的mut 2014-09-07 08:46:05

          你这个问题,涉及到两个:1.语法上是宏,宏你肯定认识喇,就不多说了,如果不认识,相信百度很多2.具体这个宏的作用,可以进入它的源码去看看,其实就是几句代码,偷懒用的
          0回复
  • 沉默的小刀 2014-05-04 14:07:15

    木头,想请问下,如果主角初始在屏幕中间,然后在物理世界中做不规则速度运动(x轴方向),然后怎样使背景跟着主角滚动,确保主角一直在屏幕中间呢(不考虑y轴方向)。
    0回复
    • 博主 糟糕_树叶的mut 2014-05-04 15:40:28

      我想到的最简单的就是,每一帧根据主角的x坐标来修正地图坐标(主角是不动的,地图在动),《跑跑跑》就类似这种情况~听群里有人讨论过Cocos2d-x的Camera的功能,但是我没有试过,所以不太清楚~你可以了解一下,可能用它会方便一些~
      0回复
      • 沉默的小刀 2014-05-04 17:10:52

        3.0 camera已经被x了,我现在使用Follow来实现的,不过总感觉用的不舒服。。。没有掌控感
        0回复
        • 博主 笨木头 2014-05-04 19:12:52

          被删了?应该被改了吧?怎么会删掉这样的功能呢?
          那,你现在是什么问题?
          0回复
        • 博主 糟糕_树叶的mut 2014-05-04 19:14:50

          被删了?应该被改了吧?怎么会删掉这样的功能呢?那,你现在是什么问题?
          0回复
          • 沉默的小刀 2014-05-05 10:34:13

            2dx不推荐使用camera所以现在给删了,我现在就是会出现卡顿现象,我试试修正地图方法看看
            0回复
            • 博主 糟糕_树叶的mut 2014-05-05 11:24:42

              原来如此~那你试试
              0回复
              • 沉默的小刀 2014-05-05 15:09:29

                物理世界,修正地图没有用,我是把整个世界的坐标修正了,才出现滚动效果,但是人物却在非常缓慢的后退,难道是因为坐标计算的时候存在的误差导致的?
                0回复
              • 沉默的小刀 2014-05-05 15:18:54

                解决了,突然发现自己秀逗了
                0回复
                • 博主 糟糕_树叶的mut 2014-05-05 16:12:29

  • star特530 2014-05-03 12:20:10

    表情顶
    0回复
  • Cocos2d-x3.0游戏实例《别救我》目录 | 笨木头与游戏开发 2014-05-02 22:12:45

    […] Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角 […]
    0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发