设为首页收藏本站喵玉殿官方微博

喵玉殿论坛 · 喵玉汉化组

 找回密码
 少女注册中
搜索
查看: 3727|回复: 11

[编程算法] cocos creator 笔记——做一个弹幕游戏

[复制链接]
发表于 2016-11-16 16:08:17 | 显示全部楼层 |阅读模式
本帖最后由 flakedzz 于 2016-11-17 16:27 编辑

才开始接触ccc,前几天囫囵的看了一遍文档,又把文档自带的游戏做了一下。
这几天在考虑做循环滚动的2D背景
想法:ABC三个图片,游戏窗口显示中间,三张图片依次向下匀速滚动,当图片接触到特定坐标的时候,将图片坐标改变。
三张图片的运动类似:ABC→CAB→BCA→ABC(重复)
代码已经写出来了,把图片做成了Prefab,似乎不做成Prefab直接在场景中摆上去也可以,效果不太理想,图片与图片之间偶尔会有重叠或者空隙
猜想应该是向下运动的时候不一定会正好接触到特定坐标。
图片上挂的脚本如下
  1. cc.Class({
  2.     extends: cc.Component,

  3.     properties: {
  4.         // foo: {
  5.         //    default: null,      // The default value will be used only when the component attaching
  6.         //                           to a node for the first time
  7.         //    url: cc.Texture2D,  // optional, default is typeof default
  8.         //    serializable: true, // optional, default is true
  9.         //    visible: true,      // optional, default is true
  10.         //    displayName: 'Foo', // optional
  11.         //    readonly: false,    // optional, default is false
  12.         // },
  13.         // ...
  14.         moveSpeed:0
  15.     },

  16.     // use this for initialization
  17.     onLoad: function () {
  18.       

  19.     },
  20.     // getPos:function(){
  21.     //     this.posX=this.picScoller.node.width;
  22.     //     this.posY=this.picScoller.node.height;
  23.     //     var moveAction=this.scollPic();
  24.     //     this.node.runAction(moveAction);

  25.         
  26.     //     //this.node.destroy();
  27.     // },
  28.     // scollPic:function(){
  29.     //     var moveDown=cc.moveBy(0.5,cc.p(this.posX*0,-this.posY*2));
  30.         
  31.     //     var moveUp=cc.moveBy(0.5,cc.p(this.posX*0,this.posY*2));
  32.     //     return cc.repeatForever(cc.sequence(moveDown, moveUp));
  33.     // },
  34.    
  35.     moveDown:function(dt){
  36.         this.node.y -= this.moveSpeed * dt;
  37.     },

  38.     // called every frame, uncomment this function to activate update callback
  39.      update: function (dt) {
  40.         //背景向下滚动
  41.         if(this.node.y<=-this.picScoller.posY)
  42.             this.node.y=this.picScoller.posY;
  43.         this.moveDown(dt);
  44.      },
  45. });
复制代码
注释掉的就别看了,失败的尝试。

接下来想试试直接在scene里放置结点看看效果,也许会解决重叠和空隙的问题。(重叠和空隙也可能不是代码问题,说不定我手残坐标选的不对?)

------------------
解决了,问题大概也能想到,
  1. if(this.node.y<=-this.picScoller.posY)
  2.             this.node.y=this.picScoller.posY;
复制代码
之前是当坐标小于blabla的时候直接给这个结点的坐标赋值
如果这个坐标等于blabla的话,这样是没问题的
但是update并不能保证每一个像素都经过
所以很大概率是小于这个坐标而不是等于
修改之后的代码
  1. if(this.node.y<=-960)
  2.             this.node.y+=1280;
