cocos2dx CrystalCraze 宝石消除游戏 解析(一)

本文探讨使用cocos2dx 2.2.2版本的JavaScript示例项目CrystalCraze,研究宝石消除游戏的实现。通过分析项目结构,发现资源位于cocos2d-x的SharedgamesCrystalCraze目录,游戏场景由cocosBuilder设计。主要关注点在于MainScene.js,了解onDidLoadFromCCB和onUpdate方法,后者控制宝石的随机下落。后续文章将深入解析更多细节。

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

    最近准备做一个消除的小游戏,正好看到cocos2dx 里面有个消除的游戏例子叫CrystalCraze,正好研究下,但它是用js写的,以前没用用过js开发cocos2d,正好在这里记录下。

    我用的是cocos2d-x-2.2.2版本,导入到vs2010后,显示的目录是在cocos2d-x-2.2.2\samples\Javascript\CrystalCraze

     但是在Class目录下面AppDelegate.h跟AppDelegate.cpp,里面没有具体的代码,而且也没有相应的素材资源

    其实游戏真正的资源是在cocos2d-x-2.2.2\samples\Javascript\Shared\games\CrystalCraze目录下,有个CrystalCraze.ccbproj文件,这个游戏是用cocosBuilder做的场景,可以直接打开这个文件,看到对应的编辑场景,还有一些文件夹,里面有psd文件,还有各平台的资源,在Resources文件夹下,有各种资源跟源码。

    进去后,可以看到各场景的ccb,js文件,还有对应的图片,粒子效果,声音等,在cocosBuilder里面可以查看具体的场景各组件的名称,我主要看他怎么实现的游戏,就主要看js文件了。

大家可以选择一个平台进去看,Android 或者 iPhone 里面会有该平台下的所有资源。

Main.js 里面 就是加载一些声音文件,还有默认显示MainScene,都能看懂。

    1.MainScene.js

     我用的Notepad++看的js代码,里面有个 函数列表,可以查看代码里面的各个方法,我觉得还是不错的

     看看各方法名,onDidLoadFromCCB  应该就是先执行这个方法了

    

MainScene.prototype.onDidLoadFromCCB = function()
{
	// 设置背景的粒子效果,应该就是背景那个忽隐忽现的小圆圈
	var starParticles = cc.ParticleSystem.create("particles/bg-stars.plist");
	this.starNode.addChild(starParticles);

	// 菜单默认没有选中任何item
	this.menuSelection = kMenuSelectionNone;

	// 设置出现动画完成后回调onAnimationComplete方法 和设置下面以前的分数
	this.rootNode.animationManager.setCompletedAnimationCallback(this, this.onAnimationComplete);
	this.lblLastScore.setString(""+gLastScore);

	// 背景掉落的宝石数组
	this.fallingGems = [];

	//每帧执行onUpdate方法
    this.rootNode.onUpdate = function(dt) {
        this.controller.onUpdate();
    };
    this.rootNode.schedule(this.rootNode.onUpdate);

    // 加载宝石
    cc.SpriteFrameCache.getInstance().addSpriteFrames("crystals.plist");

	//背景音乐
	gAudioEngine = cc.AudioEngine.getInstance();
	gAudioEngine.playMusic("sounds/loop.mp3");
};

    下面是onUpdate方法,主要控制背景随机下落的宝石

MainScene.prototype.onUpdate = function()
{
	var gem;
	
	if (Math.random() < 0.02)
	{
		//随机生成5中宝石中的一种,并根据对应名称生成
		var type = Math.floor(Math.random()*5);
		var sprt = cc.Sprite.createWithSpriteFrameName("crystals/"+type+".png");
		//var sprt = cc.Sprite.create("crystals/"+type+".png");
		//var p = cc.ParticleSystem.create("particles/falling-gem.plist");

		//设置宝石随机的位置跟大小  
		var x = Math.random()*this.fallingGemsLayer.getContentSize().width;
		var y = this.fallingGemsLayer.getContentSize().height + kGemSize/2;
		var scale = 0.2 + 0.8 * Math.random();

		var speed = 2*scale*kGemSize/40;

		sprt.setPosition(x,y);
		sprt.setScale(scale);

		//p.setPosition(x,y);
		//p.setScale(scale);
		//p.setAutoRemoveOnFinish(true);
		//设置属性 并加入到数组 和界面中
		gem = {sprt:sprt, speed:speed};
		//var gem = {sprt:sprt, speed:speed, particle:p};
		this.fallingGems.push(gem);

		//this.fallingGemsLayer.addChild(p);
		this.fallingGemsLayer.addChild(sprt);
	}
	//遍历下落宝石数组
	for (var i = this.fallingGems.length-1; i >= 0; i--)
	{
		gem = this.fallingGems[i];
		//每帧调用 y坐标减少speed 
		var pos = gem.sprt.getPosition();
		pos.y -= gem.speed;
		gem.sprt.setPosition(pos);
		//gem.particle.setPosition(pos);

		if (pos.y < -kGemSize/2)
		{
			//小于一定值后从界面跟数组中删除
			this.fallingGemsLayer.removeChild(gem.sprt, true);
			//gem.particle.stopSystem();
			this.fallingGems.splice(i, 1);
		}
	}
};

    其他方法,onPressAbout 弹出关于界面,就不介绍了;onPressPlay 播放音效,跳转到GameScene,并把所有下落数组内的宝石淡出

下一篇:

cocos2dx CrystalCraze 宝石消除游戏 解析(二)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值