Cocos2d-x游戏《雷电大战》html5版

本文介绍如何使用 Cocos2d-x 实现双层地图无限滚动的效果,通过两个背景层的图片切换,达到游戏场景的连续滚动。文章详细展示了资源加载方式和背景层的更新逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢林柄文

项目地址:http://blog.youkuaiyun.com/Evankaka/article/category/2922463

正好我准备学习一下cocos2d-x html5

开始吧 1 Cocos2d-x《雷电大战》(1)-双层地图无限滚动


再次声明一下 我只是学习,所有的创意和素材来自于林柄文


1.src/resource.js 载入资源

var res = {
  HelloWorld_png : "res/HelloWorld.png",
  BACK3_1:'res/back3_1.png',
  BACK3_2:'res/back3_2.png',
  BACK4_1:'res/back4_1.png',
  BACK4_2:'res/back4_2.png',
};



2 修改app.js

var HelloWorldScene = cc.Scene.extend({
  onEnter:function () {

    this._super();
    //两个背景层
    var layer = new BGLayer(res.BACK4_2,res.BACK4_1,-2);
    this.addChild(layer,100)

    var bg2= new  BGLayer(res.BACK3_1,res.BACK3_2,2);
    this.addChild(bg2,200);


  }
});


现在我们期待实现BGLayer 各自由两张图景图组成 ,向上或下移动

var BGLayer = cc.Layer.extend({
  //背景由两张图构成 ,step为移动方向和大小
  ctor:function (bg1,bg2,step) {
    var me=this;
    me._super();
    var size = cc.winSize;
    var newsp=function(bg,p){
      var s=new cc.Sprite(bg);
      var myselfSize=s.getContentSize();
      s.attr({
        scaleX:size.width / myselfSize.width,
        scaleY:size.height / myselfSize.height,
        x:p.x,
        y:p.y,
      });
      this.addChild(s);
      return s;
    }.bind(me);
    me.sp1=newsp(bg1,cc.p(size.width / 2 ,size.height));
    me.sp2=newsp(bg2,cc.p(size.width / 2 ,0));
    me.step=step;
    me.scheduleUpdate();
    return true;
  },

  update:function( dt){
    var me=this;
    var maxY=cc.winSize.height * 1.5;
    var minY= - cc.winSize.height * 0.5;
    //过载检查
    [me.sp1,me.sp2].forEach(function(sp){
      var newY=sp.getPositionY()+me.step;
      //向上移动时超过maxY后下两屏,反之亦然
      if(me.step >0 && newY > maxY){
        newY = minY;
      }else if(me.step < 0 && newY < minY){
        newY = maxY;
      }
      sp.setPositionY(newY);
    });
  },

  onExit:function(){
    this.unscheduleUpdate();
  }
});

我不会做图 想直观看效果可移步至原作者blog

cocos2dx 雷电MoonWarriors_游戏源码 #include "GameLayer.h" #include "SimpleAudioEngine.h" #include "Bullet.h" #include "Resource.h" #include "Config.h" #include "Enemy.h" #include "Effect.h" #include "GameOver.h" #include "PauseLayer.h" using namespace cocos2d; using namespace CocosDenshion; bool isPaused = false; GameLayer::GameLayer():m_state(statePlaying),m_time(0),m_ship(NULL),m_backSky(NULL),m_backSkyHeight(0),m_backSkyRe(NULL),m_backTileMap(NULL),m_backTileMapHeight(0),m_backTileMapRe(NULL),m_isBackSkyReload(false),m_isBackTileReload(false),m_lbScore(NULL),m_lifeCount(NULL), m_tempScore(0) { } GameLayer::~GameLayer() { if (m_levelManager) { delete m_levelManager; } play_bullet->release(); enemy_bullet->release(); enemy_items->release(); } bool GameLayer::init() { if (!CCLayer::init()) { return false; } // 开启触摸 this->setTouchEnabled(true); // 创建数组,需要retain一下 play_bullet = CCArray::create(); play_bullet->retain(); enemy_bullet = CCArray::create(); enemy_bullet->retain(); enemy_items = CCArray::create(); enemy_items->retain(); m_state = statePlaying; Enemy::sharedEnemy(); Effect::sharedExplosion(); Config::sharedConfig()->resetConfig(); winSize = CCDirector::sharedDirector()->getWinSize(); m_levelManager = new LevelManager(this); //初始化背景 initBackground(); m_screenRec = CCRectMake(0, 0, winSize.width, winSize.height + 10); // score m_lbScore = CCLabelBMFont::create("Score:0", s_arial14_fnt); m_lbScore->setAnchorPoint(ccp(1, 0)); m_lbScore->setAlignment(kCCTextAlignmentRight); addChild(m_lbScore, 1000); m_lbScore->setPosition(winSize.width - 5, winSize.height - 30); // ship life CCTexture2D *shipTexture = CCTextureCache::sharedTextureCache()->addImage(s_ship01); CCSprite *life = CCSprite::createWithTexture(shipTexture, CCRectMake(0, 0, 60, 38)); life->setScale(0.6); life->setPosition(ccp(30,winSize.height-23)); addChild(life, 1, 5); // ship life count char lifecount[2]; sprintf(lifecount, "%d",Config::sharedConfig()->getLifeCount()); m_lifeCount = CCLabelTTF::create(lifecount, "Arial", 20); m_lifeCount->setPosition(ccp(60, winSize.height-20)); m_lifeCount->setColor(ccc3(255,0, 0)); addChild(m_lifeCount, 1000); // ship m_ship = Ship::create(); addChild(m_ship, m_ship->getZoder(), 1001); CCMenuItemImage *pause = CCMenuItemImage::create("pause.png", "pause.png", this, menu_selector(GameLayer::doPause)); pause->setAnchorPoint(ccp(1, 0)); pause->setPosition(ccp(winSize.width, 0)); CCMenu *menu = CCMenu::create(pause, NULL); menu->setAnchorPoint(ccp(0, 0)); addChild(menu, 1, 10); menu->setPosition(CCPointZero); // 调 update函数 scheduleUpdate(); // 每秒调一次 scoreCounter函数 schedule(schedule_selector(GameLayer::scoreCounter), 1); if (Config::sharedConfig()->getAudioState()) { SimpleAudioEngine::sharedEngine()->playBackgroundMusic(s_bgMusic, true); } return true; } void GameLayer::update(float dt) { if (m_state == statePlaying) { checkIsCollide(); removeInactiveUnit(dt); checkIsReborn(); updateUI(); } } void GameLayer::scoreCounter() { if (m_state == statePlaying) { m_time++; m_levelManager->loadLevelResource(m_time); } } void GameLayer::checkIsCollide() { CCObject *units; CCObject *bullets; CCObject *enemybs; CCARRAY_FOREACH(enemy_items, units) { UnitSprite *enemy = dynamic_cast<UnitSprite*>(units); CCARRAY_FOREACH(play_bullet, bullets) { UnitSprite *bullet = dynamic_cast<UnitSprite*>(bullets); if (this->collide(enemy, bullet)) { enemy->hurt(); bullet->hurt(); } if (!(m_screenRec.intersectsRect(bullet->boundingBox()))) { bullet->destroy(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值