use bevy::prelude::*;
use rand::{thread_rng, Rng};
use seldom_pixel::prelude::*;
fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
resolution: Vec2::splat(512.).into(),
..default()
}),
..default()
}),
PxPlugin::<Layer>::new(UVec2::splat(64), "palette/palette_1.palette.png"),
))
.insert_resource(ClearColor(Color::BLACK))
.add_systems(Startup, init)
.add_systems(Update, (move_mage, move_camera, switch_canvas))
.run();
}
fn init(assets: Res<AssetServer>, mut commands: Commands) {
commands.spawn(Camera2d);
commands.spawn((PxSubPosition::default(), CameraPos));
commands.spawn((
PxSprite(assets.load("sprite/mage.px_sprite.png")),
PxPosition(IVec2::splat(32)),
Mage,
));
}
#[derive(Component)]
struct CameraPos;
const CAMERA_SPEED: f32 = 10.;
fn move_camera(
mut camera_poses: Query<&mut PxSubPosition, With<CameraPos>>,
keys: Res<ButtonInput<KeyCode>>,
time: Res<Time>,
mut camera: ResMut<PxCamera>,
) {
let mut camera_pos = camera_poses.single_mut();
**camera_pos += IVec2::new(
keys.pressed(KeyCode::ArrowRight) as i32 - keys.pressed(KeyCode::ArrowLeft) as i32,
keys.pressed(KeyCode::ArrowUp) as i32 - keys.pressed(KeyCode::ArrowDown) as i32,
)
.as_vec2()
.normalize_or_zero()
* time.delta_secs()
* CAMERA_SPEED;
**camera = camera_pos.round().as_ivec2();
}
#[derive(Component)]
struct Mage;
fn move_mage(mut mages: Query<&mut PxPosition, With<Mage>>) {
if let Some(delta) =
[IVec2::X, -IVec2::X, IVec2::Y, -IVec2::Y].get(thread_rng().gen_range(0..50))
{
**mages.single_mut() += *delta;
}
}
fn switch_canvas(mut mages: Query<&mut PxCanvas>, keys: Res<ButtonInput<KeyCode>>) {
if keys.just_pressed(KeyCode::Space) {
let mut canvas = mages.single_mut();
*canvas = match *canvas {
PxCanvas::World => PxCanvas::Camera,
PxCanvas::Camera => PxCanvas::World,
};
}
}
#[px_layer]
struct Layer;