zoukankan      html  css  js  c++  java
  • 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种操作吧:向左冲、向右冲、放屁。(小若:等等!放屁又是怎么回事?)

    放屁就是往下冲,嗯。

    假设大家还记得主角是怎么加入初始推力的话,那这三种操作就非常easy了。直接看代码吧,首先加入几个函数声明,如今的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(50000, 0));
    4. }
    5. void Player::moveToLeft()
    6. {
    7.     this->getPhysicsBody()->applyImpulse(Vect(-50000, 0));
    8. }
    9. void Player::quickMove()
    10. {
    11.     this->getPhysicsBody()->applyImpulse(Vect(0, -200000));
    12. }

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

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

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

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

  • 相关阅读:
    HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化
    HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化
    HDU1540 Tunnel Warfare —— 线段树 区间合并
    HDU3974 Assign the task —— dfs时间戳 + 线段树
    HDU4027 Can you answer these queries? —— 线段树 区间修改
    POJ3264 Balanced Lineup —— 线段树单点更新 区间最大最小值
    ZOJ1610 Count the Colors —— 线段树 区间染色
    HDU1698 Just a Hook —— 线段树 区间染色
    POJ2528 Mayor's posters —— 线段树染色 + 离散化
    POJ3468 A Simple Problem with Integers —— 线段树 区间修改
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4263780.html
Copyright © 2011-2022 走看看