关于实体
实体是你游戏中的一些 事物 。如果这听起来很模糊,那是因为实际上任何东西都可能是一个实体 —— 玩家,敌人,投射物,高分计数器,或者菜单项。
实体使用组件创建,你可以把它们看做一组功能。Crafty 内置了一些组件,你也可以使用 Crafty.c()
自定义组件。
创建实体
你使用 Crafty.e()
创建实体。大多数情况下你需要传递一个用于初始化的组件列表:
var square = Crafty.e("2D, Canvas, Color");
通常,您需要编写更多的代码来实际处理实体,但以上就是创建它所需的全部代码。事实上,您甚至不需要将实体分配给变量,只需调用 Crafty.e
就足够了,以后我们将学习如何在没有直接引用的情况下操作实体。
核心属性和方法
每个实体共享某些属性和方法,即使没有添加任何组件。你可以在文档 Crafty Core 找到相关说明。
组件方法
你可以在实体创建之后 添加 和 移除 组件,因此之前的代码可以这样写:
var square = Crafty.e("2D, Canvas");
square.addComponent("Color");
如果你不希望我们的组件显示为彩色方块,你可以在稍后移除它:
square.removeComponent("Color", false)
我们传递 false
给 removeComponent()
方法,因为我们想移除与组件相关的所有属性和方法。
检查一个实体是否有特定的组件,你可以使用 has()
方法。例如,我们想检查实体是否有 "Explode" 组件:
if (e.has("Explode"))
e.explode();
设置属性
一个组件,例如 2D 可能与实体的某些属性交互。你可以直接设置,或者使用 attr
简写法一次性设置。像这样:
square.x = 5;
square.y = 10;
相当于
square.attr({x:5, y:10})
事件
Crafty 使用全局事件和本地事件来在实体和组件之间进行通信。创建一个事件侦听器,您可以使用 .bind()
方法。让我们来使之前的方块在事件处理中切换颜色。
// Bind a function to the event
square.bind("ChangeColor", function(eventData){
// `this` refers to the entity
this.color(eventData.color);
})
// Trigger that event directly on the entity
square.trigger("ChangeColor", {color:"blue"});
在上面的代码中,我们直接在实体上触发了事件。你也可以在全局触发一个事件,这意味着所有实体都会收到它。事件通常用于组件之间的通信——您可以在组件的文档中找到有关此类事件的信息。
如果一个方法只触发一次,你可以使用 one()
方法替换 bind()
进行事件绑定。移除事件,使用 unbind()
。
关于事件系统的更多讨论可以查看 事件 章节。
销毁
调用实体的 destroy()
方法可以销毁它。
选择实体
当一个实体被创建后,它将获得一个唯一的ID。调用 getId()
方法可以获取这个ID。
如果你知道实体的ID,你可以像这样获取它的引用:
var secondEntity = Crafty(2);
Crafty
即是一个对象也是一个方法。这和 jQuery 的工作机制很像。你可以基于实体拥有的组件一次性选择多个:
// Select all entities with the 2D components
Crafty("2D");
// select all entities with both 2D and DOM
Crafty("2D DOM");
// select entities with either DOM or Canvas
Crafty("DOM, Canvas");
// Select all entities
Crafty("*");
你选择了它们之后,可以直接调用事件相关的方法:
// Bind a function to *every* entity with the Keyboard component
Crafty("Keyboard").bind("KeyDown", function(){
// Do something on keydown
});
// Explode all the things!
Crafty("*").trigger("Explode");
你也可以在每个实体对象上执行方法:
// Move every 2D entity 5 pixels to the right
Crafty("2D").each(function() {
this.x += 5;
});
如果你想知道选择了几个实体,可以检查 length
属性。
你可以调用 get()
获取一个包含所有实体的数组,或者指定位置的某一个实体:
// Get the first Canvas entity
var first_entity = Crafty("Canvas").get(0);
// Get an array of all 2D entities
var array_of_entities = Crafty("2D").get();
// Convert to an array of ids, rather than entities
var array_of_ids = Crafty("2D").toArray();