Jay! Works now!

This commit is contained in:
2015-11-20 17:31:18 +01:00
parent 0acb7c224d
commit ad75b2fbfa
3 changed files with 103 additions and 88 deletions

View File

@@ -5,6 +5,7 @@ extern crate sdl2_image;
use std::path::Path; use std::path::Path;
use std::thread::sleep_ms; use std::thread::sleep_ms;
use std::cell::RefCell;
use sdl2_image::LoadTexture; use sdl2_image::LoadTexture;
use sdl2::rect::Rect; use sdl2::rect::Rect;
@@ -46,67 +47,90 @@ const PLAYER_ACCELERATION_X_CHANGE : f32 = 0.06;
struct GameObject<'a> { struct GameObject<'a> {
pub x: f32, pub x: f32,
pub y: f32, pub y: f32,
pub w: u32,
pub h: u32,
pub dx: f32, pub dx: f32,
pub dy: f32, pub dy: f32,
pub gravity: f32, pub gravity: f32,
pub on_ground: bool, pub on_ground: bool,
physics: Box<PhysicsComponent + 'a>,
graphics: Box<GraphicsComponent + 'a> graphics: Box<GraphicsComponent + 'a>
} }
impl<'a> GameObject<'a> { impl<'a> GameObject<'a> {
pub fn new(x: f32, y: f32, graphics: Box<GraphicsComponent + 'a>) -> GameObject<'a> { pub fn new(x: f32, y: f32, physics: Box<PhysicsComponent + 'a>, graphics: Box<GraphicsComponent + 'a>) -> GameObject<'a> {
GameObject { GameObject {
x: x, x: x,
y: y, y: y,
w: 32,
h: 32,
dx: 0.0, dx: 0.0,
dy: 0.0, dy: 0.0,
gravity: 0.3, gravity: 0.3,
on_ground: false, on_ground: false,
physics: physics,
graphics: graphics graphics: graphics
} }
} }
pub fn update(&self, elapsed: u64) { pub fn update(&self, elapsed: u64) {
self.physics.update(self, elapsed);
self.graphics.update(self, elapsed); self.graphics.update(self, elapsed);
} }
pub fn render(&self, renderer: &Renderer) { pub fn render(&self, renderer: &mut Renderer, destination: &Rect) {
self.graphics.render(self, renderer); self.physics.render(self, renderer, destination);
self.graphics.render(self, renderer, destination);
}
pub fn to_rect(&self) -> Rect {
Rect::new_unwrap(self.x as i32, self.y as i32, 32, 32)
}
}
trait PhysicsComponent {
fn update(&self, &GameObject, u64);
fn render(&self, &GameObject, &mut Renderer, &Rect);
}
struct PlayerPhysicsComponent;
impl PhysicsComponent for PlayerPhysicsComponent {
fn update(&self, object: &GameObject, elapsed: u64) {
}
fn render(&self, object: &GameObject, renderer: &mut Renderer, destination: &Rect) {
} }
} }
trait GraphicsComponent { trait GraphicsComponent {
fn update(&self, &GameObject, u64); fn update(&self, &GameObject, u64);
fn render(&self, &GameObject, &Renderer); fn render(&self, &GameObject, &mut Renderer, &Rect);
} }
struct PlayerGraphicsComponent<'a> { struct PlayerGraphicsComponent<'a> {
sprite_running: Box<Sprite + 'a> sprite_running: RefCell<Box<Sprite + 'a>>
} }
impl<'a> PlayerGraphicsComponent<'a> { impl<'a> PlayerGraphicsComponent<'a> {
pub fn new(texture: &'a Texture) -> PlayerGraphicsComponent<'a> { pub fn new(texture: &'a Texture) -> PlayerGraphicsComponent<'a> {
PlayerGraphicsComponent { PlayerGraphicsComponent {
sprite_running: Box::new(AnimatedSprite::new(&texture, 96, 32, 3, 15)) sprite_running: RefCell::new(Box::new(AnimatedSprite::new(&texture, 96, 32, 3, 10)))
} }
} }
} }
impl<'a> GraphicsComponent for PlayerGraphicsComponent<'a> { impl<'a> GraphicsComponent for PlayerGraphicsComponent<'a> {
fn update(&self, object: &GameObject, elapsed: u64) { fn update(&self, object: &GameObject, elapsed: u64) {
self.sprite_running.borrow_mut().update(elapsed);
} }
fn render(&self, object: &GameObject, renderer: &Renderer) { fn render(&self, object: &GameObject, renderer: &mut Renderer, destination: &Rect) {
println!("epic shit!"); self.sprite_running.borrow().render(renderer, destination);
} }
} }
@@ -136,10 +160,7 @@ fn main() {
let player_sprites = renderer.load_texture(&Path::new("gfx/mario.png")).unwrap(); let player_sprites = renderer.load_texture(&Path::new("gfx/mario.png")).unwrap();
// new shit! let mut player = GameObject::new(390.0, 390.0, Box::new(PlayerPhysicsComponent), Box::new(PlayerGraphicsComponent::new(&player_sprites)));
let mut _player = GameObject::new(390.0, 390.0, Box::new(PlayerGraphicsComponent::new(&player_sprites)));
let mut player_sprite = AnimatedSprite::new(&player_sprites, 96, 32, 3, 15);
let mut keyboard = KeyboardHandler::new(); let mut keyboard = KeyboardHandler::new();
@@ -288,55 +309,61 @@ fn main() {
break 'main; break 'main;
} }
if keyboard.is_held(Keycode::Right) && (_player.dx >= 0.0 || _player.on_ground) { if keyboard.is_held(Keycode::Right) && (player.dx >= 0.0 || player.on_ground) {
let a = if _player.dx > 0.0 { let a = if player.dx > 0.0 {
PLAYER_ACCELERATION_X_START PLAYER_ACCELERATION_X_START
} else { } else {
PLAYER_ACCELERATION_X_CHANGE PLAYER_ACCELERATION_X_CHANGE
}; };
_player.dx = a * PLAYER_SPEED_X + (1.0 - a) * _player.dx; player.dx = a * PLAYER_SPEED_X + (1.0 - a) * player.dx;
// _player_sprite.flip = (false, false); // _player_sprite.flip = (false, false);
} else if keyboard.is_held(Keycode::Left) && (_player.dx <= 0.0 || _player.on_ground) { } else if keyboard.is_held(Keycode::Left) && (player.dx <= 0.0 || player.on_ground) {
let a = if _player.dx < 0.0 { let a = if player.dx < 0.0 {
PLAYER_ACCELERATION_X_START PLAYER_ACCELERATION_X_START
} else { } else {
PLAYER_ACCELERATION_X_CHANGE PLAYER_ACCELERATION_X_CHANGE
}; };
_player.dx = a * -PLAYER_SPEED_X + (1.0 - a) * _player.dx; player.dx = a * -PLAYER_SPEED_X + (1.0 - a) * player.dx;
// _player_sprite.flip = (true, false); // _player_sprite.flip = (true, false);
} else if _player.on_ground { } else if player.on_ground {
_player.dx = (1.0 - PLAYER_ACCELERATION_X_STOP) * _player.dx; player.dx = (1.0 - PLAYER_ACCELERATION_X_STOP) * player.dx;
if _player.dx.abs() <= PLAYER_THRESHOLD_X { if player.dx.abs() <= PLAYER_THRESHOLD_X {
_player.dx = 0.0; player.dx = 0.0;
} }
} }
if _player.on_ground { if player.on_ground {
if keyboard.was_pressed(Keycode::Up) { if keyboard.was_pressed(Keycode::Up) {
_player.dy = -8.0; player.dy = -8.0;
_player.on_ground = false; player.on_ground = false;
} }
} }
if keyboard.was_released(Keycode::Up) { if keyboard.was_released(Keycode::Up) {
if _player.dy < -4.0 { if player.dy < -4.0 {
_player.dy = -4.0; player.dy = -4.0;
} }
} }
while lag >= MS_PER_UPDATE { while lag >= MS_PER_UPDATE {
_player.update(); player.dy += player.gravity;
_player.on_ground = false; if player.dy > 8.0 {
player.dy = 8.0;
} else if player.dy < -8.0 {
player.dy = -8.0;
}
if let Some(intersect) = layer.find_intersecting(&_player.to_rect()) { player.on_ground = false;
if _player.dx > 0.0 {
let p = _player.x + _player.w as f32; if let Some(intersect) = layer.find_intersecting(&player.to_rect()) {
let mut d = _player.dx; if player.dx > 0.0 {
let p = player.x + player.w as f32;
let mut d = player.dx;
for y in intersect.y()..(intersect.y() + intersect.height() as i32) { for y in intersect.y()..(intersect.y() + intersect.height() as i32) {
let mut x = intersect.x(); let mut x = intersect.x();
@@ -363,16 +390,16 @@ fn main() {
} }
if d > 0.0 { if d > 0.0 {
_player.x += d; player.x += d;
} else if d < 0.0 { } else if d < 0.0 {
_player.x += d; player.x += d;
_player.dx = 0.0; player.dx = 0.0;
} else { } else {
_player.dx = 0.0; player.dx = 0.0;
} }
} else if _player.dx < 0.0 { } else if player.dx < 0.0 {
let p = _player.x; let p = player.x;
let mut d = _player.dx; let mut d = player.dx;
for y in intersect.y()..(intersect.y() + intersect.height() as i32) { for y in intersect.y()..(intersect.y() + intersect.height() as i32) {
let mut x = intersect.x(); let mut x = intersect.x();
@@ -399,18 +426,18 @@ fn main() {
} }
if d < 0.0 { if d < 0.0 {
_player.x += d; player.x += d;
} else if d > 0.0 { } else if d > 0.0 {
_player.x += d; player.x += d;
_player.dx = 0.0; player.dx = 0.0;
} else { } else {
_player.dx = 0.0; player.dx = 0.0;
} }
} }
if _player.dy > 0.0 { if player.dy > 0.0 {
let p = _player.y + _player.h as f32; let p = player.y + player.h as f32;
let mut d = _player.dy; let mut d = player.dy;
for x in intersect.x()..(intersect.x() + intersect.width() as i32) { for x in intersect.x()..(intersect.x() + intersect.width() as i32) {
let mut y = intersect.y(); let mut y = intersect.y();
@@ -437,20 +464,20 @@ fn main() {
} }
if d > 0.0 { if d > 0.0 {
_player.y += d; player.y += d;
} else if d < 0.0 { } else if d < 0.0 {
_player.y += d; player.y += d;
_player.dy = 0.0; player.dy = 0.0;
_player.on_ground = true; player.on_ground = true;
} else { } else {
_player.dy = 0.0; player.dy = 0.0;
_player.on_ground = true; player.on_ground = true;
} }
} else if _player.dy < 0.0 { } else if player.dy < 0.0 {
let p = _player.y; let p = player.y;
let mut d = _player.dy; let mut d = player.dy;
for x in intersect.x()..(intersect.x() + intersect.width() as i32) { for x in intersect.x()..(intersect.x() + intersect.width() as i32) {
let mut y = intersect.y(); let mut y = intersect.y();
@@ -477,19 +504,19 @@ fn main() {
} }
if d < 0.0 { if d < 0.0 {
_player.y += d; player.y += d;
} else if d > 0.0 { } else if d > 0.0 {
_player.y += d; player.y += d;
_player.dy = 0.0; player.dy = 0.0;
} else { } else {
_player.dy = 0.0; player.dy = 0.0;
} }
} }
} }
// player_sprite.update(elapsed); player.update(elapsed);
camera.center(&_player.to_rect()); camera.center(&player.to_rect());
lag -= MS_PER_UPDATE; lag -= MS_PER_UPDATE;
} }
@@ -514,10 +541,7 @@ fn main() {
let player_rect = camera_relative_rect(&camera.to_rect(), &player.to_rect()); let player_rect = camera_relative_rect(&camera.to_rect(), &player.to_rect());
// new shit! player.render(&mut renderer, &player_rect);
// _player.render(&renderer);
player_sprite.render(&mut renderer, &player_rect);
renderer.present(); renderer.present();

View File

@@ -62,22 +62,14 @@ impl<'a> AnimatedSprite<'a> {
impl<'a> Sprite for AnimatedSprite<'a> { impl<'a> Sprite for AnimatedSprite<'a> {
fn update(&mut self, elapsed: u64) { fn update(&mut self, elapsed: u64) {
self.time += elapsed; self.time += elapsed;
self.frame += (self.time / self.frame_time) as u32;
if self.time > self.frame_time { self.frame %= self.frames;
self.frame += 1; self.time %= self.frame_time;
self.time = 0;
if self.frame < self.frames {
self.x += 16;
} else {
self.x -= 16 * (self.frames - 1) as i32;
self.frame = 0;
}
}
} }
fn render(&self, drawer: &mut Renderer, destination: &Rect) { fn render(&self, drawer: &mut Renderer, destination: &Rect) {
drawer.copy_ex(self.texture, Some(Rect::new_unwrap(self.x, self.y, 16, 16)), Some(*destination), 0.0, None, self.flip); let x = self.x + (self.frame * 16) as i32;
drawer.copy_ex(self.texture, Some(Rect::new_unwrap(x, self.y, 16, 16)), Some(*destination), 0.0, None, self.flip);
} }
} }

View File

@@ -1,5 +1,4 @@
use std::iter::repeat; use std::iter::repeat;
//use std::cmp::{min, max};
use sdl2::rect::Rect; use sdl2::rect::Rect;