Crafty.c()
public void Crafty.c(String name, Object component)
- name
组件名称
- component
包含组件属性和方法的对象
创建一个组件,其中第一个参数是id,第二个参数是将由实体继承的对象。
具体而言,每次将组件添加到实体时,组件属性都会复制到实体上。
- 这时原始数据类型(booleans, numbers, strings)的属性采用值拷贝。
- 这时复杂数据类型(objects,arrays,functions)的属性拷贝指向原始组件属性的引用。
- (请参阅下方进一步解释的两个事例)
注意,当组件的方法被调用时
this
关键字指向组件添加到的当前实体。
少数方法和属性可以使用特殊的方式指定,它们在特殊的上下文里被调用,(在它们的上下文里)并且不能被其他的组件覆盖。
required
: 所需组件的字符串列表,它们将会在init()
方法运行之前被添加。init
: 当组件添加到实体后将会被执行的函数remove
: 在组件被移除或实体被销毁之前调用的函数。它传递一个布尔参数,如果实体被销毁,它的值为true
。events
: 其属性表示绑定到与属性名等效的事件的函数的对象。(见下面的例子)绑定在调用init
之后直接发生,在remove
调用前被直接删除。
除了这些硬编码的特殊方法,编写组件还有一些其他的约定:
- 以下划线开头的属性或方法被认为是私有的。
- 一个与组件同名的方法被认为是一个构造函数,通常需要在每个实体基础上向组件传递配置数据时使用。
例子
Crafty.c("Annoying", {
_message: "HiHi",
init: function() {
this.bind("EnterFrame", function() { alert(this.message); });
},
annoying: function(message) { this.message = message; }
});
Crafty.e("Annoying").annoying("I'm an orange...");
使用 events
属性的方式代替添加 "EnterFrame" 事件:
Crafty.c("Annoying", {
_message: "HiHi",
events: {
"EnterFrame": function(){alert(this.message);}
}
annoying: function(message) { this.message = message; }
});
注意
在上边的例子中,字段 _message是实体的本地属性。这意味着,如果你创建了很多实体,它们都具有这个属性并且可以有不同的值,因为它是一个简单类型,而简单类型是按值拷贝的。如果这个字段是一个对象或数组,它将在所有实体间共享,因为在javascript中复杂类型是按引用拷贝的。这可能不是你想要的,下边的例子将进行演示。
Crafty.c("MyComponent", {
_iAmShared: { a: 3, b: 4 },
init: function() {
this._iAmNotShared = { a: 3, b: 4 };
},
});