关于实体

实体是你游戏中的一些 事物 。如果这听起来很模糊,那是因为实际上任何东西都可能是一个实体 —— 玩家,敌人,投射物,高分计数器,或者菜单项。

实体使用组件创建,你可以把它们看做一组功能。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)

我们传递 falseremoveComponent() 方法,因为我们想移除与组件相关的所有属性和方法。

检查一个实体是否有特定的组件,你可以使用 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();