Правене на игри с Amethyst
08 януари 2019
Какво е Amethyst?
What sort of graphics do you need?
- 2D only. All you need is…
- 3D for sure. Do you like making your hands dirty?
Source: https://gist.github.com/kvark/840c8cadf755b0d822b331222b0c3095
Подходи
Подходи
- Amethyst използва ECS - Entity Component System
Подходи
- Amethyst използва ECS - Entity Component System
- ще го сравним с някои често използвани подходи
Подходи
Една интересна презентация по темата:
- RustConf 2018 - Closing Keynote - Using Rust For Game Development by Catherine West
- https://www.youtube.com/watch?v=aKLntZcp27M
"Update" pattern
1
2
3
4
5
6
7
8
9
loop {
player.update();
shots.update();
enemies.update();
player.draw();
shots.draw();
enemies.draw();
}
EC
Модел Entity-Component
- еntity е някакъв обект в света
EC
Модел Entity-Component
- еntity е някакъв обект в света
- към него се закачат компоненти
EC
Модел Entity-Component
- еntity е някакъв обект в света
- към него се закачат компоненти
- компонента отговаря за определено поведение
EC - Entity
1
2
3
4
5
6
7
8
9
10
struct Ferris {
rendering: RenderingComponent,
position: PositionComponent
shooting: ShootingComponent
}
struct Enemy {
rendering: RenderingComponent,
position: PositionComponent,
}
EC - Component
1
2
3
4
5
6
7
8
9
10
struct PositionComponent {
pos: Vector2<f32>,
vel: Vector2<f32>,
}
impl Component for PositionComponent {
fn update(&mut self) {
self.pos += self.vel * delta_time();
}
}
EC
1
2
3
4
5
6
7
8
9
10
11
for c in components {
c.update();
}
// or
for e in entities {
for c in e.components() {
c.update();
}
}
ECS
Модел Entity-Component-System
- еntity е обект в играта
ECS
Модел Entity-Component-System
- еntity е обект в играта
- компонента е съвкупност от данни
ECS
Модел Entity-Component-System
- еntity е обект в играта
- компонента е съвкупност от данни
- компонентите се закачат за entity-та
ECS
Модел Entity-Component-System
- еntity е обект в играта
- компонента е съвкупност от данни
- компонентите се закачат за entity-та
- системите са логиката на играта
ECS
Модел Entity-Component-System
- еntity е обект в играта
- компонента е съвкупност от данни
- компонентите се закачат за entity-та
- системите са логиката на играта
- всяка система обработва entity-та с определени компоненти
ECS - Entity
![]() |
EntityId(0) |
Undefined behaviour | EntityId(1) |
![]() |
EntityId(4) |
ECS - Component
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let components = Components {
position: vec![
(EntityId(0), PositionComponent { pos: .., vel: .. }),
(EntityId(1), PositionComponent { pos: .., vel: .. }),
(EntityId(4), PositionComponent { pos: .., vel: .. }),
],
rendering: vec![
(EntityId(0), RenderingComponent::Sprite("ferris_shooting.png")),
(EntityId(1), RenderingComponent::Text("Undefined behaviour")),
(EntityId(4), RenderingComponent::Sprite("pew.png")),
],
shooting: vec![
(EntityId(0), ShootingComponent { cooldown: 0.0, cooldown_rate: 1.0 }),
]
}
ECS - System
1
2
3
SELECT (t, mesh, mat)
FROM TransformComponent, MeshComponent, MaterialComponent
WHERE t.entity_id == mesh.entity_id == mat.entity_id
ECS - System
1
2
3
for (t, mesh, mat) in (&transforms, &meshes, &materials).join() {
...
}
Amethyst
Amethyst
- https://www.amethyst.rs/
- може да прочетете книгата
API документация
API документация
- docs.rs не предоставя документация за подбиблиотеки
API документация
- docs.rs не предоставя документация за подбиблиотеки
- много от големите проекти (включително amethyst) съдържат множество малки библиотеки, които се пакетират в един
API документация
- docs.rs не предоставя документация за подбиблиотеки
- много от големите проекти (включително amethyst) съдържат множество малки библиотеки, които се пакетират в един
- най-добре е да си генерирате API документация локално с
cargo doc
Оптимизации
Могат да се включат оптимизации в debug режим, без да се изключват останалите полезни проверки и опции
Това става като се добави в Cargo.toml
1
2
[profile.dev]
opt-level = 3
За повече информация: https://doc.rust-lang.org/cargo/reference/manifest.html#the-profile-sections