Rust Vec中的防锈部件<;Box dyn组件特性>&燃气轮机;(ECS)

Rust Vec中的防锈部件<;Box dyn组件特性>&燃气轮机;(ECS),rust,entity-component-system,Rust,Entity Component System,我是Rust语言的初级开发人员。 我来自JavaScript,很多特性和细节我还不清楚 目前,我希望在Rust中构建自己的ECS(实体组件系统)。 当我想从实体中获取组件时,我会被卡住 实际上,我用一个dyn装箱向量将组件存储在实体中,这是一个好方法吗 我的代码: enum组件enum{ 立场,, 大小 } 性状成分{} //位置组件 #[派生(PartialEq、PartialOrd、Debug)] 结构位置{ x:i32, y:i32 } //尺寸分量 #[派生(PartialEq、Part

我是Rust语言的初级开发人员。 我来自JavaScript,很多特性和细节我还不清楚

目前,我希望在Rust中构建自己的ECS(实体组件系统)。 当我想从实体中获取组件时,我会被卡住

实际上,我用一个dyn装箱向量将组件存储在实体中,这是一个好方法吗

我的代码:

enum组件enum{
立场,,
大小
}
性状成分{}
//位置组件
#[派生(PartialEq、PartialOrd、Debug)]
结构位置{
x:i32,
y:i32
}
//尺寸分量
#[派生(PartialEq、PartialOrd、Debug)]
结构大小{
高度:i32,
宽度:i32
}
位置{}的impl组件
大小为{}的impl组件
结构实体{
id:使用,
组成部分:Vec
}
impl实体{
fn新(索引:usize)->Self{
实体{id:index,components:vec![]}
}
//在实体中添加组件
fn添加组件(&mut-self,组件:T)->&mut-self{
让mut entity=self.entities.get_mut(self.current_index.unwrap();
实体。添加_组件(组件);
自己
}
}
fn main(){
让mut es=EntityStore::new();
//制造实体
设mut entity1=es
.create_entity()
.带_分量(位置{x:0,y:0})
.带_组件(尺寸{高度:10,宽度:10})
.end();
//获取实体位置组件
//让component_position_entity1=entity1.get_component(ComponentEnum::position);
}
如何从实体中获取我的位置组件

编辑:

这里是一个获取组件的测试函数(在实体实现中):

fn get_component(&mut self,component_enum:ComponentEnum){//希望返回位置或大小组件
让mut entity_components=&self.components;
//按名称搜索组件?
//目前,我尝试比较组件特性和组件枚举元素。。。
let component=实体\组件
.iter_mut()
.find(| component | component==component_enum)
.unwrap();
//在这里,组件类型是“&mut-Box”,但我想要像“&mut-Position”或“&mut-Size”这样的类型
component//这里我需要返回一个Position或Size结构组件,但是我有组件特性,所以我不能使用Position/Size函数
}

谢谢。

我会使用枚举来区分组件类型(请记住,我对ECS系统的总体经验很少)。然后,您可以通过各种方式获得一种类型,但我已经创建了一个方法
get\u component
,在找到正确的组件时使用闭包。然后,可以向其传递一个闭包,该闭包专门检查位置组件

这是我的实现,基于您的示例:


//位置组件
#[派生(PartialEq、PartialOrd、Debug)]
结构位置{
x:i32,
y:i32
}
//尺寸分量
#[派生(PartialEq、PartialOrd、Debug)]
结构大小{
高度:i32,
宽度:i32
}
#[派生(PartialEq、PartialOrd、Debug)]
枚举组件{
位置(位置),,
尺码(尺码)
}
结构实体{
id:使用,
组成部分:Vec
}
impl实体{
fn新(索引:usize)->Self{
实体{id:index,components:vec![]}
}
//在实体中添加组件
fn添加组件(&mut self,组件:组件){
自。组件。推(组件);
}
fn get_组件(&self,pred:impl fn(&component)->bool)->选项{
self.components.iter().find(pred)
}
}
结构实体存储{
实体:Vec,
当前索引:usize,
}
植入存储{
fn new()->EntityStore{
EntityStore{entities:vec![],当前索引:0}
}
fn生成索引(&self)->使用{
未执行!();
}
//停止创建系统并更新EntityStore当前索引
fn结束(&mut self)->&mut实体{
让entity=self.entities.get_mut(self.current_index.unwrap();
self.current\u index=self.current\u index+1;
实体
}
fn创建实体(&mut self)->&mut self{
让mut entity=entity::new(self.current_索引);
self.entities.push(实体);
自己
}
//将组件添加到实体
带_组件的fn(&mut self,组件:component)->&mut self{
让mut entity=self.entities.get_mut(self.current_index.unwrap();
实体。添加_组件(组件);
自己
}
}
fn main(){
让mut es=EntityStore::new();
//制造实体
设mut entity1=es
.create_entity()
.with_component(component::Position(Position{x:0,y:0}))
.带_组件(组件::大小(大小{高度:10,宽度:10}))
.end();
//获取实体位置组件
let component_position_entity1=entity1.get_component(|c | if let component::position(|)=c{true}else{false});
println!(“{:?}”,组件位置实体1);
}

请注意,除了我的
get_组件
,还有许多替代方法,但我的主要观点是使用枚举来区分组件类型,而不是使用

@user4815162342在注释中发布此内容,以索引到
实体中。组件
直接:

像这样:

    fn main() {
        let mut es = EntityStore::new();
    
        // Make entity
        let mut entity1 = es
            .create_entity()
            .with_component(Position { x: 0, y: 0 })
            .with_component(Size { height: 10, width: 10 })
            .end();
    
        // Get entity position component
        let v0 = &entity1.components[0];
        let v1 = &entity1.components[1];
        v0.display();
        v1.display();
    }   

但是,由于索引取决于实体的添加顺序,因此最好将实体组件存储在哈希映射中,或者使用
enum
标记,以便更清楚地了解每个组件是什么。

这里的实际问题是什么?代码是否未编译,或者是否未按预期工作?或者您只是在寻找代码审查?如果您描述了您想要解决的实际问题,而不是像“实体组件系统”这样的完全抽象的模式,这会有所帮助,因为它可能无法很好地映射到Rust,甚至可能不需要用于您正在进行的工作。嗨!很抱歉,我的问题是:用我目前的代码,我怎么能得到一个compo