复制代码
640是默认分辨率的宽度
1280正好可以把最下面的图片提到最上面
目前分辨率是写死的,如果做自动适应的话需要在Canvas下挂一个读当前分辨率的脚本来知道应该+多少像素,懒,以后再写这个。
---------------------------------------然后……试着写一下控制角色移动,再然后试着做一下敌机,再再然后是敌机factory。(饭要一口一口吃
似乎一个STG的原型就出来了

2016年11月16日21:53:18
好的,现在把角色移动给写出来了。
现在的想法是做一个能够8方向移动的角色就好(键盘操控,暂时不想加手柄输入)
在角色结点添加一个监听器监听键盘输入(keyUp&keyDown)
当监听到keyDown的时候判断是哪个键,如果是w按下,就把角色的spriteFrame(可以理解成显示的图片)变更为正常状态,然后把runToUp赋值为真
以此类推,把wasd四个按键的按下事件都做好。
keyUp就是把四个控制方向的布尔型变量按照对应方向赋值为假  (四个变量 runToUp,runToDown,runToLeft,runToRight)
然后在update函数里通过这四个变量的真假来控制角色移动的方向
代码如下:
  1. cc.Class({
  2.     extends: cc.Component,

  3.     properties: {
  4.         // foo: {
  5.         //    default: null,      // The default value will be used only when the component attaching
  6.         //                           to a node for the first time
  7.         //    url: cc.Texture2D,  // optional, default is typeof default
  8.         //    serializable: true, // optional, default is true
  9.         //    visible: true,      // optional, default is true
  10.         //    displayName: 'Foo', // optional
  11.         //    readonly: false,    // optional, default is false
  12.         // },
  13.         // ...
  14.         idle:{
  15.             default:null,
  16.             type:cc.SpriteFrame
  17.         },
  18.         left:{
  19.             default:null,
  20.             type:cc.SpriteFrame
  21.         },
  22.         right:{
  23.             default:null,
  24.             type:cc.SpriteFrame
  25.         },
  26.         moveSpeed:0,
  27.     },

  28.     // use this for initialization
  29.     onLoad: function () {
  30.         this.sprite=this.getComponent(cc.Sprite);
  31.         //sprite.spriteFrame.setTexture(cc.url.raw('ninganyi.jpg'));
  32.         this.setInputControl();
  33.     },
  34.    
  35.     setInputControl:function(){
  36.         cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN,
  37.         this.onKeyDown, this);
  38.         cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP,
  39.         this.onKeyUp, this);
  40.     },
  41.     onKeyDown:function(event){
  42.         //self=this;
  43.         //  switch(event.keyCode){
  44.         //             case cc.KEY.a:
  45.         //                 this.sprite.spriteFrame=this.left;
  46.         //                 this.enabled=false;
  47.         //                 this.enabled=true;
  48.         //                 this.runToLeft=true;
  49.         //                 break;
  50.         //             case cc.KEY.d:
  51.         //                 this.sprite.spriteFrame=this.right;
  52.         //                 this.enabled=false;
  53.         //                 this.enabled=true;
  54.         //                 this.runToRight=true;
  55.         //                 break;
  56.         //             case cc.KEY.w:
  57.         //                 this.sprite.spriteFrame=this.idle;
  58.         //                 this.enabled=false;
  59.         //                 this.enabled=true;
  60.         //                 this.runToUp=true;
  61.         //                 break;
  62.         //             case cc.KEY.s:
  63.         //                 this.sprite.spriteFrame=this.idle;
  64.         //                 this.enabled=false;
  65.         //                 this.enabled=true;
  66.         //                 this.runToDown=true;
  67.         //                 break;
  68.         //         }

  69.         if(event.keyCode==cc.KEY.a){
  70.              this.sprite.spriteFrame=this.left;
  71.              this.enabled=false;
  72.              this.enabled=true;
  73.              this.runToLeft=true;
  74.         }
  75.         if(event.keyCode==cc.KEY.d){
  76.              this.sprite.spriteFrame=this.right;
  77.              this.enabled=false;
  78.              this.enabled=true;
  79.              this.runToRight=true;
  80.         }
  81.         if(event.keyCode==cc.KEY.w){
  82.              this.sprite.spriteFrame=this.idle;
  83.              this.enabled=false;
  84.              this.enabled=true;
  85.              this.runToUp=true;
  86.         }
  87.         if(event.keyCode==cc.KEY.s){
  88.              this.sprite.spriteFrame=this.left;
  89.              this.enabled=false;
  90.              this.enabled=true;
  91.              this.runToDown=true;
  92.         }
  93.     },
  94.     onKeyUp:function(event){
  95.          
  96.         //  switch(event.keyCode){
  97.         //             case cc.KEY.a:
  98.         //                 this.sprite.spriteFrame=this.idle;
  99.         //                 this.enabled=false;
  100.         //                 this.enabled=true;
  101.         //                 this.runToLeft=false;
  102.         //                 break;
  103.         //             case cc.KEY.d:
  104.         //                 this.sprite.spriteFrame=this.idle;
  105.         //                 this.enabled=false;
  106.         //                 this.enabled=true;
  107.         //                 this.runToRight=false;
  108.         //             case cc.KEY.w:
  109.         //                 this.runToUp=false;
  110.         //             case cc.KEY.s:
  111.         //                 this.runToDown=false;
  112.         //         }

  113.         if(event.keyCode==cc.KEY.a){
  114.             this.sprite.spriteFrame=this.idle;
  115.             this.enabled=false;
  116.             this.enabled=true;
  117.             this.runToLeft=false;
  118.         }
  119.         if(event.keyCode==cc.KEY.d){
  120.             this.sprite.spriteFrame=this.idle;
  121.             this.enabled=false;
  122.             this.enabled=true;
  123.             this.runToRight=false;
  124.         }
  125.         if(event.keyCode==cc.KEY.w){
  126.             this.runToUp=false;
  127.         }
  128.         if(event.keyCode==cc.KEY.s){
  129.             this.runToDown=false;
  130.         }
  131.     },
  132.     // setInputControl:function(){
  133.     //     var self=this;
  134.     //     cc.eventManager.addListener({
  135.     //         event:cc.EventListener.KEYBOARD,
  136.     //         onKeyPressed:function(keyCode,event){
  137.     //             switch(keyCode){
  138.     //                 case cc.KEY.a:
  139.     //                     self.sprite.spriteFrame=self.left;
  140.     //                     self.enabled=false;
  141.     //                     self.enabled=true;
  142.     //                     self.runToLeft=true;
  143.     //                     break;
  144.     //                 case cc.KEY.d:
  145.     //                     self.sprite.spriteFrame=self.right;
  146.     //                     self.enabled=false;
  147.     //                     self.enabled=true;
  148.     //                     self.runToRight=true;
  149.     //                     break;
  150.     //                 case cc.KEY.w:
  151.     //                     self.sprite.spriteFrame=self.idle;
  152.     //                     self.enabled=false;
  153.     //                     self.enabled=true;
  154.     //                     self.runToUp=true;
  155.     //                     break;
  156.     //                 case cc.KEY.s:
  157.     //                     self.sprite.spriteFrame=self.idle;
  158.     //                     self.enabled=false;
  159.     //                     self.enabled=true;
  160.     //                     self.runToDown=true;
  161.     //                     break;
  162.     //             }
  163.     //         },
  164.     //         onKeyReleased:function(keyCode,event){
  165.     //             switch(keyCode){
  166.     //                 case cc.KEY.a:
  167.     //                     self.runToLeft=false;
  168.     //                     break;
  169.     //                 case cc.KEY.d:
  170.     //                     self.runToRight=false;
  171.     //                 case cc.KEY.w:
  172.     //                     self.runToUp=false;
  173.     //                 case cc.KEY.s:
  174.     //                     self.runToDown=false;
  175.     //             }
  176.     //         }
  177.     //     },self.node);
  178.     // },
  179.     // called every frame, uncomment this function to activate update callback
  180.      update: function (dt) {
  181.         //  this.SpriteFrame=this.left;
  182.         if(this.runToLeft){
  183.             this.node.x -=this.moveSpeed*dt;
  184.         }
  185.         if(this.runToRight){
  186.             this.node.x+=this.moveSpeed*dt;
  187.         }
  188.         if(this.runToUp){
  189.             this.node.y+=this.moveSpeed*dt;
  190.         }
  191.         if(this.runToDown){
  192.             this.node.y-=this.moveSpeed*dt;
  193.         }
  194.      },
  195. });
