parent
94ce0bcd30
commit
f844982553
@ -1,52 +0,0 @@
|
|||||||
use crate::entstate::EntState;
|
|
||||||
use sfml::graphics::Sprite;
|
|
||||||
use sfml::graphics::Transformable;
|
|
||||||
use ncollide2d::partitioning::BVT;
|
|
||||||
use ncollide2d::bounding_volume::AABB;
|
|
||||||
use ncollide2d::bounding_volume;
|
|
||||||
use std::cell::Ref;
|
|
||||||
|
|
||||||
pub struct Collision<'a> {
|
|
||||||
dynamic_bvh : Option<BVT<&'a Sprite<'a>, AABB<f64>>>,
|
|
||||||
static_bvh : Option<BVT<&'a Sprite<'a>, AABB<f64>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
impl<'a> Collision<'a> {
|
|
||||||
pub fn new() -> Collision<'a> {
|
|
||||||
Collision {
|
|
||||||
dynamic_bvh: Option::None,
|
|
||||||
static_bvh: Option::None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn gen_bvt(mut self, entity_state: &'a EntState<'a>) {
|
|
||||||
|
|
||||||
// let mut dynamic_sprites: Vec<(&'a Sprite<'a>, AABB<f64>)>= (Vec::new());
|
|
||||||
// {
|
|
||||||
// let vec = entity_state.dynamic_entities.borrow();
|
|
||||||
// for i in vec.iter() {
|
|
||||||
// let bounds = i.global_bounds();
|
|
||||||
// let pos = i.position();
|
|
||||||
// let volume = bounding_volume::AABB::new(na::Point2::new(pos.x as f64, pos.y as f64),
|
|
||||||
// na::Point2::new((pos.x + bounds.width) as f64, (pos.y + bounds.width) as f64));
|
|
||||||
//
|
|
||||||
// dynamic_sprites.push((i, volume));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// self.dynamic_bvh = Some(BVT::new_balanced(dynamic_sprites));
|
|
||||||
|
|
||||||
// let mut static_sprites: Vec<(&Sprite, AABB<f64>)> = Vec::new();
|
|
||||||
// {
|
|
||||||
// for i in self.static_entities {
|
|
||||||
// let bounds = i.local_bounds();
|
|
||||||
// let pos = i.position();
|
|
||||||
// let volume = bounding_volume::AABB::new(na::Point2::new(pos.x as f64, pos.y as f64),
|
|
||||||
// na::Point2::new((pos.x + bounds.width) as f64, (pos.y + bounds.width) as f64));
|
|
||||||
//
|
|
||||||
// static_sprites.push((i, volume));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// self.static_bvh = Some(BVT::new_balanced(static_sprites));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,131 +0,0 @@
|
|||||||
use std::collections::HashMap;
|
|
||||||
use sfml::graphics::Texture;
|
|
||||||
use crate::util;
|
|
||||||
use std::fs::File;
|
|
||||||
use std::io::BufReader;
|
|
||||||
use std::io::BufRead;
|
|
||||||
use sfml::graphics::Sprite;
|
|
||||||
use sfml::graphics::Transformable;
|
|
||||||
use std::cell::RefCell;
|
|
||||||
use crate::player::Player;
|
|
||||||
use ncollide2d::partitioning::BVT;
|
|
||||||
use ncollide2d::bounding_volume::AABB;
|
|
||||||
use crate::resources::Resources;
|
|
||||||
use ncollide2d::bounding_volume;
|
|
||||||
use std::rc::Rc;
|
|
||||||
|
|
||||||
|
|
||||||
pub struct EntState<'a> {
|
|
||||||
pub dynamic_entities: Rc<RefCell<Vec< Sprite<'a> >>>,
|
|
||||||
pub static_entities : Rc<RefCell<Vec< Sprite<'a> >>>,
|
|
||||||
pub player : Player<'a>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> EntState<'a> {
|
|
||||||
|
|
||||||
pub fn new() -> EntState<'a> {
|
|
||||||
EntState{
|
|
||||||
dynamic_entities: Rc::new(RefCell::new(Vec::new())),
|
|
||||||
static_entities: Rc::new(RefCell::new(Vec::new())),
|
|
||||||
player: Player::new(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub fn read_static_entities(mut self, filename: String, resources: &'a Resources) {
|
|
||||||
|
|
||||||
let mut sprite : Sprite = Sprite::new();
|
|
||||||
sprite.set_texture(&resources.spritesheet_text, false);
|
|
||||||
sprite.set_texture_rect(&util::grab_sheet_rec(String::from("blockBrown.png"), &resources.spritesheet_desc));
|
|
||||||
sprite.set_position((0.0,0.0));
|
|
||||||
|
|
||||||
//self.static_entities.get_mut().push(sprite);
|
|
||||||
|
|
||||||
// let file = File::open(filename).expect("Could not open file");
|
|
||||||
//
|
|
||||||
// let mut first_line: bool = true;
|
|
||||||
// let mut w: f32 = 0.0;
|
|
||||||
// let mut h: f32 = 0.0;
|
|
||||||
//
|
|
||||||
// let mut x: i32;
|
|
||||||
// let mut y: i32 = 0;
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// for line in BufReader::new(file).lines() {
|
|
||||||
//
|
|
||||||
// if first_line {
|
|
||||||
//
|
|
||||||
// first_line = !first_line;
|
|
||||||
// let val = line.unwrap();
|
|
||||||
// let arr : Vec<&str> = val.split_whitespace().collect();
|
|
||||||
//
|
|
||||||
// w = arr.get(0).unwrap().parse::<f32>().unwrap();
|
|
||||||
// h = arr.get(1).unwrap().parse::<f32>().unwrap();
|
|
||||||
//
|
|
||||||
// } else {
|
|
||||||
//
|
|
||||||
// x = 0;
|
|
||||||
//
|
|
||||||
// let val = line.unwrap();
|
|
||||||
// for i in val.split_whitespace() {
|
|
||||||
// match i.parse::<i32>().unwrap() {
|
|
||||||
// 0 => {
|
|
||||||
// // Do nothing for now
|
|
||||||
// }
|
|
||||||
// 1 => {
|
|
||||||
// let mut sprite : Sprite<'a> = Sprite::new();
|
|
||||||
// sprite.set_texture(&self.spritesheet_text, false);
|
|
||||||
// sprite.set_texture_rect(&util::grab_sheet_rec(String::from("blockBrown.png"), &self.spritesheet_desc));
|
|
||||||
// sprite.set_position((x as f32 * w, y as f32 * h));
|
|
||||||
//
|
|
||||||
// self.static_entities.push(RefCell::new(sprite));
|
|
||||||
// }
|
|
||||||
// _ => {
|
|
||||||
// panic!("ahhhhhh");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// x += 1;
|
|
||||||
// }
|
|
||||||
// y += 1;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
// pub fn read_dynamic_entities(&'a mut self, filename: String) {
|
|
||||||
//
|
|
||||||
// let file = File::open(filename).expect("Could not open file");
|
|
||||||
//
|
|
||||||
// for line in BufReader::new(file).lines() {
|
|
||||||
//
|
|
||||||
// let val = line.unwrap();
|
|
||||||
// let arr : Vec<&str> = val.split_whitespace().collect();
|
|
||||||
//
|
|
||||||
// let e = arr.get(0).unwrap();
|
|
||||||
// let x = arr.get(1).unwrap().parse::<f32>().unwrap();
|
|
||||||
// let y = arr.get(2).unwrap().parse::<f32>().unwrap();
|
|
||||||
//
|
|
||||||
// match *e {
|
|
||||||
// "enemy" => {
|
|
||||||
// let mut sprite = Sprite::new();
|
|
||||||
// sprite.set_texture(&self.spritesheet_text, false);
|
|
||||||
// sprite.set_texture_rect(&util::grab_sheet_rec(String::from("enemyFloating_1.png"), &self.spritesheet_desc));
|
|
||||||
// sprite.set_position((x, y));
|
|
||||||
//
|
|
||||||
// self.dynamic_entities.push(RefCell::new(sprite));
|
|
||||||
// }
|
|
||||||
// "player" => {
|
|
||||||
// let mut sprite = Sprite::new();
|
|
||||||
// sprite.set_texture(&self.spritesheet_text, false);
|
|
||||||
// sprite.set_texture_rect(&util::grab_sheet_rec(String::from("playerBlue_up3.png"), &self.spritesheet_desc));
|
|
||||||
// sprite.set_position((x, y));
|
|
||||||
//
|
|
||||||
// self.dynamic_entities.push(RefCell::new(sprite));
|
|
||||||
// }
|
|
||||||
// _ => {
|
|
||||||
// // Do nothing
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
@ -1,133 +0,0 @@
|
|||||||
use sfml::system::Vector2;
|
|
||||||
use sfml::graphics::{CircleShape, Color, Drawable,
|
|
||||||
RenderStates, RenderTarget};
|
|
||||||
use sfml::graphics::Transformable;
|
|
||||||
use sfml::graphics::Shape;
|
|
||||||
use sfml::graphics::Sprite;
|
|
||||||
use ncollide2d::bounding_volume::AABB;
|
|
||||||
use sfml::graphics::FloatRect;
|
|
||||||
|
|
||||||
pub struct Player<'s> {
|
|
||||||
head: CircleShape<'s>,
|
|
||||||
delta: Vector2<f32>,
|
|
||||||
pub pos: Vector2<f32>,
|
|
||||||
|
|
||||||
default_impulse: f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'s> Player<'s> {
|
|
||||||
pub fn impulse(&mut self, delta_v: &Vector2<f32>) {
|
|
||||||
self.delta.x += delta_v.x * self.default_impulse;
|
|
||||||
self.delta.y += delta_v.y * self.default_impulse;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn velocity(&mut self, delta_v: &Vector2<f32>) {
|
|
||||||
self.delta.x = delta_v.x * self.default_impulse;
|
|
||||||
self.delta.y = delta_v.y * self.default_impulse;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn collision(&mut self, objects: &Vec<&Sprite>, delta_t: f32) -> FloatRect {
|
|
||||||
|
|
||||||
let mut collided = FloatRect::new(0.0,0.0,0.0,0.0);
|
|
||||||
let (_, future_bounding) = self.future_bounding_aabb(delta_t);
|
|
||||||
|
|
||||||
for i in objects {
|
|
||||||
match future_bounding.intersection(&i.global_bounds()) {
|
|
||||||
Some(overlap) => {
|
|
||||||
|
|
||||||
// Get the bounds of the object we're intersecting
|
|
||||||
let intersector = &i.global_bounds();
|
|
||||||
|
|
||||||
let bounding_box = future_bounding;
|
|
||||||
|
|
||||||
|
|
||||||
let mut deflection = self.delta;
|
|
||||||
let mut reposition = self.pos;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if overlap.width < overlap.height {
|
|
||||||
|
|
||||||
if bounding_box.left + bounding_box.width >= intersector.left &&
|
|
||||||
bounding_box.left < intersector.left {
|
|
||||||
deflection.x = -0.1 * delta_t;
|
|
||||||
reposition.x = intersector.left - bounding_box.width - 1.0;
|
|
||||||
} else if bounding_box.left <= intersector.left + intersector.width &&
|
|
||||||
bounding_box.left + bounding_box.width > intersector.left + bounding_box.width {
|
|
||||||
deflection.x = 0.1 * delta_t;
|
|
||||||
reposition.x = intersector.left + intersector.width + 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if bounding_box.top + bounding_box.height >= intersector.top &&
|
|
||||||
bounding_box.top < intersector.top {
|
|
||||||
deflection.y = -0.1 * delta_t;
|
|
||||||
reposition.y = intersector.top - bounding_box.height - 1.0;
|
|
||||||
} else if bounding_box.top <= intersector.top + intersector.height &&
|
|
||||||
bounding_box.top + bounding_box.height > intersector.top + bounding_box.height{
|
|
||||||
deflection.y = 0.1 * delta_t;
|
|
||||||
reposition.y = intersector.top + intersector.height + 1.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.head.set_position(reposition);
|
|
||||||
self.pos = reposition;
|
|
||||||
self.velocity(&deflection);
|
|
||||||
collided = overlap;
|
|
||||||
},
|
|
||||||
None => continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return collided;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn future_bounding_aabb(&mut self, delta_t: f32) -> (AABB<f64>, FloatRect) {
|
|
||||||
|
|
||||||
let mut bounds = self.head.global_bounds();
|
|
||||||
bounds.left += self.delta.x * delta_t * 8.0;
|
|
||||||
bounds.top += self.delta.y * delta_t * 8.0;
|
|
||||||
|
|
||||||
let a = na::Point2::new(bounds.left as f64, bounds.top as f64);
|
|
||||||
let b = na::Point2::new((bounds.left + bounds.width) as f64, (bounds.top + bounds.height) as f64);
|
|
||||||
(AABB::new(a, b), bounds)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update(&mut self, delta_t: f32) {
|
|
||||||
self.pos.x += self.delta.x * delta_t * 8.0;
|
|
||||||
self.pos.y += self.delta.y * delta_t * 8.0;
|
|
||||||
//println!("{:?}", self.delta);
|
|
||||||
let friction = 10.0;
|
|
||||||
let ratio = 1.0 / (1.0 + delta_t * friction);
|
|
||||||
self.delta *= ratio;
|
|
||||||
|
|
||||||
// Gravity
|
|
||||||
// self.delta.y += 45.0 * delta_t;
|
|
||||||
|
|
||||||
self.head.set_position((self.pos.x, self.pos.y));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new() -> Self {
|
|
||||||
|
|
||||||
let mut delta = Vector2::new(0.0, 0.0);
|
|
||||||
let mut pos = Vector2::new(0.0, 0.0);
|
|
||||||
|
|
||||||
let mut head = CircleShape::new(10.0, 10);
|
|
||||||
head.set_position((delta.x, delta.y));
|
|
||||||
head.set_fill_color(&Color::RED);
|
|
||||||
|
|
||||||
Self { head, delta, pos,
|
|
||||||
default_impulse: 10.0}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'s> Drawable for Player<'s> {
|
|
||||||
fn draw<'a: 'shader, 'texture, 'shader, 'shader_texture>(
|
|
||||||
&'a self,
|
|
||||||
render_target: &mut RenderTarget,
|
|
||||||
_: RenderStates<'texture, 'shader, 'shader_texture>,
|
|
||||||
) {
|
|
||||||
render_target.draw(&self.head);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
use crate::util;
|
|
||||||
use sfml::graphics::Texture;
|
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
pub struct Resources {
|
|
||||||
pub spritesheet_desc : HashMap<String, HashMap<String, i32>>,
|
|
||||||
pub spritesheet_text : Texture,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Resources {
|
|
||||||
pub fn new() -> Resources {
|
|
||||||
Resources {
|
|
||||||
|
|
||||||
spritesheet_desc: util::read_spritesheet(String::from("spritesheet_complete.xml")),
|
|
||||||
spritesheet_text: Texture::from_file("spritesheet_complete.png")
|
|
||||||
.expect("Couldn't load texture")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,51 @@
|
|||||||
|
use sfml::window::{Key, Event};
|
||||||
|
use sfml::graphics::{
|
||||||
|
CircleShape, Color, Drawable, RectangleShape, RenderStates, RenderTarget, RenderWindow, Shape,
|
||||||
|
Transformable,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Slider<'a> {
|
||||||
|
value: f32,
|
||||||
|
left_button: RectangleShape<'a>,
|
||||||
|
right_button: RectangleShape<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Slider<'a> {
|
||||||
|
|
||||||
|
pub fn new(y_position: f32, value: Option<f32>) -> Self {
|
||||||
|
|
||||||
|
let val = match value {
|
||||||
|
Some(v) => v,
|
||||||
|
None => 0.0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut slider = Slider {
|
||||||
|
value: val,
|
||||||
|
left_button: RectangleShape::new(),
|
||||||
|
right_button: RectangleShape::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
slider.left_button.set_position((0.0,y_position));
|
||||||
|
slider.right_button.set_position((50.0,y_position));
|
||||||
|
|
||||||
|
slider.left_button.set_size((20.0, 30.0));
|
||||||
|
slider.right_button.set_size((20.0, 30.0));
|
||||||
|
|
||||||
|
slider.left_button.set_fill_color(&sfml::graphics::Color::GREEN);
|
||||||
|
slider.right_button.set_fill_color(&sfml::graphics::Color::GREEN);
|
||||||
|
|
||||||
|
slider
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'s> Drawable for Slider<'s> {
|
||||||
|
fn draw<'a: 'shader, 'texture, 'shader, 'shader_texture>(
|
||||||
|
&'a self,
|
||||||
|
render_target: &mut RenderTarget,
|
||||||
|
_: RenderStates<'texture, 'shader, 'shader_texture>,
|
||||||
|
) {
|
||||||
|
render_target.draw(&self.left_button);
|
||||||
|
render_target.draw(&self.right_button)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue