// 正确写法,最开始的时候是直接写的module.export = cc.Class(...),这种我实验的时候是会出错的
// re_public.js
var re_public = cc.Class(
{
pring:function()
{
cc.log('print');
}
});
module.export = re_public;
// 调用时
var re_public = require('re_public');
// 下面这段代码一直在报 ' 错误,x为空 ',起初我一直以为是x这个变量的问题
// 因为log打印的行号是最后一行,也就是那个 )} ,最后一行行的删,发现cc.v2没有x这个变量 ......,
// 我当时这个心情啊,以此铭记 如果要初始化,最好使用cc.vec2 这个有相应变量的,f12
cc.Class({
extends:cc.Component,
properties:{
speed :0,
offset : cc.v2
},
onLoad:function(){
this.offset= cc.v2(this.node.width,this.node.height);
},
update : function(){
var x = this.nodeSize.x;
if(x > 50)
{
cc.log('print');
}
}
)}
Uncaught ReferenceError: frame is not defined(我重现了一下,不过记得报的好像不是这个错)
start:function()
{
var self = this;
cc.loader.load('https://profile.csdnimg.cn/5/D/7/1_magic_code_',function(err,texture)
{
if(err)
{
console.log('Image Load Failed! Url->','https://profile.csdnimg.cn/5/D/7/1_magic_code_',' Error Info->',err);
}
// 如果不写new SpriteFrame()这一句,而是直接xxx.spriteFrame = texture;就会出现上面那个错误,
// 估计,应该是因为下载的数据为一个流格式,也就是Object,所以需要转一下数据
// 下面是new SpriteFrame 跳转到的函数原型
//constructor(filename?: string|Texture2D, rect?: Rect, rotated?: boolean, offset?: Vec2, originalSize?: Size);
//let frame = new cc.SpriteFrame(texture);
self.node.getComponent(cc.Sprite).spriteFrame = frame;
});
}
遇到一个问题,我写了一个基类,然后import导入,继承之后在子类里面写update之后,
爆出了一个非常奇怪的BUG,Creator的报错机制大家都了解,我这里报错的位置是一个大括号。。。
???非常奇怪,于是一行行的删除,之后定位到是update(dt)这个位置,反复检查之后,发现根本没有任何问题,
因为父类里面的代码是经过单独测试的,而子类里面除了有方法,其他的实现都被删除了,然而还是会报错
当时就在想,JS里面到底有没有重写或是base.XXX()这种写法,
测试,删除了父类的Update函数,编译运行,无异常。。。???,骚啊,还有这种操作,这种报错
不一行行删除谁能想的到啊。。。但是此时又出现了一个问题,我父类需要使用update实现一些方法,子类同样要有扩展方
法,但是update又不能同时出现在两个类里面,这种实现如果是放在C#里面,我们的第一想法肯定是delegate,但是JS里面
根本没有这种东西(没搜到)呀,绞尽脑汁,突然想起来官网文档里面好像有一些东西可以帮助我去实现这种写法
/// 父类实现,假设父类js文件名为PersonBase.js
cc.Class({
extends:cc.Component,
properties:
{
m_OnUpdate:[], // 如果子类需要用到update则添加str到本数组中
m_IsStartMonitor:0
},
Initial:function(){
this.m_OnUpdate = [];
this.m_OnUpdate.push('ParentUpdate');
this.node.on('ParentUpdate',function(dt)
{
console.log('父类Update , DeltaTimer -> ' + dt);
});
},
update:function()
{
if(this.m_IsStartMonitor != 0)
{
for(var i = 0;i < his.m_OnUpdate.length;i++)
{
this.node.emit(this.m_OnUpdate[i],dt);
}
}
}
});
---------------------------------------------------------------------------------------------
/// 子类实现
import PersonBase from 'PersonBase'
cc.Class({
extends:PersonBase,
//properties:{}
start:function()
{
this.Initial();
this.m_OnUpdate.push('ChildUpdate');
this.node.on('ChildUpdate',function(dt){
cc.log('子类Update , DeltaTimer -> ' + dt);
});
this.m_IsStartMonitor = 1; // 开启监听
},
});
在C#,一般我们希望删除某个元素的时候,都会直接调用Remove(i or key)这个方法,但是js里面的所有变量都是
Object,姑且不提有没有这个方法,就算有,我们在删除的时候也有很大可能因为object类型出现一些错误,
那么能不能直接 == null,我实验了一下,这个方法是可以使用的,但是如果你 for(key in dict) 时,对应元素索引
的位置会是一个undenfined,如果我们采用这种的话,那么假设,我们需要不断的去更新一个数组里面的一些数据,
那么伴随着游戏的运行,这个里面占用的内存也会越来越大,这显然不是我们所希望的,
话说,我们上面用到了push,那么应该也有一个对应的pop啊,对,没错,但是pop是弹出最后一个元素,而我们希望的是
我们去判断删除哪一个元素,而不是全看运气,联想一下,push pop都有了,那么对应的一些其他元素也有可能出现,比如
delete。。。
嗯~~,删除也有,但是在删除数组时是直接把数组的对应索引归空(蛮正常),只有在删除字典的key值时才会把
对应元素删除
/// 字典删除,数组不归空直接更新的话,估计是要自己写,但是涉及到大量的数据更新,手动更新肯定是不科学的
/// 所以这里用的是字典
cc.Class({
extends:cc.Component,
properties:{
m_EnentDict:[],
},
start: function () {
this.SetPosi(cc.v2(-200, 0));
this.m_EnentDict= {
1:'1',
2:'2',
3:'3',
4:'6',
5:'12'
};
this.m_EnentDict[6] = '63';
for (var i in this.m_EnentDict) {
cc.log(this.m_EnentDict[i]);
}
delete this.m_EnentDict[3];
for (var i in this.m_EnentDict) {
cc.log(this.m_EnentDict[i]);
}
/// 最终迭代次数和我们预想的一致,而不是顺带把null,underfined一起输出
},
});
。。。日后遇到在加吧