Compare commits

..

7 Commits

4 changed files with 329 additions and 30 deletions

54
Cargo.lock generated
View File

@@ -14,6 +14,17 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "getrandom"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@@ -26,6 +37,42 @@ version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
[[package]]
name = "ppv-lite86"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
dependencies = [
"getrandom",
]
[[package]]
name = "sdl2"
version = "0.35.2"
@@ -53,6 +100,7 @@ dependencies = [
name = "test_sdl"
version = "0.1.0"
dependencies = [
"rand",
"sdl2",
]
@@ -61,3 +109,9 @@ name = "version-compare"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73"
[[package]]
name = "wasi"
version = "0.10.2+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"

View File

@@ -7,3 +7,4 @@ edition = "2021"
[dependencies]
sdl2 = "0.35.2"
rand = "0.8.5"

View File

@@ -1,6 +1,7 @@
# test_sdl
# Rusty Golfy
It is just a playground for me to test SDL2 features
A little game inspired by "Messing with sdl2" where I tested some mechanics.
The point is to have a Golf Game where you can shoot a ball against walls to get to a hole
## Run it
@@ -18,14 +19,18 @@ cargo run --release
## Controls
W,A,S,D and Arrow Keys are for moving around the ball.
W,A,S,D and Arrow Keys are for modifying the shot direction and force
Left Click teleports the ball to the cursors location.
[DEBUG] Left Click teleports the ball to the cursors location.
Right Click cancels any velocity of the ball.
[DEBUG] Right Click cancels any velocity of the ball.
Tab toggles a debug mode where you can see the actual vector applied to the ball wich is render as a cube to see its hitbox (maybe even more in the futur)
[DEBUG] Press R to randomize the map (you can maintain the key pressed if you want to kill a friend who has photosensitive epilepsy)
Spacebar doubles the acceleration (to use with moderation)
Tab toggles a debug mode where you can see the actual vector applied to the ball wich is render as a cube to see its hitbox and tiles borders
Bonus: Maintain the left click and moving(s) key(s) at the same time and it will store some momentum wich you can use when you release the click. Enjoy :)
Spacebar releases the ball and when preseed back, resets the position and velocity of the ball
## How to play
You can use your arrows keys or W,A,S,D to setup the launching angle and force and then press Space to release the ball and see it boucing around

View File

