A. 自学cocos2d js游戏开发应该按什么步骤进行
跟你简要说一下我的自学路,以免你走弯路
背景:
有工作,而且很忙;在不影响工作基础上用业余时间鼓捣(经常会因为工作耽搁学习进度);基本没技术背景(初中qbasic、高中pascal半吊子),大学文科,工作也不是搞代码。因此我感觉我的自学路跟你还是挺契合的。
1
两年前的一天,决定要做独立游戏制作人。选定引擎cocos2d,开始学习objective-c语言;(如果你打算只在iOS平台开发可以学obj-c配合cocos2d或者sprite kit;如果打算跨平台就要用cocos2d-x和c++了;当然unity什么的也不错但是我还没尝试过,一直很向往)
2
我跳过了iOS程序开发(似懂非懂看完了斯坦福那一系列的教学视频),结合当时情况直接选择了cocos2d引擎,这时开始接触 @吴一刀 推荐的博客;我主要看的是子龙山人<子龙山人 - 博客园>、Ray Wenderlich<Ray Wenderlich>、Himi<黑米GameDev街区>这些博客里最基本的例子,知易那个以我当时的水平还看不懂。
3
尝试开始设计自己的简单游戏,我做打地鼠!当然比教学例子里的打地鼠复杂多了
4
这个过程中发现自己懂的实在是不够,所以又开啃这本书:Learn cocos2d 2 by Steffen Itterheim & Andreas Low
5
慢慢的发现需要一些趁手的工具和编辑器,并发展出一套自己构建于cocos2d之上的游戏设计架构。我目前的情况是这样:
关卡编辑我使用plist文件配合自己写的类;
sprite sheet使用TexturePacker<TexturePacker>;
动画/UI编辑最初自己手写太累,后来选择了cocosbuilder,请注意现在这个软件已经停止维护,转而引导用户使用SpriteBuilder<SpriteBuilder>(域名都做了自动跳转;SpriteBuilder我木有研究过,建议你研究一下)。
粒子编辑我自己还没实际用到,如果真正需要我感觉cocosbuilder的够我用的。//更新:后来用到了ParticleDesigner和cocosbuilder两个软件的粒子编辑混搭
我当时遇到的一个大麻烦是如何让cocosbuilder、cocos2d版本互相兼容且cocosbuilder无问题。大概情况是这样:cocosbuilder2.1和cocos2d-iphone2.0及2.1版本都不协调怎么办?;What version of Cocosbuilder and Cocos2d-iphone should I choose?
目前我使用的cocosbuilder 2.1版本(渐变层有bug、并且很可惜动画播放完没有触发消息的机制,我只好把每个动画时长都手动记录一下自己处理)
======3月12日更新======
在 @GarfieldKwong 指点下发现这个版本动画播放完是可以触发消息机制的,更高级版本3.x支持的效果应该是在动画中就加入callback的关键帧
新技能get√
具体代码可见下面学习案例的第一个例子里Explosion部分
=====================
cocosbuider的学习可以看两个例子Creating a Game with CocosBuilder;Introction to CocosBuilder;然后就是多用多尝试。
6
整个学习过程要学会查资料、学会寻求帮助,我主要用的stackoverflow(话说刚刚发现stackoverflow的reputation喜过15,终于可以投票了:)
在学习过程中得到了子龙山人(我认为本尊是这位 @屈光辉 )、LearnCocos2d作者Steffen、 @kubisoft 以及众多网上朋友的帮助,再次表示感谢。
7
硬件及开发者资格:看完c++开始看obj-c,这个过程一直是使用的vmware虚拟机安装的mac系统写程序;然后入手一个最便宜的mac pro、以及iPhone,尝试玩各种游戏;从看c++开始大约过了1年半(已经有非常简陋的游戏demo)才真正购入iOS开发者资格并开始真机测试。
8
尝试过的一些其他工具、各种弯路和坑、以及发散内容:
可以拖拽方式写代码的stencyl <Stencyl: Make iPhone, iPad, Android & Flash Games without code>;
最初学的不是ojc-c而是谭浩强老师的c++程序设计(虽然有人不喜谭老师,但那书是中文的让我对面对对象程序设计有一些初步的概念,再看英文的obj-c不至于太摸不着头脑,反正手头正好有这么一本买了6年没看的c++。。。);
尝试过<Tiled Map Editor>但自己目前的坑没有用到;
尝试过一点物理引擎和粒子,但自己目前的坑没有用到;现在粒子用到了,做了火焰等效果,也挺美的;但是一定要注意CPU占用优化,内存方面我最低支持4S没遇到大问题
学习音乐制作,这个我小时候学琴一直也喜欢音乐所以有一点点底子,如果没有基础可能上手有门槛;开始用的软件LMMS,但是音源插件在64位系统的问题我一直没解决掉时间精力也不多,所以是暂时停滞了;最近发现Garage Band可能也可以写歌;另外还试过一个很有历史的微软的音乐自动编辑器,很好玩,用来做背景音乐也不错。
入手手绘板学画画(这中间纠结了好久才决定用位图不用矢量图),如果你能找到热爱游戏的美术同学一起搞那最好不过。但是我一直对画画心痒难搔。。。所以入了这个深坑,晒一晒:
转载
z
B. cocos2d-x中可以预加载cocostudio导出的json文件么
貌似对于JSON的异步加载目前还没有办法吧,不然就不会那么多人堆JSON的加载速度吐槽了
C. Android游戏开发之Cocos2d-x
游戏的制作如播放电影,拥有四大核心,包括: 导演、场景、图层、演员 。通过它们之间的不同配合,实现丰富多彩的效果。
public class CocosActivity extends AppCompatActivity {
private CCDirector mCcDirector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CCGLSurfaceView ccglSurfaceView =new CCGLSurfaceView(this);
setContentView(ccglSurfaceView);
导演,全局只有一个,单例模式创建
mCcDirector = CCDirector.sharedDirector();
开启绘制(开始拍电影)
mCcDirector.attachInView(ccglSurfaceView);
帧率,每秒刷新的次数,与手机性能有关
//ccDirector.setDisplayFPS(true);
设置帧率为60(记得把帧率文件放进项目中)
//ccDirector.setAnimationInterval(1/60f);
设置横屏
//ccDirector.setDeviceOrientation(CCDirector.);
屏幕适配,会基于不同屏幕大小进行适配
mCcDirector.setScreenSize(1920,1080);
场景
CCScene ccScene = CCScene.node();
图层
CCLayer ccLayer =CCLayer.node();
给场景添加图层
ccScene.addChild(ccLayer);
导演运行场景
mCcDirector.runWithScene(ccScene);
}
@Override
protected void onResume() {
super.onResume();
mCcDirector.onResume();
}
@Override
protected void onPause() {
super.onPause();
mCcDirector.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mCcDirector.end();
}
1、平移
参数1是移动时间,参数2是目标位置坐标,ccp方法是把坐标转换为cocos2d的坐标
CCMoveTo ccMoveTo = CCMoveTo.action(3,ccp(200,0));
与上不同的是,第2个参数代表水平移动200,竖直不移动,即偏移量
CCMoveBy ccMoveBy =CCMoveBy.action(3,ccp(200,0));
2、旋转
参数1时间,参数2角度,旋转中心是左下角的点,顺时针转
CCRotateBy ccRotateBy =CCRotateBy.action(3,360);
与上不同的是,逆时针转(捷径,顺时针转270==逆时针转90)
CCRotateTo ccRotateTo =CCRotateTo.action(3,270);
3、缩放
参数1时间,参数2X方向缩放,参数3Y方向缩放
CCScaleBy ccScaleBy =CCScaleBy.action(3,2,2);
参数1时间,参数2缩放
CCScaleTo ccScaleTo =CCScaleTo.action(3,2);
4、跳跃(参数1时间,参数2目标点,参数3跳跃高度,参数4跳跃次数)
CCJumpBy ccJumpBy =CCJumpBy.action(3,ccp(0,0),100,3);
5、淡入淡出(参数是时间)
CCFadeIn ccFadeIn =CCFadeIn.action(2);
CCFadeOut ccFadeOut =CCFadeOut.action(2);
6、贝塞尔曲线
点的含义,从point1出发,经过point2,到达endPosition
CCBezierConfig ccBezierConfig =new CCBezierConfig();
ccBezierConfig. controlPoint_1 =ccp(100,50);
ccBezierConfig. controlPoint_2 =ccp(200,200);
ccBezierConfig. endPosition =ccp(300,100);
CCBezierBy ccBezierBy =CCBezierBy.action(2,ccBezierConfig);
7、加速度
CCMoveBy ccMoveBy =CCMoveBy.action(2,ccp(100,100));
渐快渐慢,参数2是加速度
CCEaseIn ccEaseIn =CCEaseIn.action( ccMoveBy ,5);
CCEaseOut ccEaseOut =CCEaseOut.action( ccMoveBy ,5);
8、闪烁(时间,闪烁次数)
CCBlink ccBlink =CCBlink.action(2,10);
9、文字(参1是显示的文字,参2是字体格式(可不填,如""),参数3是字体大小)
CCLabel ccLabel = CCLabel.labelWithString("显示文字","STCAIYUN.TTF",20);
设置文字颜色
ccColor3B ccColor3B =ccc3(100,50,0);
ccLabel.setColor(ccColor3B );
设置文字位置
ccLabel.setPosition(ccp(width,height));
重置文字
ccLabel.setString("显示文字");
颜色渐变(从本来的文字颜色渐变到设置的字体颜色)
CCTintBy tintBy =CCTintBy.action(3,ccc3(50,-50,100));
10、循环(参数是动画效果)
CCRepeatForever ccRepeatForever =CCRepeatForever.action(action);
11、延迟(参数是时间)
CCDelayTime ccDelayTime =CCDelayTime.action(1);
12、反转(将一个动画倒序执行)
ccJumpBy.reverse();
13、同时(参数是不定长度数组)
CCSpawn ccSpawn =CCSpawn.actions(action1,action2);
14、连续动画(参数是不定长度数组)
CCSequence ccSequence =CCSequence.actions(action1,action2, ccCallFunc ");
15、反射(执行一个动画方法)
CCCallFunc .action(this," anim ");
被反射的执行方法
public void anim (){}
16、逐帧动画
public void walk(){
存放帧动画的集合
ArrayList ccSpriteFrames =new ArrayList<>();
String format="z_1_%d.png"; // %d和%02d代表整数,用i来取代,%d只取代i,%02d会补0
for(int i=1;i<10;i++){
CCSprite ccSprite =CCSprite.sprite(String.format(format,i));
CCSpriteFrame ccSpriteFrame =ccSprite.displayedFrame();
ccSpriteFrames.add(ccSpriteFrame );
}
参数1是动画名称,参数2是每一帧停留的时间,参数3是帧动画集合
CCAnimation ccAnimation =CCAnimation.animation("walk",.2f,ccSpriteFrames);
参数2是否持续执行动画,如果想执行无限循环,可以使用CCRepeatForever
CCAnimate ccAnimate =CCAnimate.action(ccAnimation,false);
mCcSprite.runAction(ccAnimate);
}
17、隐藏
CCHide ccHide =CCHide.action();
18、显示
CCShow ccShow =CCShow.action();
19、跟随(参数是跟随的对象)
CCFollow ccFollow =CCFollow.action(mCCSprite);
20、执行动画(上述皆是)
mCcSprite.runAction(action);
21、工具类使用
CGPointUtil .distance(point1,point2); //计算两点距离
获取声音引擎
SoundEngine engine =SoundEngine.sharedEngine();
参数1是activity,SurfaceView创建时存入,参2是播放资源id(res\raw),参数3是否循环播放
engine.playSound(CCDirector.theApp,1,true);
手动停止音乐播放
engine.realesAllSounds();
生命周期跟随Activity
SoundEngine.sharedEngine().resumeSound();
SoundEngine.sharedEngine().pauseSound();
SoundEngine.sharedEngine().realesAllSounds();
预加载播放音乐,避免播放音乐时没声音
SoundEngine.sharedEngine().preloadEffect();
SoundEngine.sharedEngine().preloadSound();
1、创建
CCSprite mCcSprite =new CCSprite(" pic.jpeg ");
2、锚点(图片上的一点,类似图钉,对应图片显示的位置)
CGPoint cgPoint =ccp(0,0);
mCcSprite.setAnchorPoint(cgPoint);
3、位置
mCcSprite.setPosition(cgPoint);
4、属性(缩放、翻转、透明度)
ccSprite.setFlipX(true); 水平翻转
ccSprite.setOpacity(255); 透明度
ccSprite.setScale(2); 缩放
5、移除(在Layer里面操作)
mCcSprite.removeSelf(); //精灵从图层中移除
( Layer )this.removeSelf(); // 移除整个图层
6、尺寸
CGSize cgSize =CCDirector.sharedDirector().winSize();
1、游戏暂停(图层静止,将不再响应任何事件)
MapLayer.this.onExit();
注意:因为图层不再响应任何事件,所以暂停按钮应该加在暂停图层的父图层上
this.getParent().addChild(new PauseLayer());
2、游戏继续(图层恢复动态,接收点击事件)
MapLayer.this.onEnter();
通用的游戏继续方法
CCDirector.sharedDirector().getRunningScene().onEnter();
3、定时器
CCScheler ccScheler =CCScheler.sharedScheler();
通过反射执行方法
ccScheler.schele(" onScheler ",this,2,false);
方法声明为公开类型
public void onScheler (float f){ //实现具体逻辑
};
4、进度条
CCProgressTimer ccProgressTimer =CCProgressTimer.progressWithFile(" image/pic.jpeg "); //多层目录
ccProgressTimer.setPosition(width,height);
this.getParent().addChild(ccProgressTimer); //具体加到什么图层,看情况
ccProgressTimer.setScale(0.6f);
ccProgressTimer.setPercentage(2);
设置显示样式(垂直,水平)->(最后2个字母,left,right,代表进度条从左往右)
ccProgressTimer.setType(CCProgressTimer. LR );
进度条外框 等元素,都作为精灵与进度条同级加入图层
this.getParent().addChild(sprite);
Android坐标系的(0,0)在左上角,而Cocos2d-x坐标系的(0,0)在左下角。所以在处理Android的点击事件MotionEvent时,需要进行坐标体系的转换。
CGPoint cgPoint = convertPrevTouchToNodeSpace (event);
监听图片的点击范围,自定义封装点击事件
CGRect .containsPoint( mCcSprite.getBoundingBox() , cgPoint );
CCMenu ccMenu =CCMenu.menu();
CCSprite normalSprite =CCSprite.sprite("pic_1.jpeg"); //正常情况下显示的图片
CCSprite selectSprite =CCSprite.sprite("pic_2.jpeg"); //按下时显示的图片
注意:反射的方法需要使用pulbic修饰,参数指target,直接传this,它不是上下文Context
CCMenuItemSprite itemSprite =CCMenuItemSprite.item( normalSprite , selectSprite , this ," onCLick ");
ccMenu.addChild( itemSprite );
this.addChild(ccMenu); //菜单添加到图层
public void onCLick (Object obj){} //点击事件响应方法,必须用public修饰以及带参数
setIsTouchEnabled(true); //打开图层点击事件,默认关闭
模仿任何天气现象,只需要改这一句,剩下的不变
CCParticleSystem ccParticleSystem= CCParticleSnow.node();
设置雪花大小
ccParticleSystem.setScale(2);
设置飘落的速度
ccParticleSystem.setSpeed(10);
设置雪花的图片
ccParticleSystem.setTexture(CCTextureCache.sharedTextureCache().addImage("snow.png"));
this.addChild(ccParticleSystem,1);
停止粒子系统(下雪)
ccParticleSystem.stopSystem();
1、加载地图
ArrayList mCGPoints = new ArrayList<>();
CCTMXTiledMap mCctmxTiledMap = CCTMXTiledMap.tiledMap(" map.tmx ");
mCctmxTiledMap.setAnchorPoint(ccp(0.5f,0.f));
mCctmxTiledMap.setPosition(width,height);
CCTMXObjectGroup cctmxObjectGroup= mCctmxTiledMap.objectGroupNamed("road");
ArrayList<HashMap<String,String>> objects = cctmxObjectGroup.objects;
for(HashMap<String,String> hashMap:objects){ //加载地图的坐标(需要经过的坐标点)
Integer x =Integer.parseInt(hashMap.get("x"));
Integer y =Integer.parseInt(hashMap.get("y"));
CGPoint cgPoint =ccp(x,y);
mCGPoints .add(cgPoint); }
this.addChild(mCctmxTiledMap);
在地图上添加精灵
mCCSprite.setPosition(mCGPoints.get(0));
mCctmxTiledMap.addChild(mCCSprite);
地图跟随精灵的移动而移动
CCFollow ccFollow =CCFollow.action(mCCSprite);
mCctmxTiledMap .runAction(ccFollow);
2、地图随手指触摸事件移动(重写触摸方法)
@Override
public boolean ccTouchesMoved(MotionEvent event) {
手指拖拽时,地图随手指移动
mCctmxTiledMap.touchMove(event,mCctmxTiledMap);
地图移动,地图上所有精灵都随之移动(地图是父亲,精灵是孩子)
mCctmxTiledMap.addChild(mCCSprite);
return super.ccTouchesMoved(event);
}
创建场景
CCScene ccScene =CCScene.node();
场景添加图层
ccScene.addChild(ccLayer);
场景切换特效
CCJumpZoomTransition ccJumpZoomTransition =CCJumpZoomTransition.transition(2,ccScene);
导演切换场景
CCDirector.sharedDirector(). replaceScene (ccJumpZoomTransition);
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。用法和ArrayList相近。
CopyOnWriteArrayList OnWriteArrayList = new CopyOnWriteArrayList();
setIsTouchEnabled(true); //打开点击事件
@Override
public boolean ccTouchesBegan (MotionEvent event) {
return super.ccTouchesBegan(event);
}
@Override
public boolean ccTouchesCancelled (MotionEvent event) {
return super.ccTouchesCancelled(event);
}
@Override
public boolean ccTouchesMoved (MotionEvent event) {
return super.ccTouchesMoved(event);
}
@Override
public boolean ccTouchesEnded (MotionEvent event) {
return super.ccTouchesEnded(event);
}
描述:UI频繁刷新,造成主线程的堵塞或挂起
private CCGLSurfaceView mCCGLSurfaceView;
mCCGLSurfaceView = (CCGLSurfaceView) CCDirector.sharedDirector().getOpenGLView();
mCCGLSurfaceView.queueEvent(new Runnable() {
@Override
public void run() { //切换到主线程
}
});
描述:CCSprite运行动画时,没有表现出任何视觉效果。
原因:一个动画只能被一个CCSprite执行一次,执行完成后,原来的动画会失效。
解决:每次执行的动画,都需要重新生成,即使是相同的动画效果。
缓存:CCDirector.sharedDirector().purgeCachedData();
D. 如何用Cocos2d-JS制作一个微信报名宣传页
您好,很高兴为您解答,
关键点解析如下:
1.设置浏览器meta来适配屏幕,引擎内部会根据屏幕大小来设置meta的viewport值,会达到更好的屏幕适配效果。
2.针对手机浏览器和PC浏览器启用不同的分辨率适配策略。
3.预加载图片声音等资源。 cc.LoaderScene.preload会生成一个“加载中 x%”的界面,等待资源加载结束后,调用孝册第二个参数纯慎知传入的匿名函数。 对于基于html的游戏,页面是放在服务器端供浏览器做消下载的,为了获得流畅的用户体验,cc.LoaderScene.preload让浏览器先把远程服务器的资源缓存到本地。需要预加载的资源定义在src/Resources.js文件中。
4.启动游戏的第一个场景。
希望对你有用,望采纳!您的采纳是我答题的动力!,谢谢
E. 如何用Cocos2d-JS制作一个微信报名宣传页
开发环境与新建项目
如果没用过Cocos2d-JS的朋友们,可以到cocos官网上去下载,此处我们用的是3.0final,或者,我们可以下载Lite版本的Cocos2d-JS,lite版本可以很方便的根据需求去下载所需要的模块,可以很大的减少代码的体积,可在此下载,我们需要用到的模块有core?actions?menuprogress-timer,在该页面中选择Customized Version然后勾选上述几个模块,并点击下载。
此处我们使用cocos 命令行来创建新的工程
$cd cocos2d-js/tools/cocos2d-console/bin $./cocos new weChat -l js --no-native $cd weChat/ $../cocos run -p web
环境搭建并不是这篇文章的重点,更详细的信息可以参考:《搭建 Cocos2d-JS 开发环境》。
主界面及其页面切换框架的实现
程序的入口代码在main.js中,用编辑器打开并修改为下面的代码。
cc.game.onStart = function () { cc.view.adjustViewPort(true); cc.view.enableAutoFullScreen(false); var mode = cc.sys.isMobile && window.navigator.userAgent.indexOf("MicroMessenger") != -1 ? cc.ResolutionPolicy.FIXED_HEIGHT : cc.sys.isMobile ? cc.ResolutionPolicy.FIXED_WIDTH : cc.ResolutionPolicy.SHOW_ALL; cc.view.setDesignResolutionSize(640, 831, mode); //load resources cc.LoaderScene.preload(g_resources, function () { cc.director.runScene(new MainScene()); }, this);};cc.game.run();
关键点解析如下:
1.设置浏览器meta来适配屏幕,引擎内部会根据屏幕大小来设置meta的viewport值,会达到更好的屏幕适配效果。
2.针对手机浏览器和PC浏览器启用不同的分辨率适配策略。
3.预加载图片声音等资源。 cc.LoaderScene.preload会生成一个“加载中 x%”的界面,等待资源加载结束后,调用第二个参数传入的匿名函数。 对于基于html的游戏,页面是放在服务器端供浏览器下载的,为了获得流畅的用户体验,cc.LoaderScene.preload让浏览器先把远程服务器的资源缓存到本地。需要预加载的资源定义在src/Resources.js文件中。
4.启动游戏的第一个场景。
主界面分为2个部分,第一个部分是不随着屏幕移动而移动的向上箭头和音乐按钮,第二个部分是根据用户滑动屏幕而改变的场景。
我们先根据需要,构建出需要的函数,并一一实现他,这里我们使用cc.Scene.extend()来扩展出一个scene,并在这个scene中构建出我们需要功能,并一一实现他。
由引擎提供的cc.Scene.extend方法,让js能实现高级面向对象语言的继承特性。 onEnter方法是场景初始化完成即将展示的消息回调,在onEnter中必须调用this._super();来确保Scene被正确的初始化。
用于初始化UI的函数 initUI()
用于初始化touch事件的函数 initTouch()。
用于切换页面的函数changePage()和记录当前页面的参数currentIndex
用于控制箭头显示隐藏的函数toggleArrow()
用于控制音乐按钮回调的函数
var MainScene = cc.Scene.extend({ listener: null, accelListener: null, currentIndex: 0, sceneList: [], ctor: function () { this._super(); cc.spriteFrameCache.addSpriteFrames(res.firstPage_plist); }, onEnter: function () { this._super(); this.initUI(); this.addTouch(); }, initUI: function () { }, toggleMusicCallback: function (sender) { }, togleArrow: function (status) { }, addTouch: function () { }, changePage: function (index, next) { } });
接下来我们一一来实现。
首先,我们来实现音乐按钮与箭头,我们在initUI()中添加如下代码。
var bg = new cc.Sprite(res.background_png); bg.anchorX = 0; bg.anchorY = 0; bg.scaleX = cc.winSize.width / bg.width; bg.scaleY = cc.winSize.height / bg.height; this.addChild(bg, 0); this.arrow = new cc.Sprite("#arrow.png"); this.arrow.setPosition(cc.pAdd(cc.visibleRect.bottom, cc.p(0, 50))); var posY = this.arrow.y; var arrowAction = cc.repeatForever(cc.sequence(cc.spawn(cc.moveTo(0.8, cc.p(this.arrow.x, posY + 30)).easing(cc.easeIn(0.5)), cc.fadeOut(1)), cc.delayTime(0.8), cc.callFunc(function () { this.arrow.y = this.arrow.y - 30; this.arrow.opacity = 255; }, this))); this.arrow.runAction(arrowAction); this.addChild(this.arrow, 1); this.menuItemToggle = new cc.MenuItemToggle(new cc.MenuItemImage("#music.png"), new cc.MenuItemImage("#music_sel.png"), this.toggleMusicCallback, this); this.menuItemToggle.setPosition(cc.pAdd(cc.visibleRect.right, cc.p(-this.menuItemToggle.width / 2 - 30, 140))); var togglemenu = new cc.Menu(this.menuItemToggle); togglemenu.anchorX = 0; togglemenu.anchorY = 0; togglemenu.x = 0; togglemenu.y = 0; this.addChild(togglemenu, 1);
我们在屏幕中,添加了一个背景的sprite,并且,将这个背景进行缩放,以让其在各种情况下都布满屏幕,并且我们为箭头设置了一系列动画,让其能够循环播放,Cocos2d-JS,为了方便广大开发者,提供了丰富多彩的动画(actions)。下面,我们先简单的介绍一下几个常用的action的API。
cc.repeatForever(action) 无限循环某个action
cc.sequence(action1,action2,...)顺序执行括号里面的action
cc.spawn(action1,action2,...)同时执行括号里面的action
cc.moveTo(ration,targetPoint)从当前位置在ration(秒)时间内移动到点targetPosition的action
cc.easeIn(rate) 以rate为ease参数执行easeIn的action,一般是这样使用的action.easing(cc.easeIn(rate))
fadeOut(ration) 在ration时间内从屏幕淡出的action
cc.delayTime(ration) 延时ration时间的action,通常用于等待一段时间后再播放某个action
cc.callFunc(function) 用于执行action的回调,通常在某个action结束后需要执行某段函数的话,可以使用它。
通过上述的简单介绍,是不是对action有了一个初步的了解了呢,我们实际来操作一下:
我们需要一个箭头,往上走并慢慢减速和透明,最终消失,然后在原来的位置出现重复下去,所以我们可以归纳为,移动+淡出-->回到初始位置-->移动+淡出。这样我们很清晰就归纳出如何去写这个action了,我们使用cc.spawn(cc.moveTo(),cc.fadeOut())就构建出了移动+淡出这个效果,然后使用cc.callFunc()设置了这次action播放完毕要修改的位置回到初始位置,接着我们使用cc.sequence()来顺序执行这两个action,这样一来,一次action就编写完成了,最后我们只需要将这个action使用cc.repeatForever()就完成了我们需要的重复播放。
细心的读者可能会问了,代码中的位置设置,为什么是cc.pAdd(cc.visibleRect.right,cc.p())?这是cocos为了让大家更方便的做屏幕适配所定义的9个点,这9个点会根据不同屏幕大小来动态设定,例如cc.visibleRect.center,这个点的位置,无论在什么分辨率的屏幕下,都是在屏幕的正中央,这样我们就可以根据这个点的位置来做相对布局,已达到适配屏幕的目的,例如上面的代码this.arrow.setPosition(cc.pAdd(cc.visibleRect.bottom, cc.p(0, 50)));就是将arrow这个sprite,放在屏幕的底部的正中央,然后再在y轴上加50个像素,这样,无论屏幕的大小,都能保持在屏幕的底部的正中央向上50个像素。这也是我们做相对布局的基础。后续的布局,我们都会根据这些点的坐标来设置。
F. 图片懒加载和预加载
懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式 。用户滚动到它们之前,可视区域外的图像不会加载。这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快。在某些情况下,它还可以帮助减少服务器负载。常适用图片很多,页面很长的电商网站场景中。
首先将页面上的图片的 src 属性设为空字符串,而图片的真实路径则设置在data-original属性中, 当页面滚动的时候需要去监听scroll事件,在scroll事件的回调中,判断我们的懒加载的图片是否进入可视区域,如果图渗配片在可视区内将图片的 src 属性设置为data-original 的值,这样就可以实现延迟加载。
资源预加载是另一个性能优化技术,我们可以使用该技芦贺术来预先告知浏览器某些资源可能在将来会被使用到。 预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源 。
在网页全部加载之前,对一些主要内容进行加载,以提供给用户更好的体验,减少等待的时间。否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,直到所有内容加载完毕。
<img src="http://pic26.nipic.com/20121213/6168183 0044449030002.jpg" style="display:none"/>
<script src="./myPreload.js"></script>
PreloadJS提丛哗指供了一种预加载内容的一致方式,以便在HTML应用程序中使用。预加载可以使用HTML标签以及XHR来完成。默认情况下,PreloadJS会尝试使用XHR加载内容,因为它提供了对进度和完成事件的更好支持,但是由于跨域问题,使用基于标记的加载可能更好。
两者都是提高页面性能有效的办法, 两者主要区别是一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力
转: https://juejin.cn/post/6844903614138286094
G. cocos2d-js怎么使用webgl
您好,使用Cocos2d-js来使用WebGL是一个很有用的技术,它可以帮助您创建出令人惊叹的2D和3D图形。Cocos2d-js是一个开源的游戏引擎,它可以让您创建出令人惊叹的2D和3D图胡贺含形,并且可以在多种平台上运行,包括移动设备和桌面计算机。使用Cocos2d-js可以让您利用WebGL来创建出更加逼真的3D图形,这些图形可以用来创建出真实的环境,游戏,动画,以及其他视觉效果。Cocos2d-js还可以用来创建出更加复杂的游戏,因为它可以支持多种类型的游戏,包括动作游戏,角色扮演游戏,策略游戏,以及虚拟现实游戏。使用Cocos2d-js可以让您利用WebGL来创建出更加逼真的3D图形,这些图形可以用来创建出真实的环境,游戏,动画,以及其他视觉效果。Cocos2d-js还可以用来创建出更加复杂的游戏,因为它可以支持多种类型的游戏,包括动作游戏,角色扮演游戏,策略游戏,以及虚拟现实游戏。此外,Cocos2d-js还可以支持多种类型的输入设备,包括键盘,鼠标,游戏手柄,触摸屏,以及其他输入设备拍绝。使用Cocos2d-js可以让您创建出令人惊叹的2D和3D图形,并且可以在多种平台上运行,包括移动设备和桌面计算机。总之,使用Cocos2d-js来使用WebGL是一个裤笑很有用的技术,它可以帮助您创建出令人惊叹的2D和3D图形,并且可以在多种平台上运行,包括移动设备和桌面计算机。
H. 使用什么工具或者IDE开发Cocos2d-js游戏
1、如果是纯web,那么还是推荐webstorm,这个工具超级强大。
2、如果是JSB,选择Cocos code ide,比较强大。
3、目前cocos code ide也不断的在完善web方面上的丛念运辩郑扰行和携旦调试。
I. 教你 Js / import 如何实现 懒加载 和 预加载
在项目中引入 js 文件一般是如下这种模式皮陆:
懒加载:
当御握猜文件被需要时才被加载即 执行fn()时,多次执镇型行fn()只会加载一次js文件
预加载:
文件会在浏览器空闲的时候提前加载,有兼容性问题需慎用
J. cocos2d-js报错怎么解决
cocos2d-x游戏开发旦弯之c++,js互相调用错误枯掘记没迟核录
多类型多参数传递时
错误:
if (argc > 0) {
jsval obj;
int roleId;
int nInterval;
int nlineId;
jsval jsRet;
JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "v", &obj);
JS_ValueToInt32(cx,obj,&roleId);
JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp+1), "v", &obj);
JS_ValueToInt32(cx,obj,&nInterval);
JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp+2), "v", &obj);
JS_ValueToInt32(cx,obj,&nlineId);
int createRoleId = CCGlobalJsp::CreateRole(roleId,nlineId,(float)nInterval);
CCLog("createRoleId = %d",createRoleId);
jsRet = int32_to_jsval(cx,createRoleId);
JS_SET_RVAL(cx,vp,jsRet);
}