player collisions
This commit is contained in:
parent
d5a0fd4374
commit
3d633c435d
|
@ -57,28 +57,26 @@ impl Asteroid {
|
|||
asteroid
|
||||
}
|
||||
|
||||
pub fn check_collision(&mut self, pos: Vec2) -> bool {
|
||||
let collided = (pos.x - self.pos.x) * (pos.x - self.pos.x)
|
||||
+ (pos.y - self.pos.y) * (pos.y - self.pos.y)
|
||||
<= self.radius * self.radius;
|
||||
if collided {
|
||||
self.alive = false;
|
||||
}
|
||||
return collided;
|
||||
pub fn check_collision(&mut self, pos: Vec2, rad: f32) -> bool {
|
||||
(pos.x - self.pos.x) * (pos.x - self.pos.x) + (pos.y - self.pos.y) * (pos.y - self.pos.y)
|
||||
<= (self.radius + rad) * (self.radius + rad)
|
||||
}
|
||||
|
||||
pub fn update(&mut self) {
|
||||
if self.alive {
|
||||
self.pos += self.vel * get_frame_time();
|
||||
self.rot += self.omega * get_frame_time();
|
||||
self.alive = self.pos.y.abs() < screen_height() * 0.51 + self.radius
|
||||
&& self.pos.x.abs() < screen_width() * 0.51 + self.radius;
|
||||
// if self.alive {
|
||||
self.pos += self.vel * get_frame_time();
|
||||
self.rot += self.omega * get_frame_time();
|
||||
if self.pos.x.abs() > screen_width() * 0.5 + self.radius {
|
||||
self.pos.x *= -1.;
|
||||
}
|
||||
if self.pos.y.abs() > screen_height() * 0.5 + self.radius {
|
||||
self.pos.y *= -1.;
|
||||
}
|
||||
// self.alive = self.pos.y.abs() < screen_height() * 0.51 + self.radius
|
||||
// && self.pos.x.abs() < screen_width() * 0.51 + self.radius;
|
||||
// }
|
||||
}
|
||||
|
||||
// pub fn is_visible(&self) -> bool {
|
||||
// }
|
||||
|
||||
pub fn draw(&self) {
|
||||
draw_poly_lines(
|
||||
self.pos.x,
|
||||
|
@ -86,7 +84,11 @@ impl Asteroid {
|
|||
self.sides,
|
||||
self.radius,
|
||||
self.rot,
|
||||
2.,
|
||||
match self.size {
|
||||
AsteroidSize::Large => 2.,
|
||||
AsteroidSize::Medium => 1.2,
|
||||
AsteroidSize::Small => 0.8,
|
||||
},
|
||||
WHITE,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ use world::World;
|
|||
async fn main() {
|
||||
rand::srand(macroquad::miniquad::date::now() as _);
|
||||
let cam = Camera2D {
|
||||
zoom: vec2(2. / screen_width(), 2. / screen_height()),
|
||||
zoom: vec2(2. / screen_width(), -2. / screen_height()),
|
||||
..Default::default()
|
||||
};
|
||||
set_camera(&cam);
|
||||
|
@ -20,9 +20,10 @@ async fn main() {
|
|||
|
||||
loop {
|
||||
clear_background(BLACK);
|
||||
world.update();
|
||||
if !world.over {
|
||||
world.update();
|
||||
}
|
||||
world.draw();
|
||||
|
||||
next_frame().await
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ pub struct Player {
|
|||
bullets: Vec<Bullet>,
|
||||
last_shot: f32,
|
||||
shot_interval: f32,
|
||||
alive: bool,
|
||||
}
|
||||
|
||||
impl Player {
|
||||
|
@ -22,13 +23,23 @@ impl Player {
|
|||
rot: PI / 2.,
|
||||
drag: 0.001,
|
||||
shot_interval: 0.3,
|
||||
alive: true,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn check_player_collision(&mut self, asteroid: &mut Asteroid) -> bool {
|
||||
if asteroid.check_collision(self.pos, 8.) {
|
||||
self.alive = false;
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
pub fn check_bullet_collisions(&mut self, asteroid: &mut Asteroid) -> bool {
|
||||
for bullet in &mut self.bullets {
|
||||
if asteroid.check_collision(bullet.pos) {
|
||||
if asteroid.check_collision(bullet.pos, 0.) {
|
||||
asteroid.alive = false;
|
||||
bullet.alive = false;
|
||||
return true;
|
||||
}
|
||||
|
@ -39,11 +50,11 @@ impl Player {
|
|||
pub fn update(&mut self) {
|
||||
let mut mag = 0.;
|
||||
if is_key_down(KeyCode::Right) {
|
||||
self.rot -= 5. * get_frame_time();
|
||||
self.rot += 5. * get_frame_time();
|
||||
self.dir = vec2(self.rot.cos(), self.rot.sin());
|
||||
}
|
||||
if is_key_down(KeyCode::Left) {
|
||||
self.rot += 5. * get_frame_time();
|
||||
self.rot -= 5. * get_frame_time();
|
||||
self.dir = vec2(self.rot.cos(), self.rot.sin());
|
||||
}
|
||||
if is_key_down(KeyCode::Up) {
|
||||
|
|
22
src/world.rs
22
src/world.rs
|
@ -8,6 +8,8 @@ use macroquad::{prelude::*, rand::gen_range};
|
|||
pub struct World {
|
||||
player: Player,
|
||||
asteroids: Vec<Asteroid>,
|
||||
pub score: i32,
|
||||
pub over: bool,
|
||||
}
|
||||
|
||||
impl World {
|
||||
|
@ -23,7 +25,11 @@ impl World {
|
|||
let mut to_add: Vec<Asteroid> = Vec::new();
|
||||
for asteroid in &mut self.asteroids {
|
||||
asteroid.update();
|
||||
if self.player.check_player_collision(asteroid) {
|
||||
self.over = true;
|
||||
}
|
||||
if self.player.check_bullet_collisions(asteroid) {
|
||||
self.score += 1;
|
||||
match asteroid.size {
|
||||
AsteroidSize::Large => {
|
||||
let rand = vec2(gen_range(-50., 50.), gen_range(-50., 50.));
|
||||
|
@ -57,7 +63,14 @@ impl World {
|
|||
}
|
||||
self.asteroids.append(&mut to_add);
|
||||
self.asteroids.retain(|asteroid| asteroid.alive);
|
||||
if self.asteroids.len() < 5 {
|
||||
if self.asteroids.iter().fold(0, |acc, x| {
|
||||
acc + match x.size {
|
||||
AsteroidSize::Large => 4,
|
||||
AsteroidSize::Medium => 2,
|
||||
AsteroidSize::Small => 1,
|
||||
}
|
||||
}) < 20
|
||||
{
|
||||
self.asteroids.push(Asteroid::new(AsteroidSize::Large));
|
||||
}
|
||||
}
|
||||
|
@ -67,5 +80,12 @@ impl World {
|
|||
for asteroid in &self.asteroids {
|
||||
asteroid.draw();
|
||||
}
|
||||
draw_text(
|
||||
&format!("Score {}", self.score),
|
||||
20. - screen_width() * 0.5,
|
||||
30. - screen_height() * 0.5,
|
||||
32.,
|
||||
WHITE,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue