add auto-generated sceleton

This commit is contained in:
artem 2024-02-19 12:26:39 +03:00
parent 2d685ce745
commit 8dfa066715
5 changed files with 581 additions and 436 deletions

Binary file not shown.

View File

@ -18,7 +18,7 @@ use fyrox::{
graph::Graph,
node::Node,
},
script::{ScriptContext, ScriptTrait, Script},
script::{ScriptContext, ScriptTrait},
};
use crate::Player;
@ -42,11 +42,11 @@ const END_MAP_RIGHT: f32 = 25.0;
#[derive(Visit, Reflect, Debug, Clone, Default)]
pub struct Enemy {
sprite: Handle<Node>,
// pub sprite: Handle<Node>,
move_left: bool,
move_right: bool,
jump: bool,
animations: Vec<SpriteSheetAnimation>,
pub animations: Vec<SpriteSheetAnimation>,
fight: bool,
win: bool,
dead: bool,
@ -262,7 +262,7 @@ impl Enemy {
if x_speed == 0.0 {
return;
}
let sprite = context.scene.graph.try_get_mut(self.sprite);
let sprite = context.scene.graph.try_get_mut(context.handle);
match sprite {
Some(sprite_data) => {
// It is always a good practice to check whether the handles are valid, at this point we don't know
@ -329,12 +329,35 @@ impl Enemy {
let current_animation = self.animations.get_mut(cur_anim);
match current_animation {
Some(animation_data) => {
animation_data.update(context.dt);
let mut graph_ctx = context.scene.graph.begin_multi_borrow::<2>();
let enemy_rigid_data = match graph_ctx.try_get(context.handle) {
Some(rigid_body) => rigid_body,
None => return,
};
for child in enemy_rigid_data.children().iter() {
if let Some(enemy) = graph_ctx.try_get(*child) {
if !enemy.is_rectangle() {
continue;
}
let sprite = enemy.cast_mut::<Rectangle>().unwrap();
animation_data.update(context.dt);
sprite
.material()
.data_ref()
.set_texture(&"diffuseTexture".into(), animation_data.texture())
.unwrap();
sprite.set_uv_rect(
animation_data.current_frame_uv_rect().unwrap_or_default(),
);
break;
}
}
animation_data.update(context.dt);
if let Some(sprite) = context
.scene
.graph
.try_get_mut(self.sprite)
.try_get_mut(context.handle)
.and_then(|n| n.cast_mut::<Rectangle>())
{
sprite
@ -364,14 +387,8 @@ impl ScriptTrait for Enemy {
// Find and store the Player's collider node handle
for child in handle.1.children().iter() {
// TODO:
self.player_collider = *child;
break;
// println!("1!!!!!!!!!!!!!Collider{:?}", context.scene.graph[*child]);
// if let Some(_) = context.scene.graph[*child].cast::<Collider>() {
// println!("2!!!!!!!!!!!!!Collider{:?}", *child);
// self.player_collider = *child;
// }
}
}
None => {}

129
game/src/enemy_spawn.rs Normal file
View File

@ -0,0 +1,129 @@
use crate::Enemy;
use fyrox::{
asset::manager::ResourceManager,
core::{
algebra::{Vector2, Vector3},
impl_component_provider,
math::Rect,
reflect::prelude::*,
sstorage::ImmutableString,
uuid_provider,
visitor::prelude::*,
},
generic_animation::spritesheet::{ImageParameters, SpriteSheetAnimation},
material::{shader::SamplerFallback, Material, MaterialResource, PropertyValue},
resource::texture::Texture,
scene::{
base::BaseBuilder,
collider::InteractionGroups,
dim2::{
collider::{CapsuleShape, ColliderBuilder, ColliderShape},
rectangle::RectangleBuilder,
rigidbody::RigidBodyBuilder,
},
graph::Graph,
rigidbody::RigidBodyType,
transform::TransformBuilder,
},
script::{Script, ScriptContext, ScriptTrait},
};
impl_component_provider!(EnemySpawn,);
uuid_provider!(EnemySpawn = "b5671d19-9f1a-4286-8486-add4ebaadaec");
#[derive(Visit, Reflect, Debug, Clone, Default)]
pub struct EnemySpawn {
x: f32,
y: f32,
enemy: Enemy,
}
impl EnemySpawn {
pub fn new() -> Self {
return EnemySpawn::default();
}
pub fn spawn_enemy(&self, graph: &mut Graph, resource_manager: &ResourceManager) {
// TODO: add with_build
let mut enemy = Enemy::default();
enemy.x = 0.0;
enemy.y = -4.0;
let x = enemy.x;
let y = enemy.y;
let mut material = Material::standard_2d();
let idle = resource_manager.request::<Texture>(
"assets/data/characters/skeleton/Skeleton_Warrior/Idle.png".to_owned(),
);
let mut idle_animation = SpriteSheetAnimation::new_from_image_parameters(ImageParameters {
width: 896,
height: 128,
frame_width: 118,
frame_height: 128,
first_frame: 1,
last_frame: 5,
column_major: false,
});
idle_animation.set_texture(Some(idle.clone()));
idle_animation.set_looping(true);
idle_animation.set_speed(10.);
idle_animation.play();
enemy.animations = vec![
idle_animation.clone(),
idle_animation.clone(),
idle_animation.clone(),
idle_animation,
];
material
.set_property(
&ImmutableString::new("diffuseTexture"),
PropertyValue::Sampler {
value: Some(idle.clone()),
fallback: SamplerFallback::Normal,
},
)
.unwrap();
let shape = ColliderShape::Capsule(CapsuleShape {
begin: Vector2::new(0.0, -0.2),
end: Vector2::new(0.0, 0.1),
radius: 0.3,
});
let rb_transform = TransformBuilder::new()
.with_local_position(Vector3::new(x, y, 0.0))
.with_local_scale(Vector3::new(2.0, 2.0, 1.0))
.build();
RigidBodyBuilder::new(
BaseBuilder::new()
.with_children(&[
// Collider to prevent player from moving past boundary
RectangleBuilder::new(BaseBuilder::new())
.with_material(MaterialResource::new_ok(Default::default(), material))
// Sprite is located in top left corner of sprite sheet
.with_uv_rect(Rect::new(0.0, 0.3, 0.13, 0.8))
.build(graph),
ColliderBuilder::new(BaseBuilder::new())
.with_shape(shape)
.with_collision_groups(InteractionGroups::default())
.with_solver_groups(InteractionGroups::default())
.build(graph),
])
// Optional, set name of tile
.with_name(format!("Sceleton ({x}, {y})",))
// Set position of tile
.with_local_transform(rb_transform)
.with_script(Script::new(enemy)),
)
.with_mass(1.0)
// Turn off gravity for tile
.with_gravity_scale(1.)
.with_lin_damping(2.0)
// Set tile to be static and not rotate
.with_rotation_locked(true)
.with_body_type(RigidBodyType::Dynamic)
.build(graph);
}
}
impl ScriptTrait for EnemySpawn {
fn on_init(&mut self, context: &mut ScriptContext) {
let resource_manager: &ResourceManager = &context.resource_manager;
self.spawn_enemy(&mut context.scene.graph, resource_manager);
// self.enemy.on_init(context);
}
}

View File

@ -30,9 +30,8 @@ impl PluginConstructor for GameConstructor {
fn register(&self, context: PluginRegistrationContext) {
// Register your scripts here.
let script_constructors = &context.serialization_context.script_constructors;
script_constructors.add::<EnemySpawn>("EnemySpanw");
script_constructors.add::<Player>("Player");
script_constructors.add::<Enemy>("Enemy");
script_constructors.add::<Player>("Player");
}
fn create_instance(&self, scene_path: Option<&str>, context: PluginContext) -> Box<dyn Plugin> {
@ -110,7 +109,7 @@ impl Plugin for Game {
let graph: &mut Graph = &mut context.scenes[self.scene].graph;
let resource_manager: &ResourceManager = &context.resource_manager;
build_map(graph, resource_manager);
EnemySpawn::new().spawn_enemy(graph, resource_manager);
}
}

View File

@ -322,199 +322,13 @@
),
node_infos: {
(
index: 7,
generation: 1,
): (
is_expanded: true,
),
(
index: 74,
generation: 1,
): (
is_expanded: true,
),
(
index: 40,
generation: 1,
): (
is_expanded: true,
),
(
index: 39,
index: 93,
generation: 1,
): (
is_expanded: false,
),
(
index: 59,
generation: 1,
): (
is_expanded: true,
),
(
index: 12,
generation: 1,
): (
is_expanded: false,
),
(
index: 51,
generation: 1,
): (
is_expanded: true,
),
(
index: 32,
generation: 1,
): (
is_expanded: true,
),
(
index: 17,
generation: 1,
): (
is_expanded: false,
),
(
index: 60,
generation: 1,
): (
is_expanded: false,
),
(
index: 38,
generation: 1,
): (
is_expanded: true,
),
(
index: 69,
generation: 1,
): (
is_expanded: false,
),
(
index: 86,
generation: 1,
): (
is_expanded: true,
),
(
index: 90,
generation: 1,
): (
is_expanded: false,
),
(
index: 14,
generation: 1,
): (
is_expanded: true,
),
(
index: 18,
generation: 1,
): (
is_expanded: true,
),
(
index: 92,
generation: 1,
): (
is_expanded: true,
),
(
index: 21,
generation: 1,
): (
is_expanded: false,
),
(
index: 1,
generation: 1,
): (
is_expanded: true,
),
(
index: 91,
generation: 1,
): (
is_expanded: true,
),
(
index: 42,
generation: 1,
): (
is_expanded: false,
),
(
index: 20,
generation: 1,
): (
is_expanded: true,
),
(
index: 27,
generation: 1,
): (
is_expanded: false,
),
(
index: 29,
generation: 1,
): (
is_expanded: true,
),
(
index: 57,
generation: 1,
): (
is_expanded: false,
),
(
index: 52,
generation: 1,
): (
is_expanded: true,
),
(
index: 30,
generation: 1,
): (
is_expanded: true,
),
(
index: 81,
generation: 1,
): (
is_expanded: false,
),
(
index: 35,
generation: 1,
): (
is_expanded: true,
),
(
index: 71,
generation: 1,
): (
is_expanded: true,
),
(
index: 2,
generation: 1,
): (
is_expanded: true,
),
(
index: 4,
generation: 1,
): (
is_expanded: true,
),
(
index: 48,
index: 50,
generation: 1,
): (
is_expanded: true,
@ -525,228 +339,12 @@
): (
is_expanded: true,
),
(
index: 22,
generation: 1,
): (
is_expanded: false,
),
(
index: 83,
generation: 1,
): (
is_expanded: true,
),
(
index: 49,
generation: 1,
): (
is_expanded: false,
),
(
index: 0,
generation: 1,
): (
is_expanded: true,
),
(
index: 72,
generation: 1,
): (
is_expanded: false,
),
(
index: 87,
generation: 1,
): (
is_expanded: false,
),
(
index: 56,
generation: 1,
): (
is_expanded: true,
),
(
index: 66,
generation: 1,
): (
is_expanded: false,
),
(
index: 94,
generation: 1,
): (
is_expanded: true,
),
(
index: 43,
generation: 1,
): (
is_expanded: false,
),
(
index: 31,
generation: 1,
): (
is_expanded: true,
),
(
index: 63,
generation: 1,
): (
is_expanded: false,
),
(
index: 82,
generation: 1,
): (
is_expanded: true,
),
(
index: 10,
generation: 1,
): (
is_expanded: true,
),
(
index: 46,
generation: 1,
): (
is_expanded: false,
),
(
index: 80,
generation: 1,
): (
is_expanded: true,
),
(
index: 93,
generation: 1,
): (
is_expanded: false,
),
(
index: 6,
generation: 1,
): (
is_expanded: true,
),
(
index: 95,
generation: 1,
): (
is_expanded: true,
),
(
index: 8,
generation: 1,
): (
is_expanded: false,
),
(
index: 3,
generation: 1,
): (
is_expanded: true,
),
(
index: 58,
generation: 1,
): (
is_expanded: true,
),
(
index: 15,
generation: 1,
): (
is_expanded: true,
),
(
index: 5,
generation: 1,
): (
is_expanded: true,
),
(
index: 44,
generation: 1,
): (
is_expanded: true,
),
(
index: 26,
generation: 1,
): (
is_expanded: true,
),
(
index: 36,
generation: 1,
): (
is_expanded: false,
),
(
index: 89,
generation: 1,
): (
is_expanded: true,
),
(
index: 13,
generation: 1,
): (
is_expanded: true,
),
(
index: 65,
generation: 1,
): (
is_expanded: true,
),
(
index: 78,
generation: 1,
): (
is_expanded: false,
),
(
index: 54,
generation: 1,
): (
is_expanded: true,
),
(
index: 84,
generation: 1,
): (
is_expanded: false,
),
(
index: 25,
generation: 1,
): (
is_expanded: false,
),
(
index: 28,
generation: 1,
): (
is_expanded: false,
),
(
index: 24,
generation: 1,
): (
is_expanded: false,
),
(
index: 41,
generation: 1,
): (
is_expanded: true,
),
(
index: 34,
generation: 1,
@ -754,13 +352,7 @@
is_expanded: true,
),
(
index: 62,
generation: 1,
): (
is_expanded: true,
),
(
index: 23,
index: 20,
generation: 1,
): (
is_expanded: true,
@ -772,22 +364,22 @@
is_expanded: false,
),
(
index: 47,
index: 71,
generation: 1,
): (
is_expanded: true,
),
(
index: 53,
index: 28,
generation: 1,
): (
is_expanded: true,
is_expanded: false,
),
(
index: 50,
index: 72,
generation: 1,
): (
is_expanded: true,
is_expanded: false,
),
(
index: 55,
@ -796,19 +388,19 @@
is_expanded: true,
),
(
index: 11,
index: 81,
generation: 1,
): (
is_expanded: false,
),
(
index: 77,
index: 63,
generation: 1,
): (
is_expanded: true,
is_expanded: false,
),
(
index: 16,
index: 92,
generation: 1,
): (
is_expanded: true,
@ -820,7 +412,133 @@
is_expanded: false,
),
(
index: 9,
index: 56,
generation: 1,
): (
is_expanded: true,
),
(
index: 47,
generation: 1,
): (
is_expanded: true,
),
(
index: 77,
generation: 1,
): (
is_expanded: true,
),
(
index: 66,
generation: 1,
): (
is_expanded: false,
),
(
index: 22,
generation: 1,
): (
is_expanded: false,
),
(
index: 44,
generation: 1,
): (
is_expanded: true,
),
(
index: 62,
generation: 1,
): (
is_expanded: true,
),
(
index: 42,
generation: 1,
): (
is_expanded: false,
),
(
index: 52,
generation: 1,
): (
is_expanded: true,
),
(
index: 82,
generation: 1,
): (
is_expanded: true,
),
(
index: 83,
generation: 1,
): (
is_expanded: true,
),
(
index: 39,
generation: 1,
): (
is_expanded: false,
),
(
index: 17,
generation: 1,
): (
is_expanded: false,
),
(
index: 38,
generation: 1,
): (
is_expanded: true,
),
(
index: 65,
generation: 1,
): (
is_expanded: true,
),
(
index: 21,
generation: 1,
): (
is_expanded: false,
),
(
index: 41,
generation: 1,
): (
is_expanded: true,
),
(
index: 5,
generation: 1,
): (
is_expanded: true,
),
(
index: 35,
generation: 1,
): (
is_expanded: true,
),
(
index: 26,
generation: 1,
): (
is_expanded: true,
),
(
index: 54,
generation: 1,
): (
is_expanded: true,
),
(
index: 46,
generation: 1,
): (
is_expanded: false,
@ -831,12 +549,294 @@
): (
is_expanded: true,
),
(
index: 78,
generation: 1,
): (
is_expanded: false,
),
(
index: 48,
generation: 1,
): (
is_expanded: true,
),
(
index: 43,
generation: 1,
): (
is_expanded: false,
),
(
index: 59,
generation: 1,
): (
is_expanded: true,
),
(
index: 53,
generation: 1,
): (
is_expanded: true,
),
(
index: 40,
generation: 1,
): (
is_expanded: true,
),
(
index: 13,
generation: 1,
): (
is_expanded: true,
),
(
index: 32,
generation: 1,
): (
is_expanded: true,
),
(
index: 16,
generation: 1,
): (
is_expanded: true,
),
(
index: 25,
generation: 1,
): (
is_expanded: false,
),
(
index: 7,
generation: 1,
): (
is_expanded: true,
),
(
index: 11,
generation: 1,
): (
is_expanded: false,
),
(
index: 74,
generation: 1,
): (
is_expanded: true,
),
(
index: 51,
generation: 1,
): (
is_expanded: true,
),
(
index: 36,
generation: 1,
): (
is_expanded: false,
),
(
index: 15,
generation: 1,
): (
is_expanded: true,
),
(
index: 49,
generation: 1,
): (
is_expanded: false,
),
(
index: 1,
generation: 1,
): (
is_expanded: true,
),
(
index: 9,
generation: 1,
): (
is_expanded: false,
),
(
index: 80,
generation: 1,
): (
is_expanded: true,
),
(
index: 18,
generation: 1,
): (
is_expanded: true,
),
(
index: 30,
generation: 1,
): (
is_expanded: true,
),
(
index: 3,
generation: 1,
): (
is_expanded: true,
),
(
index: 60,
generation: 1,
): (
is_expanded: false,
),
(
index: 94,
generation: 1,
): (
is_expanded: true,
),
(
index: 8,
generation: 1,
): (
is_expanded: false,
),
(
index: 0,
generation: 1,
): (
is_expanded: true,
),
(
index: 10,
generation: 1,
): (
is_expanded: true,
),
(
index: 75,
generation: 1,
): (
is_expanded: false,
),
(
index: 90,
generation: 1,
): (
is_expanded: false,
),
(
index: 31,
generation: 1,
): (
is_expanded: true,
),
(
index: 27,
generation: 1,
): (
is_expanded: false,
),
(
index: 6,
generation: 1,
): (
is_expanded: true,
),
(
index: 58,
generation: 1,
): (
is_expanded: true,
),
(
index: 14,
generation: 1,
): (
is_expanded: true,
),
(
index: 23,
generation: 1,
): (
is_expanded: true,
),
(
index: 12,
generation: 1,
): (
is_expanded: false,
),
(
index: 91,
generation: 1,
): (
is_expanded: true,
),
(
index: 95,
generation: 1,
): (
is_expanded: true,
),
(
index: 89,
generation: 1,
): (
is_expanded: true,
),
(
index: 87,
generation: 1,
): (
is_expanded: false,
),
(
index: 57,
generation: 1,
): (
is_expanded: false,
),
(
index: 29,
generation: 1,
): (
is_expanded: true,
),
(
index: 86,
generation: 1,
): (
is_expanded: true,
),
(
index: 24,
generation: 1,
): (
is_expanded: false,
),
(
index: 4,
generation: 1,
): (
is_expanded: true,
),
(
index: 2,
generation: 1,
): (
is_expanded: true,
),
(
index: 69,
generation: 1,
): (
is_expanded: false,
),
},
),
},