​​

 

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

1. 可爱的样子

2. 不会飞

3. 会往下掉

4. 撞墙会反弹

5. 能够左右移动

6. 必杀技是:放屁

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

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

 

 

让主角出现

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

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

1. 

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


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

 

看看CPP文件:

1. 

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


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

 

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

 

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

 

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

1. 

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


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

好了,执行一下,效果如图所看到的:

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


 


 

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

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

 

左右喷射

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

 

放屁就是往下冲,嗯。

 

假设大家还记得主角是怎么加入初始推力的话,那这三种操作就非常easy了。直接看代码吧,首先加入几个函数声明,如今的Player.h文件例如以下:

1. 

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


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

 

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

 

看看三个函数的实现:

1. 

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


怎么样?非常easy吧,看到quickMove函数没?它给主角加入的推力是特别大的~

 

但是,怎么測试呢?怎么调用这些函数?没button吖…

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