mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-11 12:08:01 -06:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f5ff90cb11 | |||
| a0f65b551c |
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -94,6 +94,7 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
"tracing-error",
|
"tracing-error",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -8,9 +8,10 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
spin_sleep = "1.1.1"
|
spin_sleep = "1.1.1"
|
||||||
tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_level_warn"]}
|
tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_level_debug"]}
|
||||||
tracing-error = "0.2.0"
|
tracing-error = "0.2.0"
|
||||||
tracing-subscriber = {version = "0.3.17", features = ["env-filter"]}
|
tracing-subscriber = {version = "0.3.17", features = ["env-filter"]}
|
||||||
|
winapi = { version = "0.3", features = ["consoleapi", "fileapi", "handleapi", "processenv", "winbase", "wincon", "winnt", "winuser", "windef", "minwindef"] }
|
||||||
|
|
||||||
[dependencies.sdl2]
|
[dependencies.sdl2]
|
||||||
version = "0.38"
|
version = "0.38"
|
||||||
|
|||||||
BIN
assets/wav/eating.wav
Normal file
BIN
assets/wav/eating.wav
Normal file
Binary file not shown.
BIN
assets/wav/waka_ka.wav
Normal file
BIN
assets/wav/waka_ka.wav
Normal file
Binary file not shown.
BIN
assets/wav/waka_wa.wav
Normal file
BIN
assets/wav/waka_wa.wav
Normal file
Binary file not shown.
22
src/game.rs
22
src/game.rs
@@ -73,12 +73,34 @@ impl Game<'_> {
|
|||||||
if keycode == Keycode::Space {
|
if keycode == Keycode::Space {
|
||||||
self.debug = !self.debug;
|
self.debug = !self.debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset game
|
||||||
|
if keycode == Keycode::R {
|
||||||
|
self.reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_score(&mut self, points: u32) {
|
pub fn add_score(&mut self, points: u32) {
|
||||||
self.score += points;
|
self.score += points;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn reset(&mut self) {
|
||||||
|
// Reset the map to restore all pellets
|
||||||
|
{
|
||||||
|
let mut map = self.map.borrow_mut();
|
||||||
|
map.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the score
|
||||||
|
self.score = 0;
|
||||||
|
|
||||||
|
// Reset Pacman position (you might want to customize this)
|
||||||
|
// For now, we'll keep Pacman where he is, but you could add:
|
||||||
|
// self.pacman.position = Map::cell_to_pixel((1, 1));
|
||||||
|
|
||||||
|
event!(tracing::Level::INFO, "Game reset - map and score cleared");
|
||||||
|
}
|
||||||
|
|
||||||
pub fn tick(&mut self) {
|
pub fn tick(&mut self) {
|
||||||
self.pacman.tick();
|
self.pacman.tick();
|
||||||
self.check_pellet_eating();
|
self.check_pellet_eating();
|
||||||
|
|||||||
47
src/main.rs
47
src/main.rs
@@ -1,3 +1,5 @@
|
|||||||
|
#![windows_subsystem = "windows"]
|
||||||
|
|
||||||
use crate::constants::{WINDOW_HEIGHT, WINDOW_WIDTH};
|
use crate::constants::{WINDOW_HEIGHT, WINDOW_WIDTH};
|
||||||
use crate::game::Game;
|
use crate::game::Game;
|
||||||
use sdl2::event::{Event, WindowEvent};
|
use sdl2::event::{Event, WindowEvent};
|
||||||
@@ -7,7 +9,46 @@ use tracing::event;
|
|||||||
use tracing_error::ErrorLayer;
|
use tracing_error::ErrorLayer;
|
||||||
use tracing_subscriber::layer::SubscriberExt;
|
use tracing_subscriber::layer::SubscriberExt;
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
use winapi::{
|
||||||
|
shared::{ntdef::NULL, windef::HWND},
|
||||||
|
um::{
|
||||||
|
fileapi::{CreateFileA, OPEN_EXISTING},
|
||||||
|
handleapi::INVALID_HANDLE_VALUE,
|
||||||
|
processenv::SetStdHandle,
|
||||||
|
winbase::{STD_ERROR_HANDLE, STD_OUTPUT_HANDLE},
|
||||||
|
wincon::{AttachConsole, GetConsoleWindow},
|
||||||
|
winnt::{FILE_SHARE_READ, FILE_SHARE_WRITE, GENERIC_READ, GENERIC_WRITE},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe fn attach_console() {
|
||||||
|
if GetConsoleWindow() != std::ptr::null_mut() as HWND {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if AttachConsole(winapi::um::wincon::ATTACH_PARENT_PROCESS) != 0 {
|
||||||
|
let handle = CreateFileA(
|
||||||
|
"CONOUT$\0".as_ptr() as *const i8,
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
std::ptr::null_mut(),
|
||||||
|
OPEN_EXISTING,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
);
|
||||||
|
|
||||||
|
if handle != INVALID_HANDLE_VALUE {
|
||||||
|
SetStdHandle(STD_OUTPUT_HANDLE, handle);
|
||||||
|
SetStdHandle(STD_ERROR_HANDLE, handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Do NOT call AllocConsole here - we don't want a console when launched from Explorer
|
||||||
|
}
|
||||||
|
|
||||||
mod animation;
|
mod animation;
|
||||||
|
mod audio;
|
||||||
mod constants;
|
mod constants;
|
||||||
mod direction;
|
mod direction;
|
||||||
mod entity;
|
mod entity;
|
||||||
@@ -18,8 +59,14 @@ mod modulation;
|
|||||||
mod pacman;
|
mod pacman;
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
attach_console();
|
||||||
|
}
|
||||||
|
|
||||||
let sdl_context = sdl2::init().unwrap();
|
let sdl_context = sdl2::init().unwrap();
|
||||||
let video_subsystem = sdl_context.video().unwrap();
|
let video_subsystem = sdl_context.video().unwrap();
|
||||||
|
let audio_subsystem = sdl_context.audio().unwrap();
|
||||||
let ttf_context = sdl2::ttf::init().unwrap();
|
let ttf_context = sdl2::ttf::init().unwrap();
|
||||||
|
|
||||||
// Setup tracing
|
// Setup tracing
|
||||||
|
|||||||
27
src/map.rs
27
src/map.rs
@@ -1,13 +1,14 @@
|
|||||||
use crate::constants::MapTile;
|
use crate::constants::MapTile;
|
||||||
use crate::constants::{BOARD_HEIGHT, BOARD_WIDTH};
|
use crate::constants::{BOARD_HEIGHT, BOARD_WIDTH, RAW_BOARD};
|
||||||
|
|
||||||
pub struct Map {
|
pub struct Map {
|
||||||
inner: [[MapTile; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize],
|
current: [[MapTile; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize],
|
||||||
|
default: [[MapTile; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Map {
|
impl Map {
|
||||||
pub fn new(raw_board: [&str; BOARD_HEIGHT as usize]) -> Map {
|
pub fn new(raw_board: [&str; BOARD_HEIGHT as usize]) -> Map {
|
||||||
let mut inner = [[MapTile::Empty; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize];
|
let mut map = [[MapTile::Empty; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize];
|
||||||
|
|
||||||
for y in 0..BOARD_HEIGHT as usize {
|
for y in 0..BOARD_HEIGHT as usize {
|
||||||
let line = raw_board[y];
|
let line = raw_board[y];
|
||||||
@@ -35,11 +36,23 @@ impl Map {
|
|||||||
_ => panic!("Unknown character in board: {}", character),
|
_ => panic!("Unknown character in board: {}", character),
|
||||||
};
|
};
|
||||||
|
|
||||||
inner[x as usize][y as usize] = tile;
|
map[x as usize][y as usize] = tile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Map { inner: inner }
|
Map {
|
||||||
|
current: map,
|
||||||
|
default: map.clone(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reset(&mut self) {
|
||||||
|
// Restore the map to its original state
|
||||||
|
for x in 0..BOARD_WIDTH as usize {
|
||||||
|
for y in 0..BOARD_HEIGHT as usize {
|
||||||
|
self.current[x][y] = self.default[x][y];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_tile(&self, cell: (i32, i32)) -> Option<MapTile> {
|
pub fn get_tile(&self, cell: (i32, i32)) -> Option<MapTile> {
|
||||||
@@ -50,7 +63,7 @@ impl Map {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(self.inner[x][y])
|
Some(self.current[x][y])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_tile(&mut self, cell: (i32, i32), tile: MapTile) -> bool {
|
pub fn set_tile(&mut self, cell: (i32, i32), tile: MapTile) -> bool {
|
||||||
@@ -61,7 +74,7 @@ impl Map {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.inner[x][y] = tile;
|
self.current[x][y] = tile;
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user