首页 > 代码库 > 简单跑酷

简单跑酷

//定义一个方向枚举  (头文件)
typedef  enum JumpDir
{
   DirUp,DirDown,DirStop
}
public:
int speed;//速度
JumpDir jump;
//******************Cpp文件************
1.
 Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin =

Director::getInstance()->getVisibleOrigin();

 speed = 30;//初始化为30

2.//添加背景层 (锚点默认在 point(0.5,0.5))
   auto BG = Sprite:create("bg.jpg");
   BG.setPosition(visibleSize/2);
   BG.setTag(90);//设置一个标记
   this->addChild(BG);

3.//加载地图层,把制作好的地图添加到游戏中(锚点默认在 point(0,0))
 auto map01 =  TMXTiledMap::create("t01.tmx");
    
 map1->setTag(100);
////设置一个标记    
 this->addChild(map1);

4.创建一个精灵动画,让它在地图上跑。(可以做一个封装)
auto cache = SpriteFrameCache::getInstance();
    
cache->addSpriteFramesWithFile("run.plist","run.png");
    
SpriteFrame *frame;
    
Vector<SpriteFrame*> arrayFrame;
    
int index = 1;
        
do
{

frame = cache->spriteFrameByName(String::createWithFormat("run%d.png",index)->getCString());
    

   if (frame == NULL)

   {

     break;

   }

arrayFrame.pushBack(frame);

index++;

} while (1);

Animation* animation = Animation::createWithSpriteFrames(arrayFrame);

animation->setDelayPerUnit(0.1f);

animation->setLoops(-1);

Animate* act = Animate::create(animation);
sp->runAction(act);

5.在update函数中,无限滚地图
//获取地图标记
auto map01 = this->getChildByTag(100);
if(map01->getPositionX() > -16000+960)//map01->getPositionX()获取的点一直向左移动小于0
{
  map01->setPositionX(map01->getPositionX()-5);
}


6.添加触摸事件

处理人物的跳跃

7.封装一个人物跳跃函数
void SpriteJump();
{
   //人物跳跃
    
auto sp = this->getChildByTag(120);
    
if (jump == JumpDir::DirUp)
    //如果方向 向上,否则方向 向下
{  //使精灵的向上运动类似于向 上抛的石头 速度越来越多小,速度小于0 后向下落
   sp->setPositionY(sp->getPositionY()+speed);
    //精灵的Y轴从30开始递减    
   speed = speed - 2;
    //速度每向上一帧减小 2    
    if (speed==0)
//当上升的速度小于0时,改变运动方向 向下        
     {

      jump=JumpDir::Dirdown;//运动方向 向下    
      }

    log("DirUp=%d",speed);

}else if (jump==JumpDir::Dirdown)
//如果方向 向上,否则方向 向下
 {

   sp->setPositionY(sp->getPositionY()-speed);//精灵的Y轴从 0 开始增加
   speed = speed + 2;
//速度每向下一帧增加 2    
   log("DirDown=%d",speed);

   checkDown();
//检测是否踩到草坪
   if (speed > 30)

   {

     //jump = JumpDir::DirStop;
//运动方向 停止
      speed =30;

      checkDown();

    }
 }    
}
-----------------------------
void HelloWorld::checkDown()

  {
    auto nowplayer =(Sprite*) this->getChildByTag(120);
    
    auto nowmap =(TMXTiledMap*)this->getChildByTag(100);

    // px 滚动的地图长度加上人物在屏幕上的位置,就是人物踩在地图是的位置
    int px = nowplayer->getPositionX()+abs(0-nowmap->getPositionX());

        //py 人物在地图的位置
    int py = nowplayer->getPositionY()+0;
    
    //人物在地图的  行  列

    
    int nowrow = px/32;
  Tiled地图的行    
    int nowcol = py/32;
  Tiled地图的列
    log ("nowrow=%d  nowcol=%d",nowrow,nowcol);

    if (nowcol < 0 || nowcol >14)
    
    {
   return ;
    }
    

                      (地图的高度/块大小 - nowcol)
    int tid = nowmap->getLayer("t01")->getTileGIDAt(Vec2(nowrow,14-nowcol));
    
    log("tid=%d",tid);
    
    if (tid >0)
    
    {
        
    jump = JumpDir::DirStop;

    }else
    
    {
        
    log("Game Ocer");

        return;
    
    }
    


}



本文出自 “风中的一粒沙” 博客,请务必保留此出处http://libinqi456.blog.51cto.com/4819343/1606107

简单跑酷