• 一般在游戏中我们避免不了处理旋转或者子弹发射什么的,就比如塔防游戏来说吧,我们需要判断敌人哪里走,炮塔就哪里转,转完然后朝着一个方向发射子弹(是一个方向而不是朝一个点,就比如保卫萝卜,子弹穿过怪物...

    你犯困吗,恩,给你讲个笑话提提神~


    一對情侶去從林遊玩,被食人族捉住。食人族首領心情很好,說你們如果想活命,就吃掉對方的大便。在他們回來的路上,女人終於忍不住停下,坐到石頭上哭起來。男人摟住她的肩膀。女人別過臉去,幽幽的說:你不愛我,要不然剛才你不會拉這麼多。


    (能呵呵吗?)


    ================================================================================


    一般在游戏中我们避免不了处理旋转或者子弹发射什么的,就比如塔防游戏来说吧,我们需要判断敌人往哪里走,炮塔就往哪里转,转完然后朝着一个方向发射子弹是一个方向而不是朝一个点,就比如保卫萝卜,子弹穿过怪物继续朝那个方向飞行,直到飞往屏幕外才移除),下面来简单分析一下实现的过程,需要涉及到一点点平面向量的数学知识。

    (注意匀速)

    1. 旋转 : 朝着某个点的方向匀速旋转

    2.发射:让子弹朝着某个点的方向匀速移动


    我们来分步骤实现,先实现旋转功能:


    嗯,现在假设平面中有点A和点B,A是炮塔,B是敌人,现在我们需要让炮塔A的方向朝着敌人B旋转,因为炮塔放置的时候方向向上,所以我们要旋转的角度为α,如图


    现在首先,我们创建敌人和塔

    //敌人
    auto enemy = Sprite::create("enemy.png");
    enemy->setPostion(Point(100,200));
    this->addChild(enemy);
    
    //塔
    auto tower = Sprite::create("tower.png");
    tower->setPostion(Point(200,100));
    this->addChild(tower);
    

    然后我们让塔旋转瞄准敌人,只是为了能射它一脸(呵呵?)

    //让塔的方向旋转对准敌人
    
    //射击方向向量
    Point shootVector = enemy->getPosition() - tower->getPosition();
    //向量标准化(即向量长度为1)
    Point normalizedVector = ccpNormalize(shootVector) ;
    //算出旋转的弧度
    float radians = atan2(normalizedVector.y, - normalizedVector.x);
    //将弧度转换成角度
    float degree = CC_RADIANS_TO_DEGREES(radians);
    
    
    //匀速旋转需要我们设置一下速度,这里假设旋转速度为 2π (rad/s)
    float rotateSpeed = 2 * M_PI;
    //那么旋转1弧度所用时间为
    float rotate_1rad_time = 1 / rotateSpeed;
    //所以旋转的时长为
    float rotateDuration = fabs(radians * rotate_1rad_time);
    
    
    //最后执行旋转
    _sprite->runAction(RotateTo::create(rotateDuration,degree- 90));

    需要注意一下

    (1)假设点A为塔,B为敌。则 向量  shootVector = OB -OA = AB  

    (2)atan2(y,x)是就是反正切函数, 算出的是  点(x,y)与x轴正方向的夹角,返回的是角的弧度值

    (3)所以degree算出的角度其实是与x轴正方向的夹角

    (4)由于炮塔方向向上,所以  【旋转的角度  α 】= degree - 90


    如果你想不起来什么是反正切,那没关系,看下面假设和图(再想不起来我只能呵呵了)

    假设 tan(α) = y / x , 则有 α = arctan(y / x)


    旋转完后接下来我们再实现射击功能:


    假设有塔,子弹和敌人,位置如图,我们需要把子弹由位置A沿着AB方向 匀速射到C(C点在屏幕外)



    我们先创建敌人,塔和子弹


    //敌人
    auto enemy = Sprite::create("enemy.png");
    enemy->setPostion(Point(100,200));
    this->addChild(enemy);
    
    //塔
    auto tower = Sprite::create("tower.png");
    tower->setPostion(Point(200,100));
    this->addChild(tower);
    
    //子弹,和塔在一个位置
    auto tower = Sprite::create("bullet.png");
    tower->setPostion(Point(200,100));
    this->addChild(tower);

    然后这次我们真的射它一脸(再次呵呵)


    //射击方向向量
    Point shootVector = enemy->getPosition() - bullet->getPosition();
    //向量标准化(即向量长度为1)
    Point normalizedVector = ccpNormalize(shootVector);
    //移动长度向量
    Point overShootVector = normalizedVector * 900;
    //超出屏幕的点
    Point offScreenPoint = bullet->getPosition() + overShootVector;
    
    //假设速度为500(pix/s)
    float moveSpeed = 500;
    //移动时间
    float moveDuration = overShootVector / moveSpeed;
    
    //执行设计
    auto move = MoveTo::create(moveDuration,offScreenPoint);
    CallFunc* moveDone = CallFunc::create(CC_CALLBACK_0(shootFinish,this,bullet));
    bullet->runAction(Sequence::create(move,moveDone,NULL));
    射击结束后移除子弹

    //射击结束后移除
    void HelloWorld::shootFinish(Node* pNode){
        Sprite* bullet = (Sprite*)pNode;
        if(bullet != NULL)
            bullet->stopAllActions();
            this->removeChild(bullet);
    }

    稍稍解释一下 :

    (1)shootVector就是向量AB。

    (2)overShootVector = (AB向量标准化)× 900 即得到  AC。比如说你设置的分辨率为 800 x 400 ,那么你可以用标准化向量 × 你最大分辨率再大一点,这样子向量就会超出屏幕之外而且长度又固定。

    (3)然后根据向量OC = OA + AC ,算出要移动到的点offScreenPoint(即点C)。

    (4)设置一下速度,长度一定了,所以时间 = 长度 / 速度 。


    =====================================================


    其实也没啥东西,纯属小白教程。。


    转载请注明出处:http://blog.csdn.net/shun_fzll/article/details/34430045






    展开全文
  • Cocos2d-android游戏引擎 2016-11-18 10:44:08
    什么是游戏引擎游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式...Cocos2d家族cocos2d一个开源的游戏开发框架,利用它可以非常容易的开发2D游戏。 包括以下成员 Cocos2d-x Cocos2d-iphone Cocos2d-android
  • cocos2d-x中的基础类,包括节点类CCNode、导演类CCDirector、场景类CCScene、布景层类CCLayer和精灵类CCSprite等。这些都是构成游戏画面的基本元素。但是游戏不仅是有静态的画面构成的,更多的时候,游戏是由动态的...
  • Cocos2d-x 学习之引擎介绍 2018-04-07 11:29:37
    Cocos2d-x 学习之引擎介绍Cocos2d-X是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C + +cocos2d-iPhone项目的版本。cocos2d-X发展的重点是围绕cocos2d跨平台。即其实现一次编码,再各平台分别编译后即可...
  • 本文实践自 Ray Wenderlich 的文章《How To Make A Simple iPhone Game with Cocos2D 2.X Tutorial》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.0.4进行学习和移植,前者是用Object-C所写,所以移植到Cocos2D-x会...
  • 玩过手机RPG的同学都知道,游戏中人物的移动一般都是通过触摸屏上的虚拟按键来实现,那么究竟是怎么实现的呢,我们来做一个简单的测试。 这里并没有按照其他Blog的实现来讲解,仅仅是通过我自己的想法。 为了方便...
  • 红孩儿Cocos2d-x学习园地教学资料由 [红孩儿游戏编程教学组] 组织编写.版权所有,盗文必究! 如何让一个精灵跟随触点移动  本节主讲:红孩儿 [注:本版使用Cocos2d-x 2.02版本] 如何让一个精灵跟随...
  • cocos2d 2.x 实现精灵的会移动的遮罩 归类于cocos2d-iPhone查看:2484 | 2012-07-02 本文转载自 dingwenjie的博客,看样子是子龙山人的老读者了,这篇文章是对子龙的《怎么用cocos2d 2.0实现精灵的遮罩...
  • 这个教程的目的就是让你们熟悉在cocos2d里面如何使用box2d,所采用的例子就是制作一个简单的应用,里面有一个篮球,你可以通过旋转你的iPhone来改变重力的方向,同时篮球碰到屏幕边界可以反弹。 这个教程是基于 ...
  • 前言 程序截图: ...在这个教程里面,你将会学习到如何开发一个太空射击游戏!...如果你对于如何制作基于cocos2d-x3.0的游戏完全陌生的话,这个教程可以帮助你!...假如你对cocos2d-x3.0编程完全陌生的话,那么你
  • :前提:cocos里边以顺时针为正方向,所以所有的度数按以前的习惯求出来后都要求反 cocos只能处理-180~180的度数范围,所以求出来的度数始终是这范围(cocos里用反正切来求度数可以保证度数在这范围) 弧度...
  • 虚拟按键控制精灵移动最近想做过街机类的游戏,做这类游戏,首先我想到的就是精灵的移动,就是当按键按下时,精灵进行移动,当按键抬起时,精灵停止移动。 查阅了相关资料,最后整理出了两种方法分享给大家,废话不...
  • 学了这么久Cocos2d-X,今天终于可以做出一个简单的小游戏了,游戏非常简单,通过菜单项控制精灵运动 在做游戏前,先学一个新概念 调度器(scheduler): Cocos2d-x调度器为游戏提供定时事件和定时调用服务。所有Node...
  • Cocos2d-x初学者教程 2017-06-14 10:35:42
    Cocos2d-x是一款快速、强大、易用的开源2D游戏引擎。 它与苹果的Sprit Kit略像,但又有一大优势——跨平台。 这意味着,开发者只需要写一个版本的代码就可以开发出能...在此教程中,你将学会用Cocos2d-x和C++开发一个
  • cocos2d框架介绍 2011-09-13 10:54:29
    cocos2d引擎 2.0 cocos2d简介 Cocos2d最初的版本是用python写的,之后被改成objectiveC,应用于iphone上,之后国内某人又根据该设计理念,将其改为C++版本cocos2dX,该版本可以在iphone,widnows,andriod三
  • 本系列的文章在上一个cocos2d-x入门的基础上,以基本的游戏例子进一步研究cocos2d-x 本篇讲解一个主视角跟随主角的效果,先上效果图。 很简单,就是整个视角(屏幕)随主角的移动移动,这在arpg,act等游戏...
  • Cocos2d-x中的3D功能 2018-07-25 11:59:11
    或许你已经开始接触Cocos2d-x了,并且已经知道它是一个2D游戏引擎。从3.x版本开始,Cocos2d-x已增加并改进了3D功能。3D游戏有着巨大的市场,所以Cocos2d-x中添加了3D开发所需的所有功能。或许3D开发对你来说是个新...
  • Cocos2d-x 坐标系统详解 2019-03-11 15:16:30
    Cocos2d-x 坐标系统详解 声明:本文使用的是cocos2d-x-3.17的代码 本文将详细介绍Cocos2d中的坐标系统,分析坐标系统中的坐标转换。Cocos2d-x 3.X支持3D功能,Cocos2d中的坐标系统也是3维,如果想彻底理解Cocs2d的...
  • 用TiledMap创建地图时,有时候地图很大,超过屏幕显示范围,就要求视角始终跟随主角精灵移动,让主角精灵始终位于屏幕视图的中央 在下面示意图中,初始时,显示窗口位于TiledMap的左下角部分,当主角精灵的位置位于...
  • cocos2d-x进度条以及方向 2015-03-06 14:33:15
    看到作者[wq右边]的博客【cocos2d-x初学笔记09:进度条Progress】 里面对进度条的方向理解的不清楚,自己做了一下实验 做进度条最基本需要三元素:Sprite(进度条精灵),ProgressTo(百分比进度条,还有...
1 2 3 4 5 ... 20
收藏数 5,772
精华内容 2,308