复制代码
同样的,注释掉的不用看,是另一种尝试,不过效果不太好。(才发现,代码缩进怎么没了?
这里着重讲一下下面这段代码:
  1. this.sprite=this.getComponent(cc.Sprite);
  2. this.sprite.spriteFrame=this.idle;
  3. this.enabled=false;
  4. this.enabled=true;
复制代码
一行一行解读:
获取当前结点的Sprite类型的组件,赋值给全局变量sprite
将idle赋值给sprite的spriteFrame属性(idle是spriteFrame类型,可以看上面那段代码的properties区域
禁用当前结点
启用当前结点
我之前在替换精灵的图片的时候只写了前两行,没有效果。
加上后面两行之后效果正常,我也不太懂这是为什么,如果有谁知道请务必给我讲解一下。猜测是更换图片之后需要刷新一下?而后两行代码起到了刷新的作用?
顺便附上用到的角色图片
是从rpgmaker里截出来的

用到的角色图片

用到的角色图片


角色的移动大概就这样了。之后试着做一下敌机和自机的攻击。
---------------------------------
2016年11月17日14:59:55
感觉弹幕游戏中,向左向右移动的时候角色脸也跟着变好像有点奇怪,先不改了,等代码写完再说素材的事。
顺便加了慢速移动的代码,按住shift的时候移动速度降低50%,松开恢复。
代码很简单,不贴了
从文档里找到了KEY的枚举值,把wasd换成了上下左右,更正常了。
下面是目前进度
演示.jpg

右侧黑条预计用来做计分板,现在还没开工。
左侧的滚动图片是自己用PS做的
用起来效果还可以
------------------------------------------
2016年11月17日15:09:48
接下来准备做自机的武器,还在考虑要怎么升级。要不先做敌机?(好的)
好了,敌人画好了。
这是敌人.png
……………
至少大家知道它是敌人了,对吧------------------------------
2016年11月17日16:26:31
设置好了碰撞体还有碰撞分组,边界处理还是没做,懒癌发作,休息一会儿

------------------------------
 楼主| 发表于 2016-11-18 21:07:14 | 显示全部楼层
本帖最后由 flakedzz 于 2016-11-19 18:03 编辑

2016年11月18日21:07:12
今天感冒了,一行没写,罪过2016年11月19日17:59:58
休息了快两天,继续做。
先来想一下敌机自机的武器和自机武器的升级
击毁一架敌机掉落P点?
直接得分的话感觉太容易了一点,做个击毁敌机会掉落P点的小功能好了。
当敌机被击毁,会在一定范围内随机选取几个坐标生成P点对象。
和自机接触后自机获得得分。
这个放后面做。

那先做自机的弹幕好了。
把得分暴露出来,用来在没有收集P点的时候可以手动调整数值来测试弹幕的武器等级。


回复 支持 反对

使用道具 举报

发表于 2016-11-22 19:27:36 | 显示全部楼层
ccc这引擎的界面和东方正作的好像啊

最近看了一篇基于unity2d的制作打飞机教程,挺有趣
http://space.bilibili.com/32264724/#!/video/0//1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-22 20:03:55 | 显示全部楼层
坡忒头 发表于 2016-11-22 19:27
ccc这引擎的界面和东方正作的好像啊

最近看了一篇基于unity2d的制作打飞机教程,挺有趣

之前做过unity的,但是感觉太臃肿,这次顺便学学ccc怎么用,就用这个做了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-26 19:54:29 | 显示全部楼层
2016年11月26日19:44:22
摸了几天鱼,今天着手写了自机弹幕的发射。
大概思路如下:
创建一个精灵节点,调整好材质之后,挂上去一个让它自动向前移动和在几秒后销毁的脚本。然后把这个精灵节点设置成Prefab
然后在触发按键事件之后按照一定速率重复生成该Prefab。【注意:这种方式有重大缺陷,重复的创建销毁对象,对性能的影响非常大。这里只做演示,完成后会改成用数组存储弹幕缓存的方式来进行优化】要注意的是,生成新的对象Prefab之后,将其加入到角色的子节点。这样设置坐标的时候就可以以角色本身的坐标系来进行。

这样就完成了子弹的发射。

如果要完成子弹和敌机的碰撞功能,需要在子弹节点和敌机上添加碰撞体。然后将碰撞进行分组。我设置的是playerBullet碰撞enemy。
这样当带有这两个标签的,带有碰撞体的节点相互碰撞,就会触发 onCollisionEnter()onCollisionStay()onCollisionExit()三个方法。
需要注意的是,碰撞管理默认情况下是关闭的,所以需要用代码手动启用。

子弹脚本如下:
  1. cc.Class({
  2.     extends: cc.Component,

  3.     properties: {
  4.         // foo: {
  5.         //    default: null,      // The default value will be used only when the component attaching
  6.         //                           to a node for the first time
  7.         //    url: cc.Texture2D,  // optional, default is typeof default
  8.         //    serializable: true, // optional, default is true
  9.         //    visible: true,      // optional, default is true
  10.         //    displayName: 'Foo', // optional
  11.         //    readonly: false,    // optional, default is false
  12.         // },
  13.         // ...
  14.         shootSpeed:0,
  15.         
  16.     },
  17.     onCollisionEnter: function (other, self) {
  18.         console.log('on collision enter');
  19.         self.node.destroy();
  20.     },
  21.     onCollisionStay: function (other, self) {
  22.         console.log('on collision stay');
  23.     },
  24.     onCollisionExit: function (other, self) {
  25.         console.log('on collision exit');
  26.         
  27.         other.node.destroy();
  28.         
  29.     },
  30.     // use this for initialization
  31.     onLoad: function () {
  32.        this.counter=0;
  33.        var manager = cc.director.getCollisionManager();
  34.        manager.enabled = true;
  35.     },
  36.     move:function(dt){
  37.         this.node.y+=this.shootSpeed*dt;
  38.     },
  39.    
  40.     // called every frame, uncomment this function to activate update callback
  41.     update: function (dt) {
  42.         this.counter++;
  43.             this.move(dt);
  44.         
  45.         //if(this.node.y>this.game.height*0.5||this.node.y<0-game.height*0.5||this.node.x<0-this.game.width*0.5||this.node.x>this.game.width*0.174)
  46.         if(this.counter>=100)   
  47.             this.node.destroy();
  48.     },
  49. });
复制代码


添加了发射功能的角色脚本如下:
  1. cc.Class({
  2.     extends: cc.Component,

  3.     properties: {
  4.         // foo: {
  5.         //    default: null,      // The default value will be used only when the component attaching
  6.         //                           to a node for the first time
  7.         //    url: cc.Texture2D,  // optional, default is typeof default
  8.         //    serializable: true, // optional, default is true
  9.         //    visible: true,      // optional, default is true
  10.         //    displayName: 'Foo', // optional
  11.         //    readonly: false,    // optional, default is false
  12.         // },
  13.         // ...
  14.         idle:{
  15.             default:null,
  16.             type:cc.SpriteFrame
  17.         },
  18.         left:{
  19.             default:null,
  20.             type:cc.SpriteFrame
  21.         },
  22.         right:{
  23.             default:null,
  24.             type:cc.SpriteFrame
  25.         },
  26.         normalBullet:{
  27.             default:null,
  28.             type:cc.Prefab
  29.         },
  30.         game:{
  31.             default:null,
  32.             type:cc.Node
  33.         },
  34.         
  35.         moveSpeed:0,
  36.         fireSpeed:0,//普通攻击速率
  37.         specialBomb:0,//特殊攻击可用次数
  38.         weaponLevel:0,//武器等级

  39.         weaponPosX:0,
  40.         weaponPosY:0,
  41.     },

  42.     // use this for initialization
  43.     onLoad: function () {
  44.         this.counter=0;
  45.         this.sprite=this.getComponent(cc.Sprite);
  46.         this.setInputControl();
  47.         var manager = cc.director.getCollisionManager();
  48.         manager.enabled = true;
  49.     },
  50.    
  51.     cannonControl:function(){//直接在自机前方生成子弹

  52.     },
  53.     setInputControl:function(){
  54.         cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN,
  55.         this.onKeyDown, this);
  56.         cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP,
  57.         this.onKeyUp, this);
  58.     },
  59.     onKeyDown:function(event){
  60.         if(event.keyCode==cc.KEY.z){
  61.             this.cannonFire=true;
  62.         }
  63.       
  64.         if(event.keyCode==cc.KEY.left){
  65.              this.sprite.spriteFrame=this.left;
  66.              this.enabled=false;
  67.              this.enabled=true;
  68.              this.runToLeft=true;
  69.         }
  70.         if(event.keyCode==cc.KEY.right){
  71.              this.sprite.spriteFrame=this.right;
  72.              this.enabled=false;
  73.              this.enabled=true;
  74.              this.runToRight=true;
  75.         }
  76.         if(event.keyCode==cc.KEY.up){
  77.              this.sprite.spriteFrame=this.idle;
  78.              this.enabled=false;
  79.              this.enabled=true;
  80.              this.runToUp=true;
  81.         }
  82.         if(event.keyCode==cc.KEY.down){
  83.              this.sprite.spriteFrame=this.idle;
  84.              this.enabled=false;
  85.              this.enabled=true;
  86.              this.runToDown=true;
  87.         }
  88.         if(event.keyCode==cc.KEY.shift){
  89.             this.moveSpeed=this.moveSpeed*0.5;
  90.         }
  91.         
  92.         
  93.     },
  94.     onKeyUp:function(event){
  95.          


  96.         if(event.keyCode==cc.KEY.left){
  97.             this.sprite.spriteFrame=this.idle;
  98.             this.enabled=false;
  99.             this.enabled=true;
  100.             this.runToLeft=false;
  101.         }
  102.         if(event.keyCode==cc.KEY.right){
  103.             this.sprite.spriteFrame=this.idle;
  104.             this.enabled=false;
  105.             this.enabled=true;
  106.             this.runToRight=false;
  107.         }
  108.         if(event.keyCode==cc.KEY.up){
  109.             this.runToUp=false;
  110.         }
  111.         if(event.keyCode==cc.KEY.down){
  112.             this.runToDown=false;
  113.         }
  114.         if(event.keyCode==cc.KEY.shift){
  115.             this.moveSpeed=this.moveSpeed*2;
  116.         }
  117.         if(event.keyCode==cc.KEY.z){
  118.             this.cannonFire=false;
  119.         }
  120.     },
  121.    
  122.     normalAttackLv1:function(dt){
  123.         
  124.         if(this.counter>=this.fireSpeed){
  125.             var bullet=cc.instantiate(this.normalBullet);
  126.             this.node.addChild(bullet);
  127.             bullet.setPosition(0,0);
  128.             bullet.getComponent("NormalBulletScript").game=this.game;
  129.            
  130.             
  131.             this.counter=0;
  132.         }
  133.         else{
  134.            this.counter++;
  135.         }
  136.         //cc.log(this.node.x+"x"+this.node.y);
  137.     },
  138.     normalAttackLv2:function(dt){

  139.     },
  140.     normalAttackLv3:function(dt){

  141.     },
  142.      boardCheck:function(){
  143.         
  144.         var screenWidth=this.game.width;
  145.         var screenHeight=this.game.height;
  146.         if(this.node.x<0-0.5*screenWidth)
  147.             this.node.x=0-0.5*screenWidth;
  148.         if(this.node.x>0.174*screenWidth)
  149.             this.node.x=0.174*screenWidth;
  150.         if(this.node.y<0-0.5*screenHeight)
  151.             this.node.y=0-0.5*screenHeight;
  152.         if(this.node.y>0.5*screenHeight)
  153.             this.node.y=0.5*screenHeight;
  154.         
  155.     },
  156.     moveControl:function(dt){
  157.         if(this.cannonFire){
  158.             this.normalAttackLv1(dt);
  159.         }
  160.         if(this.runToLeft){
  161.             this.node.x -=this.moveSpeed*dt;
  162.         }
  163.         if(this.runToRight){
  164.             this.node.x+=this.moveSpeed*dt;
  165.         }
  166.         if(this.runToUp){
  167.             this.node.y+=this.moveSpeed*dt;
  168.         }
  169.         if(this.runToDown){
  170.             this.node.y-=this.moveSpeed*dt;
  171.         }
  172.         
  173.     },
  174.     // called every frame, uncomment this function to activate update callback
  175.      update: function (dt) {
  176.          if(this.cannonFire){
  177.              this.normalAttackLv1(dt);
  178.          }
  179.         this.moveControl(dt);
  180.         this.boardCheck();
  181.         
  182.             
  183.      },
  184. });
