use cgmath::Point3; use rapier2d::{ dynamics::{RigidBody, RigidBodyBuilder, RigidBodyHandle}, geometry::{ColliderBuilder, ColliderHandle}, }; use crate::{ physics::util, render::{Sprite, SpriteTexture}, }; pub struct ProjectileBuilder { pub rigid_body: RigidBodyBuilder, pub collider: ColliderBuilder, pub sprite: SpriteTexture, pub lifetime: f32, pub size: f32, pub damage: f32, } impl ProjectileBuilder { pub fn build(self, r: RigidBodyHandle, c: ColliderHandle) -> Projectile { Projectile { rigid_body: r, collider: c, sprite: self.sprite, lifetime: self.lifetime, size: self.size, damage: self.damage, } } } #[derive(Debug)] pub struct Projectile { pub rigid_body: RigidBodyHandle, pub collider: ColliderHandle, pub sprite: SpriteTexture, pub lifetime: f32, pub size: f32, pub damage: f32, } impl Projectile { pub fn tick(&mut self, t: f32) { self.lifetime -= t; } pub fn is_expired(&self) -> bool { return self.lifetime < 0.0; } pub fn get_sprite(&self, r: &RigidBody) -> Sprite { let pos = util::rigidbody_position(r); let ang = util::rigidbody_angle(r); Sprite { texture: self.sprite.clone(), pos: Point3 { x: pos.x, y: pos.y, z: 1.0, }, size: self.size, angle: ang, children: None, } } }