mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-06 01:15:42 -06:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 44d8184d8b | |||
| 0630fc56ec | |||
| 98d8960c57 | |||
| 394344c11f |
@@ -4,6 +4,6 @@ rustflags = [
|
||||
"-O", "-C", "link-args=-O2 --profiling",
|
||||
#"-C", "link-args=-O3 --closure 1",
|
||||
"-C", "link-args=-sASYNCIFY -sALLOW_MEMORY_GROWTH=1",
|
||||
"-C", "link-args=-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL_EMSCRIPTEN_KEYBOARD_ELEMENT -sSDL2_IMAGE_FORMATS=['png']",
|
||||
"-C", "link-args=-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS=['png']",
|
||||
"-C", "link-args=--preload-file assets/ -lidbfs.js",
|
||||
]
|
||||
|
||||
@@ -23,6 +23,9 @@ at.
|
||||
- More than 4 ghosts
|
||||
- Custom Level Generation
|
||||
- Multi-map tunnelling
|
||||
- Online Scoreboard
|
||||
- WebAssembly build contains a special API key for communicating with server.
|
||||
- To prevent abuse, the server will only accept scores from the WebAssembly build.
|
||||
|
||||
## Installation
|
||||
|
||||
|
||||
54
STORY.md
Normal file
54
STORY.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Story
|
||||
|
||||
This is living document that describes the story of the project, from inspiration to solution.
|
||||
When a website is available, this document will help curate it's content.
|
||||
|
||||
## Inspiration
|
||||
|
||||
I initially got the idea for this project after finding a video about another Pac-Man clone on YouTube.
|
||||
|
||||
[![Code Review Thumbnail][code-review-thumbnail]][code-review-video]
|
||||
|
||||
This implementation was written in C++, used SDL2 for graphics, and was kinda weird - but it worked.
|
||||
|
||||
- I think it was weird because the way it linked files together is extremely non-standard.
|
||||
Essentially, it was a single file that included all the other files. This is not how C++ projects are typically structured.
|
||||
- This implementation was also extremely dependent on OOP; Rust has no real counterpart for OOP code, so writing my own implementation would be a challenge.
|
||||
|
||||
## Lifetimes
|
||||
|
||||
Rust's SDL2 implementation is a wrapper around the C library, so it's not as nice as the C++ implementation.
|
||||
Additionally, lifetimes in this library are a bit weird, making them quite difficult to deal with.
|
||||
|
||||
I found a whole blog post complaining about this ([1][fighting-lifetimes-1], [2][fighting-lifetimes-2], [3][fighting-lifetimes-3]), so I'm not alone in this.
|
||||
|
||||
## Emscripten & RuggRogue
|
||||
|
||||
One of the targets for this project is to build a web-accessible version of the game. If you were watching at all during
|
||||
the Rust hype, one of it's primary selling points was a growing community of Rust-based web applications, thanks to
|
||||
WebAssembly.
|
||||
|
||||
The problem is that much of this work was done for pure-Rust applications - and SDL is C++.
|
||||
This requires a C++ WebAssembly compiler such as Emscripten; and it's a pain to get working.
|
||||
|
||||
Luckily though, someone else has done this before, and they fully documented it - [RuggRouge][ruggrouge].
|
||||
- Built with Rust
|
||||
- Uses SDL2
|
||||
- Compiling for WebAssembly with Emscripten
|
||||
- Also compiles for Windows & Linux
|
||||
|
||||
This repository has been massively helpful in getting my WebAssembly builds working.
|
||||
|
||||
## Key Capturing Extensions in WASM Build
|
||||
|
||||
Some extensions I had installed were capturing keys.
|
||||
The issue presented with some keys never being sent to the application.
|
||||
To confirm, enter safe mode or switch to a different browser without said extensions.
|
||||
If the issue disappears, it's because of an extension in your browser stealing keys in a way that is incompatible with the batshit insanity of Emscripten.
|
||||
|
||||
[code-review-video]: https://www.youtube.com/watch?v=OKs_JewEeOo
|
||||
[code-review-thumbnail]: https://img.youtube.com/vi/OKs_JewEeOo/hqdefault.jpg
|
||||
[fighting-lifetimes-1]: https://devcry.heiho.net/html/2022/20220709-rust-and-sdl2-fighting-with-lifetimes.html
|
||||
[fighting-lifetimes-2]: https://devcry.heiho.net/html/2022/20220716-rust-and-sdl2-fighting-with-lifetimes-2.html
|
||||
[fighting-lifetimes-3]: https://devcry.heiho.net/html/2022/20220724-rust-and-sdl2-fighting-with-lifetimes-3.html
|
||||
[ruggrogue]: https://tung.github.io/ruggrogue/
|
||||
@@ -1,12 +1,11 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
# set -eu
|
||||
|
||||
echo "Building WASM with Emscripten"
|
||||
cargo build --target=wasm32-unknown-emscripten --release
|
||||
|
||||
echo "Copying release files to dist/"
|
||||
mkdir -p dist
|
||||
|
||||
output_folder="target/wasm32-unknown-emscripten/release"
|
||||
cp $output_folder/pacman.wasm dist
|
||||
cp $output_folder/pacman.js dist
|
||||
|
||||
@@ -9,20 +9,50 @@ SDL_TTF_VERSION="2.20.2"
|
||||
SDL="https://github.com/libsdl-org/SDL/releases/download/release-${SDL_VERSION}/SDL2-devel-${SDL_VERSION}-mingw.tar.gz"
|
||||
SLD_IMAGE="https://github.com/libsdl-org/SDL_image/releases/download/release-${SDL_IMAGE_VERSION}/SDL2_image-devel-${SDL_IMAGE_VERSION}-mingw.tar.gz"
|
||||
SDL_MIXER="https://github.com/libsdl-org/SDL_mixer/releases/download/release-${SDL_MIXER_VERSION}/SDL2_mixer-devel-${SDL_MIXER_VERSION}-mingw.tar.gz"
|
||||
SDL_TTF="https://github.com/libsdl-org/SDL_ttf/releases/download/release-${SDL_TTF_VERSION}/SDL_ttf-devel-${SDL_TTF_VERSION}-mingw.tar.gz"
|
||||
SDL_TTF="https://github.com/libsdl-org/SDL_ttf/releases/download/release-${SDL_TTF_VERSION}/SDL2_ttf-devel-${SDL_TTF_VERSION}-mingw.tar.gz"
|
||||
|
||||
# Verify that toolchain is installed
|
||||
EXTRACT_DIR="./target/x86_64-pc-windows-gnu/release/deps"
|
||||
|
||||
if [ ! -f $EXTRACT_DIR/libSDL2.a ]; then
|
||||
if [ ! -f ./sdl2.tar.gz ]; then
|
||||
echo "Downloading SDL2@$SDL_VERSION..."
|
||||
curl -L -o ./sdl2.tar.gz $SDL
|
||||
fi
|
||||
echo "Extracting SDL2..."
|
||||
tar -xzf ./sdl2.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2-$SDL_VERSION/x86_64-w64-mingw32/lib/libSDL2.a"
|
||||
rm -f ./sdl2.tar.gz
|
||||
fi
|
||||
|
||||
# EXTRACT_DIR="~/.rustup/"
|
||||
EXTRACT_DIR="~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/"
|
||||
# if [ ! -d "~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/" ]; then
|
||||
# ls $EXTRACT_DIR
|
||||
# echo "Toolchain not installed. Run rustup target add x86_64-pc-windows-gnu. This may not work on environments besides Linux GNU."
|
||||
# exit 1
|
||||
# fi
|
||||
if [ ! -f $EXTRACT_DIR/libSDL2_image.a ]; then
|
||||
if [ ! -f ./sdl2_image.tar.gz ]; then
|
||||
echo "Downloading SDL2_image@$SDL_IMAGE_VERSION..."
|
||||
curl -L -o ./sdl2_image.tar.gz $SLD_IMAGE
|
||||
fi
|
||||
echo "Extracting SDL2_image..."
|
||||
tar -xzf ./sdl2_image.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2_image-$SDL_IMAGE_VERSION/x86_64-w64-mingw32/lib/libSDL2_image.a"
|
||||
fi
|
||||
rm -f ./sdl2_image.tar.gz
|
||||
|
||||
echo "Downloading..."
|
||||
curl -L -o ./sdl2.tar.gz $SDL
|
||||
curl -L -o ./sdl2_image.tar.gz $SLD_IMAGE
|
||||
echo "Done."
|
||||
if [ ! -f $EXTRACT_DIR/libSDL2_mixer.a ]; then
|
||||
if [ ! -f ./sdl2_mixer.tar.gz ]; then
|
||||
echo "Downloading SDL2_mixer@$SDL_MIXER_VERSION..."
|
||||
curl -L -o ./sdl2_mixer.tar.gz $SDL_MIXER
|
||||
fi
|
||||
echo "Extracting SDL2_mixer..."
|
||||
tar -xzf ./sdl2_mixer.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2_mixer-$SDL_MIXER_VERSION/x86_64-w64-mingw32/lib/libSDL2_mixer.a"
|
||||
rm -f ./sdl2_mixer.tar.gz
|
||||
fi
|
||||
|
||||
if [ ! -f $EXTRACT_DIR/libSDL2_ttf.a ]; then
|
||||
|
||||
if [ ! -f ./sdl2_ttf.tar.gz ]; then
|
||||
echo "Downloading SDL2_ttf@$SDL_TTF_VERSION..."
|
||||
curl -L -o ./sdl2_ttf.tar.gz $SDL_TTF
|
||||
fi
|
||||
echo "Extracting SDL2_ttf..."
|
||||
tar -xzf ./sdl2_ttf.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2_ttf-$SDL_TTF_VERSION/x86_64-w64-mingw32/lib/libSDL2_ttf.a"
|
||||
rm -f ./sdl2_ttf.tar.gz
|
||||
fi
|
||||
|
||||
echo "Building..."
|
||||
cargo zigbuild --release --target x86_64-pc-windows-gnu
|
||||
9
scripts/clean-windows.sh
Executable file
9
scripts/clean-windows.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
set -eux
|
||||
|
||||
echo "Cleaning library files from ./target/x86_64-pc-windows-gnu/release/deps"
|
||||
rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2.a
|
||||
rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2_image.a
|
||||
rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2_mixer.a
|
||||
rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2_ttf.a
|
||||
echo "Done."
|
||||
@@ -17,15 +17,13 @@ mod map;
|
||||
mod modulation;
|
||||
mod pacman;
|
||||
|
||||
#[cfg(target_os = "emscripten")]
|
||||
mod emscripten;
|
||||
|
||||
pub fn main() {
|
||||
let sdl_context = sdl2::init().unwrap();
|
||||
let video_subsystem = sdl_context.video().unwrap();
|
||||
|
||||
// Setup tracing
|
||||
let subscriber = tracing_subscriber::fmt()
|
||||
.with_ansi(cfg!(not(target_os = "emscripten")))
|
||||
.with_max_level(tracing::Level::DEBUG)
|
||||
.finish()
|
||||
.with(ErrorLayer::default());
|
||||
@@ -77,6 +75,7 @@ pub fn main() {
|
||||
|
||||
// TODO: Fix key repeat delay issues by using VecDeque for instant key repeat
|
||||
for event in event_pump.poll_iter() {
|
||||
|
||||
match event {
|
||||
// Handle quitting keys or window close
|
||||
Event::Quit { .. }
|
||||
@@ -146,7 +145,7 @@ pub fn main() {
|
||||
|
||||
true
|
||||
};
|
||||
|
||||
|
||||
loop {
|
||||
if !main_loop() {
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user