Compare commits
7 Commits
33befbc561
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| e1caed1f93 | |||
| 805a255913 | |||
| ed2ec80391 | |||
| 0a88fc7924 | |||
| 0750939096 | |||
| fa437f2b6c | |||
| 1b3337c993 |
54
Cargo.lock
generated
54
Cargo.lock
generated
@@ -14,6 +14,17 @@ version = "1.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
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]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
@@ -26,6 +37,42 @@ version = "0.2.125"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
|
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]]
|
[[package]]
|
||||||
name = "sdl2"
|
name = "sdl2"
|
||||||
version = "0.35.2"
|
version = "0.35.2"
|
||||||
@@ -53,6 +100,7 @@ dependencies = [
|
|||||||
name = "test_sdl"
|
name = "test_sdl"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"rand",
|
||||||
"sdl2",
|
"sdl2",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -61,3 +109,9 @@ name = "version-compare"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73"
|
checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasi"
|
||||||
|
version = "0.10.2+wasi-snapshot-preview1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
|
||||||
|
|||||||
@@ -7,3 +7,4 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
sdl2 = "0.35.2"
|
sdl2 = "0.35.2"
|
||||||
|
rand = "0.8.5"
|
||||||
21
ReadMe.md
21
ReadMe.md
@@ -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
|
## Run it
|
||||||
|
|
||||||
@@ -18,14 +19,18 @@ cargo run --release
|
|||||||
|
|
||||||
## Controls
|
## 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
|
||||||
255
src/main.rs
255
src/main.rs
@@ -5,9 +5,10 @@ use sdl2::keyboard::Scancode;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use sdl2::rect::Point;
|
use sdl2::rect::Point;
|
||||||
use sdl2::rect::Rect;
|
use sdl2::rect::Rect;
|
||||||
|
use rand::Rng;
|
||||||
|
|
||||||
const WINDOW_HEIGHT:i32 = 800;
|
const WINDOW_WIDTH:i32 = 800;
|
||||||
const WINDOW_WIDTH:i32 = 500;
|
const WINDOW_HEIGHT:i32 = 1000;
|
||||||
const BALL_SPEED:f32 = 3.0;
|
const BALL_SPEED:f32 = 3.0;
|
||||||
const MAX_SPEED:f32 = 60.0;
|
const MAX_SPEED:f32 = 60.0;
|
||||||
const DEBUG_FX_SIZE_RATIO:i32 = 2;
|
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_BALL_WIDTH:i32 = 20;
|
||||||
const DEFAULT_START_BALL_LOCATION_X:i32 = WINDOW_WIDTH / 2 - DEFAULT_BALL_WIDTH / 2;
|
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 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{
|
pub struct Game{
|
||||||
main_ball:Entity,
|
main_ball:Entity,
|
||||||
draw_debug:bool,
|
draw_debug:bool,
|
||||||
ball_released:bool,
|
ball_released:bool,
|
||||||
|
map:Map,
|
||||||
}
|
}
|
||||||
impl Game{
|
impl Game{
|
||||||
pub fn render(&mut self,ctx:&mut sdl2::render::Canvas<sdl2::video::Window>){
|
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_color:Color = Color::RGB(0xFA, 0xFD, 0xF6);
|
||||||
let main_ball_outline:Color = Color::RGB(0x17, 0x2A, 0x33);
|
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.set_draw_color(background_color);
|
||||||
ctx.clear();
|
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);
|
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 {
|
if self.draw_debug {
|
||||||
ctx.set_draw_color(main_ball_color);
|
ctx.set_draw_color(main_ball_color);
|
||||||
@@ -41,37 +192,57 @@ impl Game{
|
|||||||
fill_circle(ctx, center.x, center.y,self.main_ball.shape.width() as i32 / 2, main_ball_color);
|
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, main_ball_outline);
|
||||||
draw_circle(ctx,center.x,center.y,self.main_ball.shape.width() as i32 / 2 + 1, 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){
|
pub fn up(&mut self){
|
||||||
|
if !self.ball_released{
|
||||||
self.main_ball.velocity.y -= BALL_SPEED as i32;
|
self.main_ball.velocity.y -= BALL_SPEED as i32;
|
||||||
if self.main_ball.velocity.y < -MAX_SPEED as i32{
|
if self.main_ball.velocity.y < -MAX_SPEED as i32{
|
||||||
self.main_ball.velocity.y = -MAX_SPEED as i32;
|
self.main_ball.velocity.y = -MAX_SPEED as i32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pub fn down(&mut self){
|
pub fn down(&mut self){
|
||||||
|
if !self.ball_released{
|
||||||
self.main_ball.velocity.y += BALL_SPEED as i32;
|
self.main_ball.velocity.y += BALL_SPEED as i32;
|
||||||
if self.main_ball.velocity.y > MAX_SPEED as i32{
|
if self.main_ball.velocity.y > MAX_SPEED as i32{
|
||||||
self.main_ball.velocity.y = MAX_SPEED as i32;
|
self.main_ball.velocity.y = MAX_SPEED as i32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pub fn left(&mut self){
|
pub fn left(&mut self){
|
||||||
|
if !self.ball_released{
|
||||||
self.main_ball.velocity.x -= BALL_SPEED as i32;
|
self.main_ball.velocity.x -= BALL_SPEED as i32;
|
||||||
if self.main_ball.velocity.x < -MAX_SPEED as i32{
|
if self.main_ball.velocity.x < -MAX_SPEED as i32{
|
||||||
self.main_ball.velocity.x = -MAX_SPEED as i32;
|
self.main_ball.velocity.x = -MAX_SPEED as i32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pub fn right(&mut self){
|
pub fn right(&mut self){
|
||||||
|
if !self.ball_released{
|
||||||
self.main_ball.velocity.x += BALL_SPEED as i32;
|
self.main_ball.velocity.x += BALL_SPEED as i32;
|
||||||
if self.main_ball.velocity.y > MAX_SPEED as i32{
|
if self.main_ball.velocity.y > MAX_SPEED as i32{
|
||||||
self.main_ball.velocity.y = MAX_SPEED as i32;
|
self.main_ball.velocity.y = MAX_SPEED as i32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pub fn toggle_debug(&mut self){
|
pub fn toggle_debug(&mut self){
|
||||||
self.draw_debug = !self.draw_debug;
|
self.draw_debug = !self.draw_debug;
|
||||||
}
|
}
|
||||||
pub fn release(&mut self){
|
pub fn release(&mut self){
|
||||||
if self.ball_released{
|
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_x(DEFAULT_START_BALL_LOCATION_X);
|
||||||
self.main_ball.shape.set_y(DEFAULT_START_BALL_LOCATION_Y);
|
self.main_ball.shape.set_y(DEFAULT_START_BALL_LOCATION_Y);
|
||||||
}
|
}
|
||||||
@@ -96,22 +267,64 @@ impl Game{
|
|||||||
if posy + height >= WINDOW_HEIGHT{
|
if posy + height >= WINDOW_HEIGHT{
|
||||||
//we hit rock bottom
|
//we hit rock bottom
|
||||||
posy = WINDOW_HEIGHT - height;
|
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{
|
if posy <= 0{
|
||||||
//we hit top
|
//we hit top
|
||||||
posy = 0;
|
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{
|
if posx + width >= WINDOW_WIDTH{
|
||||||
//we hit right
|
//we hit right
|
||||||
posx = WINDOW_WIDTH - width;
|
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{
|
if posx <= 0{
|
||||||
//we hit left
|
//we hit left
|
||||||
posx = 0;
|
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{
|
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
|
//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)
|
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{
|
fn is_right_pressed(e: &sdl2::EventPump)-> bool{
|
||||||
e.keyboard_state().is_scancode_pressed(Scancode::D) || e.keyboard_state().is_scancode_pressed(Scancode::Right)
|
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{
|
fn is_tab_pressed(e: &sdl2::EventPump)-> bool{
|
||||||
e.keyboard_state().is_scancode_pressed(Scancode::Tab)
|
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){
|
if is_right_pressed(event_pump){
|
||||||
game.right();
|
game.right();
|
||||||
}
|
}
|
||||||
|
if is_random_pressed(event_pump){
|
||||||
|
game.map.randomize();
|
||||||
|
}
|
||||||
if is_tab_pressed(event_pump){
|
if is_tab_pressed(event_pump){
|
||||||
if tab_state == false{
|
if tab_state == false{
|
||||||
//Keydown
|
//Keydown
|
||||||
@@ -319,6 +558,6 @@ pub fn main() {
|
|||||||
shape:main_ball_rectangle,
|
shape:main_ball_rectangle,
|
||||||
velocity:main_ball_velocity
|
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);
|
main_loop(&mut canvas,&mut event_pump,&mut game);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user