这视频是什么游戏或动漫.电影的_百度知道《你是小弟我的小羊驼》游戏ios源码 - 操作系统当前位置:& &&&《你是小弟我的小羊驼》游戏ios源码《你是小弟我的小羊驼》游戏ios源码&&网友分享于:&&浏览:0次《你是我的小羊驼》游戏ios源码
&ignore_js_op&
&ignore_js_op&
&ignore_js_op&
&ignore_js_op&源码下载:
你可能注意到了,神经猫换成了可爱的小羊驼:)在线游戏地址: ...
ge&isappinstalled=0游戏分析三个界面基本上就是整个游戏的全部内容:1.左边的是主界面,展示游戏名称以及主角,让玩家对游戏的整体画风有个大概的印象。2.中间的是游戏界面,点击空格防止橙色六边形砖块来围堵小羊驼。3.右边的是游戏成功或失败的界面。整个游戏的主逻辑都在游戏界面中完成。玩法是这样:1.游戏初始化开始,小羊驼始终是站在地图中间,在地图的其他区域随机生产一些位置随机的砖块。2.玩家点击一个空白区域,放置一个砖块来围堵羊驼。3.羊驼AI寻路移动一步。4.循环2和3,直到羊驼被围堵在一个圈里面(游戏成功),或羊驼到达地图边界(游戏失败)整个游戏的思路理清楚了,接下来我们开始进入编码阶段。开发环境与新建项目本教程开发基于当前最新的Download
下载引擎并解压到磁盘的某个目录。打开控制台,输入下面的命令来新建项目。$cd
cocos2d-js-v3.0-rc1/tools/cocos2d-console/bin $./cocos
js --no- native
MyJSGame/ $../cocos
run -p web 环境搭建并不是这篇文章的重点,更详细的信息可以参考:《搭建
Cocos2d-JS 开发环境》主界面实现游戏的入口代码在main.js中,用编辑器打开并修改为下面的代码。cc.game.onStart
function (){
cc.view.adjustViewPort( true );
(cc.sys.isMobile)
cc.view.setDesignResolutionSize(320,500,cc.ResolutionPolicy.FIXED_WIDTH);
cc.view.setDesignResolutionSize(320,480,cc.ResolutionPolicy.SHOW_ALL);
cc.view.resizeWithBrowserSize( true );
cc.LoaderScene.preload(resources,
gameScene =
GameScene();
cc.director.runScene(gameScene);
this ); };
cc.game.run(); 关键点解析如下:1.设置浏览器meta来适配屏幕,引擎内部会根据屏幕大小来设置meta的viewport值,会达到更好的屏幕适配效果。2.针对手机浏览器和PC浏览器启用不同的分辨率适配策略。3.预加载图片声音等资源。
cc.LoaderScene.preload会生成一个&加载中 x%&的界面,等待资源加载结束后,调用第二个参数传入的匿名函数。
对于基于html的游戏,页面是放在服务器端供浏览器下载的,为了获得流畅的用户体验,cc.LoaderScene.preload让浏览器先把远程服务器的资源缓存到本地。需要预加载的资源定义在src/Resources.js文件中。4.启动游戏的第一个场景。主界面的由两个层实现:1.GameLayer层,游戏主逻辑层,在未初始化地图矩阵时,它只显示背景地图。2.StartUI层,显示logo图片和开始游戏。GameScene的初始化代码如下:var
= cc.Scene.extend({
this ._super();
cc.Sprite(res.bg);
anchorX : 0.5,
anchorY : 0.5,
x : cc.winSize.width/2,
y : cc.winSize.height/2
this .addChild(bg);
layers.game =
GameLayer();
this .addChild(layers.game);
layers.startUI =
StartUI();
this .addChild(layers.startUI);
layers.winUI =
ResultUI( true );
layers.loseUI =
ResultUI( false );
layers.shareUI =
ShareUI();
} }); 由引擎提供的cc.Scene.extend方法,让js能实现高级面向对象语言的继承特性。
onEnter方法是场景初始化完成即将展示的消息回调,在onEnter中必须调用this._super();来确保Scene被正确的初始化。整个游戏的设计只有一个scene,界面之间的切换由layer来实现,这可能不是一个最优的设计,但也提供另一种思路。
为了用layer来实现切换,全局变量layers存储了各层的一个实例。GameLayer我们在下一章节中详细讲解。StartUI的实现如下:var
= cc.Layer.extend({
this ._super();
cc.Sprite(res.start);
start.x = cc.winSize.width/2;
start.y = cc.winSize.height/2 + 20;
this .addChild(start);
this ._super();
cc.eventManager.addListener({
event: cc.EventListener.TOUCH_ALL_AT_ONCE,
onTouchesEnded:
(touches, event) {
touch = touches[0];
pos = touch.getLocation();
(pos.y & cc.winSize.height/3) {
layers.game.initGame();
layers.startUI.removeFromParent();
} }); cc.Layer.extend作用同cc.Scene.extend一样,只不过是一个扩展Scene,一个扩展Layer。ctor是Cocos2d-JS中的构造函数,在ctor中必须调用this._super();以确保正确的初始化。在onEnter中,我们为StartUI层绑定事件***,判断触摸点的位置坐标来触发scene切换。细心的读者可能要问,为什么不用Menu控件?
当前的Cocos2d-JS版本已实现模块化,可以选择只加载游戏中用到的模块,已减少最终打包size。
为了不加入Menu模块,这里使用了最简单的触摸点坐标判断来实现通用的事情。游戏界面的实现橙色块的初始化游戏地图区域是由9*9的六边形方块组成的,首先用InActive的图片初始化一边矩阵。相关代码如下:var
= x = y = 0, odd =
false , block, tex =
this .batch. for
r = 0; r & ROW; r++) {
y = BLOCK_YREGION *
ox = odd * OFFSET_ODD;
c = 0; c & COL; c++) {
x = ox + BLOCK_XREGION *
cc.Sprite(tex, BLOCK2_RECT);
block.attr({
anchorX : 0,
anchorY : 0,
width : BLOCK_W,
height : BLOCK_H
this .batch.addChild(block);
odd = ! } 每次循环odd改变,已实现上下错位的排布。
attr是Node基类的新方法,可以方便的一次性设置多个属性。橙色方块的初始化是由initGame函数来完成。
先来看initGame的实现:initGame
function () {
( this .inited)
this .player_c =
this .player_r = 4;
this .step = 0;
i = 0, l =
this .active_nodes. i & i++) {
this .active_nodes.removeFromParent();
this .active_nodes = [];
r = 0; r & ROW; r++) {
c = 0; c & COL; c++) {
this .active_blocks[r][c] =
this .randomBlocks();
this .player.attr({
anchorX : 0.5,
anchorY : 0,
x : OFFSET_X + BLOCK_XREGION *
this .player_c + BLOCK_W/2,
y : OFFSET_Y + BLOCK_YREGION *
this .player_r - 5
this .player.stopAllActions();
this .player.runAction( this .moving_action);
this .inited = },
详细说明:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有Flash游戏开发系列一:游戏中的敌人1
对于目前的 Flash 来说,开发一些像模像样的游戏并不是什么奇怪的事情了。我这里所涉及到的内容和开发游戏有关,但是都是一些比较基本的知识。如果您是游戏开发方面的高手,那么完全可以忽略我这里所描述的内容。我的计划是要做一系列的教程,这是其中一个系列。 游戏是一个交互作品,简单说,就是通过用户的行为,会对这个作品的进程产生一定的影响。说到游戏,总要提到难度,游戏的难度在于:当你想要达到某种目的的时候,你会发现它的实现多少有些困难,困难越难克服,难度也就越大。不同类型的游戏有不同的难度,以及不同的实现方法。比如:俄罗斯方块通过改变方块下落的速度来改变游戏的难度,空战射击游戏通过不同的敌机以及不同的 Boss 来实现不同的难度。 在这个系列里面,我们想和大家一起研究一下游戏中敌人的运动方式,一点一点来。AS 基础最好是有一些,不然会稍微有些头疼。 一、最直接的跟踪 首先看看这个例子:
假定红色圆圈是玩家,绿色圆圈是敌人,移动你的鼠标,敌人就会跟着你跑。 这就是最简单的跟踪敌人,它的原理是:如果(玩家x坐标 && 敌人x坐标){
调整敌人x坐标,趋近玩家x坐标}如果(玩家y坐标 && 敌人y坐标){
调整敌人y坐标,趋近玩家y坐标} 这应该是极其容易理解的。那么具体的代码实现应该是什么样子的呢? 我们先把两个不同的 MovieClip 放置在舞台上,一个实例名叫做 player,另外一个叫做 enemy。 为了方便,我们仅仅通过鼠标来实现玩家的移动,于是代码就很简单了:player._x = _xmouse-10;player._y = _ymouse-10;updateAfterEvent(); 玩家可以移动了,下面来解决坐标调整的问题。
看上面的图片,不管玩家和敌人处于什么位置,只要不重合,两个角色之间总是具有一定距离的,我们用 dx 和 dy 来代表 x 方向和 y 方向的差值。根据 dx 和 dy,基于敌人靠近玩家的概念,我们就可以得出敌人应该前进的方向。 敌人应该具有一定的速度,根据这个速度向玩家靠近。所以我们可以先定义一个变量来代表敌人的速度:enemySpeed。 根据分析,我们可以得出下面的计算公式:
dx = player._x-enemy._x; dy = player._y-enemy._y; if (Math.abs(dx)&=enemySpeed) {
enemy._x += ((dx&=0) ? enemySpeed : -enemySpeed); } if (Math.abs(dy)&=enemySpeed) {
enemy._y += ((dy&=0) ? enemySpeed : -enemySpeed); } 观察到,我们用了一个 Math.abs(dx)&=enemySpeed 来限制敌人运动,其实也可以不限制,但是那样在敌人速度比较高的时候,就会发生抖动现象。因为这种情况下,敌人的坐标和玩家坐标之间差值小,敌人可能会在逼近过程中不断摇摆。大家可以去掉限制尝试一下。 对于 AS 不太熟悉的,我来解释一下这句: enemy._x += ((dx&=0) ? enemySpeed : -enemySpeed),其实是相当于下面这句: if (dx &= 0){
enemy._x = enemy._x + enemyS } else {
enemy._x = enemy._x - enemyS } 这是用来判断敌人的运动方向的,根据 dx dy 的正负情况,来决定向哪个方向运动。 好,到此为止,我想已经都解释清楚了,下面是完整的第一帧源代码:var enemySpeed:Number = 2;var dx, dy:N/* functions */
tracker = function () { player._x = _xmouse-10; player._y = _ymouse-10; dx = player._x-enemy._x; dy = player._y-enemy._y; if (Math.abs(dx)&=enemySpeed) {
enemy._x += ((dx&=0) ? enemySpeed : -enemySpeed); } if (Math.abs(dy)&=enemySpeed) {
enemy._y += ((dy&=0) ? enemySpeed : -enemySpeed); } updateAfterEvent();};/* run it*/setInterval(tracker, 10); 针对 AS 新手:程序先定义了变量,确定了敌人的运动速度,这个是可以更改的,函数 tracker 则主要用来处理玩家移动以及敌人移动。 updateAfterEvent 是为了保证流畅度设定的,没有也可以。 如果不触发 tracker 函数,那么这个程序是不会跑起来的,所以,我们使用了 setInterval,每隔 10 毫秒触发一次 tracker 函数,这样,程序就正常运行了。 这一次的介绍就到这里了,很简单是不是?下一次我们要给目前的这个敌人增加一些小功能,或者说,限制一下它。
最新五条评论
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为请问这是 什么游戏 或者 电影? 有些网站经常弹出的小广告 视频 什么女神联盟里面的_百度知道