fyrox-platformer/game/src/map.rs

250 lines
7.6 KiB
Rust

use fyrox::{
asset::manager::ResourceManager,
core::sstorage::ImmutableString,
core::{algebra::Vector2, algebra::Vector3, math::Rect},
material::shader::SamplerFallback,
material::{Material, MaterialResource, PropertyValue},
resource::texture::Texture,
scene::{
base::BaseBuilder,
dim2::{
collider::{ColliderBuilder, ColliderShape, CuboidShape},
rectangle::RectangleBuilder,
rigidbody::RigidBodyBuilder,
},
graph::Graph,
rigidbody::RigidBodyType,
transform::TransformBuilder,
},
};
// /mnt/23154027-2dd3-43ea-93f1-02a8df7a3c5a/projects/fyrox/platformer/assets/data/tiles/
//
fn build_material(resource_manager: &ResourceManager, path: String) -> MaterialResource {
let mut material = Material::standard_2d();
material
.set_property(
&ImmutableString::new("diffuseTexture"),
PropertyValue::Sampler {
value: Some(resource_manager.request::<Texture>(path)),
fallback: SamplerFallback::Normal,
},
)
.unwrap();
return MaterialResource::new_ok(Default::default(), material);
}
fn build_dynamic_block(
graph: &mut Graph,
x: f32,
y: f32,
scale: f32,
material: MaterialResource,
shape: ColliderShape,
mass: f32,
) {
let rb_transform = TransformBuilder::new()
.with_local_position(Vector3::new(x, y, 0.0))
.with_local_scale(Vector3::new(scale, scale, 1.0))
.build();
RigidBodyBuilder::new(
BaseBuilder::new()
.with_children(&[
// Collider to prevent player from moving past boundary
RectangleBuilder::new(BaseBuilder::new())
.with_material(material)
// Sprite is located in top left corner of sprite sheet
.with_uv_rect(Rect::new(0.0, 0.0, 1.0, 1.0))
.build(graph),
ColliderBuilder::new(BaseBuilder::new())
.with_shape(shape)
.build(graph),
])
// Optional, set name of tile
.with_name(format!("Boundary ({x}, {y})",))
// Set position of tile
.with_local_transform(rb_transform),
)
.with_mass(mass)
// Turn off gravity for tile
.with_gravity_scale(1.)
.with_lin_damping(1.0)
// Set tile to be static and not rotate
.with_rotation_locked(false)
.with_body_type(RigidBodyType::Dynamic)
.build(graph);
}
fn build_block(
graph: &mut Graph,
x: f32,
y: f32,
scale: f32,
material: MaterialResource,
shape: ColliderShape,
) {
let rb_transform = TransformBuilder::new()
.with_local_position(Vector3::new(x, y, 0.0))
.with_local_scale(Vector3::new(scale, scale, 1.0))
.build();
RigidBodyBuilder::new(
BaseBuilder::new()
.with_children(&[
// Collider to prevent player from moving past boundary
RectangleBuilder::new(BaseBuilder::new())
.with_material(material)
// Sprite is located in top left corner of sprite sheet
.with_uv_rect(Rect::new(0.0, 0.0, 1.0, 1.0))
.build(graph),
ColliderBuilder::new(BaseBuilder::new())
.with_shape(shape)
.build(graph),
])
// Optional, set name of tile
.with_name(format!("Boundary ({x}, {y})",))
// Set position of tile
.with_local_transform(rb_transform),
)
// Turn off gravity for tile
.with_gravity_scale(0.)
// Set tile to be static and not rotate
.with_rotation_locked(true)
.with_body_type(RigidBodyType::Static)
.build(graph);
}
fn build_ground_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let shape = ColliderShape::Cuboid(CuboidShape::default());
build_block(
graph,
x as f32,
y,
1.0,
build_material(resource_manager, "assets/data/tiles/2.png".to_owned()),
shape,
)
}
fn build_center_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let shape = ColliderShape::Cuboid(CuboidShape::default());
build_block(
graph,
x as f32,
y,
1.0,
build_material(resource_manager, "assets/data/tiles/14.png".to_owned()),
shape,
)
}
fn build_left_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let shape = ColliderShape::Cuboid(CuboidShape::default());
build_block(
graph,
x as f32,
y,
1.0,
build_material(resource_manager, "assets/data/tiles/13.png".to_owned()),
shape,
)
}
fn build_right_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let shape = ColliderShape::Cuboid(CuboidShape::default());
build_block(
graph,
x as f32,
y,
1.0,
build_material(resource_manager, "assets/data/tiles/15.png".to_owned()),
shape,
)
}
fn build_tree_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let tree_shape = ColliderShape::Cuboid(CuboidShape {
half_extents: Vector2::new(0.5, 1.0),
});
build_block(
graph,
x as f32,
y + 1.5,
2.0,
build_material(
resource_manager,
"assets/data/objects/Tree_2.png".to_owned(),
),
tree_shape,
)
}
fn build_stone_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let shape = ColliderShape::Cuboid(CuboidShape::default());
build_block(
graph,
x as f32,
y + 1.0,
1.0,
build_material(
resource_manager,
"assets/data/objects/Mushroom_2.png".to_owned(),
),
shape,
)
}
fn build_mushroom_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let shape = ColliderShape::Cuboid(CuboidShape {
half_extents: Vector2::new(0.25, 0.25),
});
build_block(
graph,
x as f32,
y + 0.5,
0.5,
build_material(
resource_manager,
"assets/data/objects/Mushroom_2.png".to_owned(),
),
shape,
)
}
fn build_box_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
let shape = ColliderShape::Cuboid(CuboidShape::default());
build_dynamic_block(
graph,
x,
y + 1.0,
1.0,
build_material(resource_manager, "assets/data/objects/Crate.png".to_owned()),
shape,
3.0,
);
}
fn build_air_island_block(resource_manager: &ResourceManager, graph: &mut Graph, x: f32, y: f32) {
build_left_block(resource_manager, graph, x + 1.0, y);
build_center_block(resource_manager, graph, x, y);
build_right_block(resource_manager, graph, x - 1.0, y);
}
pub fn build_map(graph: &mut Graph, resource_manager: &ResourceManager) {
let bottom_y: f32 = -5.0;
let left_x: i32 = -50;
let right_x: i32 = 50;
for x in left_x..right_x {
build_ground_block(resource_manager, graph, x as f32, bottom_y);
}
build_mushroom_block(resource_manager, graph, 25.0, bottom_y);
build_tree_block(resource_manager, graph, 30.0, bottom_y);
build_stone_block(resource_manager, graph, -25.0, bottom_y);
build_tree_block(resource_manager, graph, -30.0, bottom_y);
build_box_block(resource_manager, graph, 10.0, bottom_y);
build_air_island_block(resource_manager, graph, 15.0, bottom_y + 2.0)
}