feat: Move everything to modules and add bullets

This commit is contained in:
uttarayan21
2024-06-19 04:25:52 +05:30
parent a70e64d8b7
commit 0bf3439cb8
5 changed files with 193 additions and 133 deletions
+27
View File
@@ -0,0 +1,27 @@
use macroquad::prelude::*;
/// The basic enemy data
/// This condaions just he enemy position
/// and the enemy class
/// The enemy just moves towards the player constantly if there's nothing in the way.
#[derive(Debug, Default)]
pub struct Enemy {
/// The current position of the enemy
pub pos: Vec2,
/// Health of the enemy
pub health: u32,
/// Velocity of the enemy moving towards the player // This is normalized to 1
pub velocity: Vec2,
}
impl Enemy {
pub fn new(pos: Vec2, health: u32, velocity: Vec2) -> Self {
Self {
pos,
health,
velocity,
}
}
pub fn draw(&self) {
draw_circle(self.pos.x, self.pos.y, 16.0, RED);
}
}
+46
View File
@@ -0,0 +1,46 @@
use macroquad::prelude::*;
/// The shot made by a player or an enemy
#[derive(Debug, Default)]
pub struct Bullet {
/// The position of the bullet
pos: Vec2,
/// The bullet travels at constant speed
speed: f32,
/// The damage the bullet does
damage: u32,
/// Source of the bullet
source: Vec2,
}
impl Bullet {
pub fn new(pos: Vec2, speed: f32, damage: u32, source: Vec2) -> Self {
Self {
pos,
speed,
damage,
source,
}
}
pub fn draw(&self) {
draw_circle(self.pos.x, self.pos.y, 4.0, GREEN);
}
/// Every tick the bullet moves in the direction it was shot from source by speed
pub fn tick(&mut self) {
self.pos += self.source.normalize() * self.speed;
}
/// Spawns a bullet to the mouse position from source
pub fn shoot(source: Vec2) -> Self {
let mouse = mouse_position();
let mouse = vec2(mouse.0, mouse.1);
Self {
pos: (source - mouse).normalize(),
speed: 10.0,
damage: 10,
source,
}
}
}
+5 -133
View File
@@ -1,13 +1,9 @@
#![allow(dead_code)] #![allow(dead_code)]
use macroquad::prelude::*; use macroquad::prelude::*;
use miniquad::window::screen_size; mod enemy;
mod gun;
#[derive(Debug, Default, Clone)] mod player;
pub struct Player { mod world;
pos: Vec2,
pointing: Vec2,
velocity: Vec2,
}
fn window_conf() -> Conf { fn window_conf() -> Conf {
Conf { Conf {
@@ -24,7 +20,7 @@ fn window_conf() -> Conf {
#[macroquad::main(window_conf)] #[macroquad::main(window_conf)]
async fn main() { async fn main() {
let mut cursor = Cursor::default(); let mut cursor = Cursor::default();
let mut world = World::new(); let mut world = world::World::new();
loop { loop {
world.handle_inputs(); world.handle_inputs();
@@ -37,36 +33,6 @@ async fn main() {
} }
} }
impl Player {
pub fn new(pos: Vec2, pointing: Vec2, velocity: Vec2) -> Self {
Self {
pos,
pointing,
velocity,
}
}
pub fn handle_inputs(&mut self) {
self.handle_mouse();
let distance = self.pos.distance(self.pointing);
// increase the velocity scaled to the distance
self.velocity = (self.pointing - self.pos).normalize() * distance / 15f32;
}
pub fn handle_mouse(&mut self) {
let mouse_pos = mouse_position();
self.pointing = vec2(mouse_pos.0, mouse_pos.1);
}
pub fn draw(&self) {
draw_circle(self.pos.x, self.pos.y, 16.0, BLUE);
}
pub fn move_with_velocity(&mut self) {
self.pos += self.velocity;
}
}
#[derive(Default)] #[derive(Default)]
pub struct Cursor { pub struct Cursor {
pos: Vec2, pos: Vec2,
@@ -87,97 +53,3 @@ impl Cursor {
); );
} }
} }
/// The basic enemy data
/// This condaions just he enemy position
/// and the enemy class
/// The enemy just moves towards the player constantly if there's nothing in the way.
pub struct Enemy {
/// The current position of the enemy
pos: Vec2,
/// Health of the enemy
health: u32,
/// Velocity of the enemy moving towards the player // This is normalized to 1
velocity: Vec2,
}
impl Enemy {
pub fn new(pos: Vec2, health: u32, velocity: Vec2) -> Self {
Self {
pos,
health,
velocity,
}
}
pub fn draw(&self) {
draw_circle(self.pos.x, self.pos.y, 16.0, RED);
}
}
/// The shot made by a player or an enemy
pub struct Bullet {
/// The position of the bullet
pos: Vec2,
/// The bullet travels at constant speed
speed: f32,
// velocity: Vec2,
damage: u32,
}
/// The world struct
/// This contains the player, the enemies, and the center of the world
pub struct World {
player: Player,
enemies: Vec<Enemy>,
center: Vec2,
size: Vec2,
}
impl World {
pub fn new() -> Self {
let (x, y) = screen_size();
let center = vec2(x / 2., y / 2.);
Self {
player: Player::new(center, center, center),
enemies: Vec::default(),
center,
size: vec2(x, y),
}
}
pub fn handle_inputs(&mut self) {
self.player.handle_inputs();
}
pub fn draw(&self) {
self.player.draw();
self.enemies.iter().for_each(|enemy| enemy.draw());
}
pub fn spawn_enemy(&mut self) {
let enemy = Enemy {
pos: random_vec2_in_bounds(self.size),
health: 100,
velocity: vec2(0., 0.),
};
self.enemies.push(enemy);
}
pub fn tick(&mut self) {
self.player.move_with_velocity();
let enemies_count = self.enemies.len();
if enemies_count < 10 && (macroquad::time::get_time() / (2 * enemies_count) as f64) > 1.0 {
self.spawn_enemy();
}
for enemy in self.enemies.iter_mut() {
enemy.velocity = (self.player.pos - enemy.pos).normalize();
enemy.pos += enemy.velocity;
}
}
}
fn random_vec2_in_bounds(bounds: Vec2) -> Vec2 {
vec2(
rand::gen_range(0.0, bounds.x),
rand::gen_range(0.0, bounds.y),
)
}
+38
View File
@@ -0,0 +1,38 @@
use macroquad::prelude::*;
#[derive(Debug, Default, Clone)]
pub struct Player {
pub pos: Vec2,
pub pointing: Vec2,
pub velocity: Vec2,
}
impl Player {
pub fn new(pos: Vec2, pointing: Vec2, velocity: Vec2) -> Self {
Self {
pos,
pointing,
velocity,
}
}
pub fn handle_inputs(&mut self) {
self.handle_mouse();
let distance = self.pos.distance(self.pointing);
// increase the velocity scaled to the distance
self.velocity = (self.pointing - self.pos).normalize() * distance / 15f32;
}
pub fn handle_mouse(&mut self) {
let mouse_pos = mouse_position();
self.pointing = vec2(mouse_pos.0, mouse_pos.1);
}
pub fn draw(&self) {
draw_circle(self.pos.x, self.pos.y, 16.0, BLUE);
}
pub fn move_with_velocity(&mut self) {
self.pos += self.velocity;
}
}
+77
View File
@@ -0,0 +1,77 @@
use macroquad::prelude::*;
use miniquad::window::screen_size;
use crate::enemy::Enemy;
use crate::gun::Bullet;
use crate::player::Player;
/// The world struct
/// This contains the player, the enemies, and the center of the world
#[derive(Debug, Default)]
pub struct World {
player: Player,
enemies: Vec<Enemy>,
bullets: Vec<Bullet>,
center: Vec2,
size: Vec2,
tick: u64,
}
impl World {
pub fn new() -> Self {
let (x, y) = screen_size();
let center = vec2(x / 2., y / 2.);
Self {
player: Player::new(center, center, center),
enemies: Vec::default(),
center,
size: vec2(x, y),
..Default::default()
}
}
pub fn handle_inputs(&mut self) {
self.player.handle_inputs();
}
pub fn draw(&self) {
self.player.draw();
self.enemies.iter().for_each(|enemy| enemy.draw());
self.bullets.iter().for_each(|bullet| bullet.draw());
}
pub fn spawn_enemy(&mut self) {
let enemy = Enemy {
pos: random_vec2_in_bounds(self.size),
health: 100,
velocity: vec2(0., 0.),
};
self.enemies.push(enemy);
}
pub fn tick(&mut self) {
self.tick += 1;
self.player.move_with_velocity();
let enemies_count = self.enemies.len();
if enemies_count < 10 && (macroquad::time::get_time() / (2 * enemies_count) as f64) > 1.0 {
self.spawn_enemy();
}
for enemy in self.enemies.iter_mut() {
enemy.velocity = (self.player.pos - enemy.pos).normalize();
enemy.pos += enemy.velocity;
}
for bullet in self.bullets.iter_mut() {
bullet.tick();
}
if self.tick % 12 == 0 {
self.bullets.push(Bullet::shoot(self.player.pos));
}
}
}
fn random_vec2_in_bounds(bounds: Vec2) -> Vec2 {
vec2(
rand::gen_range(0.0, bounds.x),
rand::gen_range(0.0, bounds.y),
)
}