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。

  • 相关阅读:
    Windows 创建 Redis 和 zookeeper 系统服务
    mysql 5.7 非正常安装,无法启动 服务没有报告任何错误
    将整个 project 资源打包
    使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
    所有子模块都要执行的checkstyle检查
    把项目通过maven生产源码包和文档包并发布到自己的私服上
    C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程
    C#.NET常见问题(FAQ)-无法直接启动带有类库输出类型的项目怎么办
    C#.NET常见问题(FAQ)-VS如何整个项目中查找字符串
    C#.NET常见问题(FAQ)-如何在系统变量中加入新的环境变量
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4263780.html
Copyright © 2011-2022 走看看