asteroids-genetic/src/main.rs

225 lines
6.6 KiB
Rust

mod asteroids;
mod nn;
mod player;
mod population;
mod world;
use std::borrow::BorrowMut;
use macroquad::{
prelude::*,
ui::{hash, root_ui, widgets, Skin},
};
use population::Population;
pub const WIDTH: f32 = 800.;
pub const HEIGHT: f32 = 780.;
fn window_conf() -> Conf {
Conf {
window_title: "Asteroids".to_string(),
// fullscreen: true,
window_width: 1400,
window_height: 800,
..Default::default()
}
}
#[macroquad::main(window_conf)]
async fn main() {
rand::srand(macroquad::miniquad::date::now() as _);
let pause = load_texture("pause.png").await.unwrap();
let play = load_texture("play.png").await.unwrap();
let fast = load_texture("fast.png").await.unwrap();
let restart = load_texture("restart.png").await.unwrap();
let th = (screen_height() - HEIGHT) * 0.5;
let gamecam = Camera2D {
zoom: vec2(2. / screen_width(), -2. / screen_height()),
offset: vec2((2. * th + WIDTH) / screen_width() - 1., 0.),
..Default::default()
};
let maincam = Camera2D {
zoom: vec2(2. / screen_width(), -2. / screen_height()),
offset: vec2(
(th + WIDTH) / screen_width(),
-((th + HEIGHT) * 0.5) / screen_height(),
),
..Default::default()
};
// let mut cam = Camera2D::from_display_rect(Rect {
// x: 0.,
// y: 0.,
// w: 1600.,
// h: 1200.,
// });
// cam.offset = vec2(1., -1.);
// // {
// zoom: vec2(2. / 800., -2. / 600.),
// // offset: vec2(-19. / 60., 0.),
// ..Default::default()
// };
let mut pop = Population::new(100);
let mut speedup = false;
let mut paused = false;
let mut checkbox = false;
let mut combobox = 0;
let mut text = String::new();
let mut number = 0.0;
let skin = {
let boxed = root_ui()
.style_builder()
.background(Image {
width: 3,
height: 3,
bytes: vec![
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255,
],
})
.background_margin(RectOffset::new(1., 1., 1., 1.));
let window_style = root_ui()
.style_builder()
.background(Image {
width: 1,
height: 1,
bytes: vec![0; 4],
})
.background_margin(RectOffset::new(0., 0., 0., 0.))
.build();
let button_style = boxed
.color_hovered(RED)
.color_clicked(BLUE)
.text_color(WHITE)
.text_color_hovered(WHITE)
.text_color_clicked(WHITE)
.margin(RectOffset::new(10., 10., 8., 8.))
.build();
let label_style = root_ui()
.style_builder()
.text_color(WHITE)
.font_size(24)
.margin(RectOffset::new(5., 5., 4., 4.))
.build();
Skin {
window_style,
button_style,
label_style,
margin: 0.,
..root_ui().default_skin()
}
};
root_ui().push_skin(&skin);
loop {
clear_background(BLACK);
if is_key_pressed(KeyCode::S) {
speedup = !speedup;
}
if speedup {
if !paused {
for _ in 0..1000 {
pop.update();
}
}
} else {
if !paused {
pop.update();
}
pop.draw();
}
draw_rectangle_lines(-WIDTH * 0.5, -HEIGHT * 0.5, WIDTH, HEIGHT, 2., WHITE);
draw_rectangle_lines(
WIDTH * 0.5 + th,
-HEIGHT * 0.5,
screen_width() - WIDTH - 3. * th,
34.,
2.,
WHITE,
);
draw_rectangle_lines(
WIDTH * 0.5 + th,
-HEIGHT * 0.5 + (screen_height() - 3. * th) * 0.5 - 34.,
screen_width() - WIDTH - 3. * th,
34.,
2.,
WHITE,
);
set_camera(&maincam);
// draw_circle(0., 0., 20., RED);
pop.worlds[0].player.draw_brain(
screen_width() - WIDTH - 3. * th,
(screen_height() - 3. * th) * 0.5,
);
set_camera(&gamecam);
root_ui().window(
hash!(),
vec2(WIDTH + 2. * th, th),
vec2(screen_width() - WIDTH - 3. * th + 1., 34.),
|ui| {
ui.label(None, &format!("Generation: {}", pop.gen));
ui.same_line(278.);
widgets::Button::new("Load Model").ui(ui);
ui.same_line(0.);
widgets::Button::new("Save Model").ui(ui);
ui.same_line(0.);
if widgets::Button::new(fast).ui(ui) {
speedup = !speedup;
};
ui.same_line(0.);
if widgets::Button::new(restart).ui(ui) {
pop = Population::new(100);
};
ui.same_line(0.);
if widgets::Button::new(if paused { play } else { pause }).ui(ui) {
paused = !paused;
};
},
);
root_ui().window(
hash!(),
vec2(WIDTH + 2. * th, (screen_height() - th) * 0.5 - 34.),
vec2(screen_width() - WIDTH - 3. * th + 1., 34.),
|ui| {
ui.label(None, &format!("Generation: {}", pop.gen));
ui.same_line(278.);
widgets::Button::new("Load Model").ui(ui);
ui.same_line(0.);
widgets::Button::new("Save Model").ui(ui);
ui.same_line(0.);
if widgets::Button::new(fast).ui(ui) {
speedup = !speedup;
};
ui.same_line(0.);
if widgets::Button::new(restart).ui(ui) {
pop = Population::new(100);
};
ui.same_line(0.);
if widgets::Button::new(if paused { play } else { pause }).ui(ui) {
paused = !paused;
};
},
);
// set_camera(&maincam);
// draw_texture_ex(
// target.texture,
// 0.,
// 0.,
// Color::new(1., 1., 1., 0.3),
// DrawTextureParams {
// flip_y: true,
// ..Default::default()
// },
// );
// set_camera(&cam);
next_frame().await;
}
}