@@ -5,9 +5,10 @@ use sdl2::keyboard::Scancode;
use std::time::Duration;
use sdl2::rect::Point;
use sdl2::rect::Rect;
use rand::Rng;
const WINDOW_HEIGHT:i32 = 800;
const WINDOW_WIDTH:i32 = 500;
const WINDOW_WIDTH:i32 = 800;
const WINDOW_HEIGHT:i32 = 1000;
const BALL_SPEED:f32 = 3.0;
const MAX_SPEED:f32 = 60.0;
const DEBUG_FX_SIZE_RATIO:i32 = 2;
@@ -16,19 +17,169 @@ const BOUNCE_RATIO:f32 = 60.0;
const DEFAULT_BALL_WIDTH:i32 = 20;
const DEFAULT_START_BALL_LOCATION_X:i32 = WINDOW_WIDTH / 2 - DEFAULT_BALL_WIDTH / 2;
const DEFAULT_START_BALL_LOCATION_Y:i32 = (WINDOW_HEIGHT / 5) * 4 - DEFAULT_BALL_WIDTH / 2;
const ARROW_PARTS:i32 = 10;
const ARROW_SIZE_RATIO:i32 = 3;
const ARROW_WIDTH:i32 = 3;
const DEFAULT_MAP_WIDTH:i32 = 40;
const DEFAULT_MAP_HEIGHT:i32 = 50;
const DEFAULT_TEST_MAP:&[i32] = &[
5,5,5,5,5,0,0,0,0,0, 0,0,1,1,1,1,1,1,0,0, 1,1,0,1,1,1,0,0,0,0, 0,0,0,0,0,4,4,4,4,4,
5,5,4,0,0,0,0,0,0,0, 0,0,0,1,0,1,1,0,0,1, 0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,3,4,4,
5,4,5,4,0,0,0,0,0,0, 0,0,0,1,0,1,0,0,0,0, 1,1,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,3,4,3,4,
5,0,4,5,4,0,0,0,0,0, 0,0,0,1,0,1,1,1,0,1, 1,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,3,4,3,0,4,
5,0,0,4,5,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,3,4,3,0,0,4,
0,0,0,0,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,2,2,2, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 3,3,3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,2,2,2, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 3,3,3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,2,2,2, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 3,3,3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,6, 6,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,6, 6,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 5,5,5,5,5,0,0,0,0,0, 0,0,0,0,0,5,5,5,5,5, 1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,4, 4,4,4,4,4,0,0,0,0,0, 0,0,0,0,0,4,4,4,4,4, 4,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,0,0,0,0,0, 0,0,0,0,0,3,3,3,3,3, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,0,0,0,0,0, 0,0,0,0,0,2,2,2,2,2, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,4,4,4, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 5,5,5,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,4,4,4, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 5,5,5,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,4,4,4, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 5,5,5,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,
3,0,0,2,3,2,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,2,1,0,0,2,
3,0,2,3,2,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,2,1,0,2,
3,2,3,2,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,1,2,
3,3,2,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,2,2,
3,3,3,3,3,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,2,2,2,2,2,
];
pub struct Map{
size:Point,
grid:Vec<i32>,
}
impl Map{
fn new() -> Self{
//let (width,height) = (DEFAULT_MAP_WIDTH,DEFAULT_MAP_HEIGHT);
Map{
size:Point::new(DEFAULT_MAP_WIDTH,DEFAULT_MAP_HEIGHT),
//grid:vec![0;width as usize * height as usize],
grid:DEFAULT_TEST_MAP.to_vec(),
}
}
fn randomize(&mut self){
let mut rng = rand::thread_rng();
for x in 0..self.size.x{
for y in 0..self.size.y{
let index = x + self.size.x * y;
self.grid[index as usize] = rng.gen_range(0..6);
}
}
}
pub fn render(&mut self,ctx:&mut sdl2::render::Canvas<sdl2::video::Window>,debug:bool){
let width = WINDOW_WIDTH / self.size.x;
let height = WINDOW_HEIGHT / self.size.y;
for x in 0..self.size.x{
for y in 0..self.size.y{
let rect = Rect::new(x * width,y * height,width as u32,height as u32);
let index = x + self.size.x * y;
let debug_color:Color = Color::RGB(0xFF, 0xFF, 0xFF);
let tile_bg:Color;
match self.grid[index as usize]{
0 => {
//Ground
tile_bg = Color::RGB(0xA7,0xC9,0x57);
}
1 =>{
//Wall 43515a
tile_bg = Color::RGB(0x43, 0x51, 0x5A);
}
2 =>{
//Water 2887c8
tile_bg = Color::RGB(0x28, 0x87, 0xC8);
}
3 =>{
//Sand f2e8cf
tile_bg = Color::RGB(0xF2, 0xE8, 0xCF);
}
4 =>{
//Wet Sand DCC27F
tile_bg = Color::RGB(0xDC, 0xC2, 0x7F);
}
5 =>{
//Forest 386641
tile_bg = Color::RGB(0x38, 0x66, 0x41);
}
6 =>{
//Hole bc4749
tile_bg = Color::RGB(0xBC, 0x47, 0x49);
}
_ => {
//uuuuuuh... whatever I guess lets make it black
tile_bg = Color::RGB(0x00, 0x00, 0x00);
},
}
ctx.set_draw_color(tile_bg);
ctx.fill_rect(rect).expect("Could not render grid");
if debug{
ctx.set_draw_color(debug_color);
ctx.draw_rect(rect).expect("Could not render debug grid");
}
}
}
}
}
pub struct Game{
main_ball:Entity,
draw_debug:bool,
ball_released:bool,
map:Map,
}
impl Game{
pub fn render(&mut self,ctx:&mut sdl2::render::Canvas<sdl2::video::Window>){
let main_ball_color:Color = Color::RGB(0xFA, 0xFD, 0xF6);
let main_ball_outline:Color = Color::RGB(0x17, 0x2A, 0x33);
let background_color:Color = Color::RGB(0x6A,0x9A,0x1D);
let background_color:Color = Color::RGB(0xFF,0xFF,0xFF);
let velocity_color:u8 = ((self.main_ball.velocity.x * 4).abs() + (self.main_ball.velocity.y * 4).abs()) as u8;
let arrow_color:Color = Color::RGB(velocity_color,0x00,0x00);
let arrow_outline:Color = Color::RGB(0x00,0x00,0x00);
ctx.set_draw_color(background_color);
ctx.clear();
//map
self.map.render(ctx,self.draw_debug);
//ball
let center:Point = Point::new(self.main_ball.shape.x + (self.main_ball.shape.width() / 2) as i32,self.main_ball.shape.y + (self.main_ball.shape.width() / 2) as i32);
if self.draw_debug {
ctx.set_draw_color(main_ball_color);
@@ -41,30 +192,49 @@ impl Game{
fill_circle(ctx, center.x, center.y,self.main_ball.shape.width() as i32 / 2, main_ball_color);
draw_circle(ctx,center.x,center.y,self.main_ball.shape.width() as i32 / 2, main_ball_outline);
draw_circle(ctx,center.x,center.y,self.main_ball.shape.width() as i32 / 2 + 1, main_ball_outline);
let apex:Point = Point::new(center.x + (self.main_ball.velocity.x * ARROW_SIZE_RATIO) as i32,center.y + (self.main_ball.velocity.y * ARROW_SIZE_RATIO) as i32);
let offset = Point::new(((apex.x - center.x) as f32 / ARROW_PARTS as f32) as i32,((apex.y -center.y) as f32 / ARROW_PARTS as f32) as i32);
if !self.ball_released{
for i in 0..ARROW_PARTS{
ctx.set_draw_color(arrow_color);
let center = Point::new(center.x + i*offset.x,center.y + i*offset.y);
fill_circle(ctx, center.x, center.y, ARROW_WIDTH, arrow_color);
draw_circle(ctx, center.x, center.y, ARROW_WIDTH + 1, arrow_outline);
}
}
}
}
pub fn up(&mut self){
self.main_ball.velocity.y -= BALL_SPEED as i32;
if self.main_ball.velocity.y < -MAX_SPEED as i32{
self.main_ball.velocity.y = -MAX_SPEED as i32;
if !self.ball_released{
self.main_ball.velocity.y -= BALL_SPEED as i32;
if self.main_ball.velocity.y < -MAX_SPEED as i32{
self.main_ball.velocity.y = -MAX_SPEED as i32;
}
}
}
pub fn down(&mut self){
self.main_ball.velocity.y += BALL_SPEED as i32;
if self.main_ball.velocity.y > MAX_SPEED as i32{
self.main_ball.velocity.y = MAX_SPEED as i32;
if !self.ball_released{
self.main_ball.velocity.y += BALL_SPEED as i32;
if self.main_ball.velocity.y > MAX_SPEED as i32{
self.main_ball.velocity.y = MAX_SPEED as i32;
}
}
}
pub fn left(&mut self){
self.main_ball.velocity.x -= BALL_SPEED as i32;
if self.main_ball.velocity.x < -MAX_SPEED as i32{
self.main_ball.velocity.x = -MAX_SPEED as i32;
if !self.ball_released{
self.main_ball.velocity.x -= BALL_SPEED as i32;
if self.main_ball.velocity.x < -MAX_SPEED as i32{
self.main_ball.velocity.x = -MAX_SPEED as i32;
}
}
}
pub fn right(&mut self){
self.main_ball.velocity.x += BALL_SPEED as i32;
if self.main_ball.velocity.y > MAX_SPEED as i32{
self.main_ball.velocity.y = MAX_SPEED as i32;
if !self.ball_released{
self.main_ball.velocity.x += BALL_SPEED as i32;
if self.main_ball.velocity.y > MAX_SPEED as i32{
self.main_ball.velocity.y = MAX_SPEED as i32;
}
}
}
pub fn toggle_debug(&mut self){
@@ -72,6 +242,7 @@ impl Game{
}
pub fn release(&mut self){
if self.ball_released{
self.main_ball.velocity = Point::new(0,0);
self.main_ball.shape.set_x(DEFAULT_START_BALL_LOCATION_X);
self.main_ball.shape.set_y(DEFAULT_START_BALL_LOCATION_Y);
}
@@ -96,22 +267,64 @@ impl Game{
if posy + height >= WINDOW_HEIGHT{
//we hit rock bottom
posy = WINDOW_HEIGHT - height;
bloc.velocity.y = -(bloc.velocity.y as f32 / 100.0 * BOUNCE_RATIO) as i32;
bloc.velocity.y = bounce(bloc.velocity.y);
}
if posy <= 0{
//we hit top
posy = 0;
bloc.velocity.y = -(bloc.velocity.y as f32 / 100.0 * BOUNCE_RATIO) as i32;
bloc.velocity.y = bounce(bloc.velocity.y);
}
if posx + width >= WINDOW_WIDTH{
//we hit right
posx = WINDOW_WIDTH - width;
bloc.velocity.x = -(bloc.velocity.x as f32 / 100.0 * BOUNCE_RATIO) as i32;
bloc.velocity.x = bounce(bloc.velocity.x);
}
if posx <= 0{
//we hit left
posx = 0;
bloc.velocity.x = -(bloc.velocity.x as f32 / 100.0 * BOUNCE_RATIO) as i32;
bloc.velocity.x = bounce(bloc.velocity.x);
}
//Apply tiles effects
let index_2d = Point::new(posx / (WINDOW_WIDTH / self.map.size.x),posy / (WINDOW_HEIGHT / self.map.size.y));
//println!("[DEBUG] x:{} y:{}",index_2d.x,index_2d.y);
let index_1d = index_2d.x + self.map.size.x * index_2d.y;
//println!("[DEBUG] index:{}",index_1d);
let mut slow_amount = 0;
//println!("[DEBUG] tile {}",self.map.grid[index_1d as usize]);
match self.map.grid[index_1d as usize]{
0 => {
//Ground
slow_amount = 1;
}
2 =>{
//Water
slow_amount = 10;
}
3 =>{
//Sand
slow_amount = 3;
}
4 =>{
//Wet Sand
slow_amount = 5;
}
5 =>{
//Forest
slow_amount = 5;
}
6 =>{
//Hole
}
_ => {
//uuuuuuh... whatever I guess lets not do anything
},
}
if self.ball_released{
bloc.velocity.x = reduce_velocity(bloc.velocity.x, slow_amount);
bloc.velocity.y = reduce_velocity(bloc.velocity.y, slow_amount);
}
if bloc.velocity.x > MAX_SPEED as i32{
@@ -136,6 +349,26 @@ impl Game{
}
}
pub fn bounce(acceleration:i32)->i32{
-(acceleration as f32 / 100.0 * BOUNCE_RATIO) as i32
}
pub fn reduce_velocity(original:i32,amount:i32) -> i32{
if original > 0{
if original - amount < 0{
0
}else{
original - amount
}
}else if original < 0{
if original + amount > 0{
0
}else{
original + amount
}
}else{
original
}
}
//https://stackoverflow.com/questions/65723827/sdl2-function-to-draw-a-filled-circle ## Translated to Rust
pub fn fill_circle(ctx:&mut sdl2::render::Canvas<sdl2::video::Window>, x:i32, y:i32, radius:i32, color:Color)
{
@@ -203,6 +436,9 @@ fn is_left_pressed(e: &sdl2::EventPump)-> bool{
fn is_right_pressed(e: &sdl2::EventPump)-> bool{
e.keyboard_state().is_scancode_pressed(Scancode::D) || e.keyboard_state().is_scancode_pressed(Scancode::Right)
}
fn is_random_pressed(e: &sdl2::EventPump)-> bool{
e.keyboard_state().is_scancode_pressed(Scancode::R)
}
fn is_tab_pressed(e: &sdl2::EventPump)-> bool{
e.keyboard_state().is_scancode_pressed(Scancode::Tab)
}
@@ -240,6 +476,9 @@ pub fn main_loop(canvas: &mut sdl2::render::Canvas<sdl2::video::Window>,event_pu
if is_right_pressed(event_pump){
game.right();
}
if is_random_pressed(event_pump){
game.map.randomize();
}
if is_tab_pressed(event_pump){
if tab_state == false{
//Keydown
@@ -319,6 +558,6 @@ pub fn main() {
shape:main_ball_rectangle,
velocity:main_ball_velocity
};
let mut game = Game{main_ball:main_entity,draw_debug:false,ball_released:false};
let mut game = Game{main_ball:main_entity,draw_debug:false,ball_released:false,map:Map::new()};
main_loop(&mut canvas,&mut event_pump,&mut game);
}