Add a terrain def and use it

This commit is contained in:
Gender Shrapnel 2022-12-23 12:48:48 +01:00
parent d4175e0710
commit 22ed2261f3
Signed by: modzero
GPG Key ID: 4E11A06C6D1E5213
2 changed files with 76 additions and 43 deletions

View File

@ -1,10 +1,10 @@
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct SurfaceDef { pub struct SurfaceDef<'a> {
label: String, pub label: &'a str,
name: String, pub name: &'a str,
description: String, pub description: &'a str,
texture_index: u32, pub texture_index: u32,
support: f32, pub support: f32,
} }

View File

@ -7,10 +7,45 @@ use bevy::{
prelude::*, prelude::*,
}; };
use bevy_ecs_tilemap::prelude::*; use bevy_ecs_tilemap::prelude::*;
use rand::{thread_rng, Rng}; use defs::SurfaceDef;
mod defs; mod defs;
const TERRAINS: [SurfaceDef; 3] = [
SurfaceDef {
label: "Mud",
name: "mud",
description: "Soil saturated with water.",
texture_index: 13,
support: 20.0,
},
SurfaceDef {
label: "Grass",
name: "grass",
description: "Green. Try to touch it.",
texture_index: 14,
support: 40.0,
},
SurfaceDef {
label: "Sand",
name: "sand",
description: "Gets everywhere, ruins vanilla sex fantasies.",
texture_index: 15,
support: 20.0,
},
];
#[derive(Component, Clone)]
struct TileTerrain {
terrain_id: usize,
}
impl TileTerrain {
fn def(&self) -> &SurfaceDef {
&TERRAINS[self.terrain_id]
}
}
fn make_ground_layer( fn make_ground_layer(
commands: &mut Commands, commands: &mut Commands,
tilemap_size: TilemapSize, tilemap_size: TilemapSize,
@ -19,18 +54,22 @@ fn make_ground_layer(
) { ) {
let mut tile_storage = TileStorage::empty(tilemap_size); let mut tile_storage = TileStorage::empty(tilemap_size);
let tilemap_entity = commands.spawn_empty().id(); let tilemap_entity = commands.spawn_empty().id();
let mut random = thread_rng();
for x in 0..tilemap_size.x { for x in 0..tilemap_size.x {
for y in 0..tilemap_size.y { for y in 0..tilemap_size.y {
let tile_pos = TilePos { x, y }; let tile_pos = TilePos { x, y };
let tile_terrain = TileTerrain { terrain_id: 1 };
let tile_entity = commands let tile_entity = commands
.spawn(TileBundle { .spawn((
tile_terrain.clone(),
TileBundle {
position: tile_pos, position: tile_pos,
tilemap_id: TilemapId(tilemap_entity), tilemap_id: TilemapId(tilemap_entity),
texture_index: TileTextureIndex(random.gen_range(13..=19)), texture_index: TileTextureIndex(tile_terrain.def().texture_index),
..Default::default() ..Default::default()
}) },
))
.id(); .id();
tile_storage.set(&tile_pos, tile_entity); tile_storage.set(&tile_pos, tile_entity);
} }
@ -39,9 +78,7 @@ fn make_ground_layer(
let grid_size = tile_size.into(); let grid_size = tile_size.into();
let map_type = TilemapType::default(); let map_type = TilemapType::default();
commands commands.entity(tilemap_entity).insert(TilemapBundle {
.entity(tilemap_entity)
.insert(TilemapBundle {
grid_size, grid_size,
map_type, map_type,
size: tilemap_size, size: tilemap_size,
@ -61,12 +98,7 @@ fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
let tilemap_size = TilemapSize { x: 320, y: 320 }; let tilemap_size = TilemapSize { x: 320, y: 320 };
let tile_size = TilemapTileSize { x: 32.0, y: 32.0 }; let tile_size = TilemapTileSize { x: 32.0, y: 32.0 };
make_ground_layer( make_ground_layer(&mut commands, tilemap_size, texture_handle, tile_size);
&mut commands,
tilemap_size,
texture_handle,
tile_size,
);
} }
fn mouse_motion( fn mouse_motion(
@ -86,11 +118,12 @@ fn mouse_motion(
fn main() { fn main() {
App::new() App::new()
.add_plugins(DefaultPlugins .add_plugins(
DefaultPlugins
.set(WindowPlugin { .set(WindowPlugin {
window: WindowDescriptor { window: WindowDescriptor {
width: 1270.0, width: 1270.0,
height:720.0, height: 720.0,
title: String::from("Monstrous"), title: String::from("Monstrous"),
..Default::default() ..Default::default()
}, },