复制代码
我的命名不规范,还请不要学习我。

如果仔细看代码的话会发现我创建了三个类似的攻击函数,并只实现了一个。
剩下的两个是为了给拾取道具增强火力做出的预留。【并非最终版本,设计随时可能会变更】

接下来要实现至少一种的敌人和敌人的弹幕设计。
敌人和敌人的弹幕设计都做好之后,会进行第一阶段的优化。
将弹幕以及敌人进行缓存处理。
这次更新就到这里。
回复 支持 反对

使用道具 举报

发表于 2016-11-28 15:21:34 来自手机 | 显示全部楼层
一般这种js的大项目我都是建议用TypeScript,有静态类型检查和完整的面向对象,写完以后再转成js(来自: Android客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-28 15:49:41 | 显示全部楼层
tinyAdapter 发表于 2016-11-28 15:21
一般这种js的大项目我都是建议用TypeScript,有静态类型检查和完整的面向对象,写完以后再转成js(

也不算大型了,js没有类是挺困扰,不过ccc用js u3d用C#,已经习惯了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-12 22:22:31 | 显示全部楼层
2016年12月12日22:22:03
A了A了,我要摸鱼去了。更日志哪有摸鱼爽啊。
回复 支持 反对

使用道具 举报

发表于 2017-4-13 16:00:39 | 显示全部楼层
楼楼好厉害……Orz(仰望
回复 支持 反对

使用道具 举报

发表于 2017-4-27 23:31:32 | 显示全部楼层
谢谢dalao
萌新正在努力肝。。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|手机版|小黑屋|无图版|喵玉殿

GMT+8, 2018-7-23 06:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表