mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-08 02:07:56 -06:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| db8cd6220a | |||
| ced4e87d41 |
68
Cargo.lock
generated
68
Cargo.lock
generated
@@ -194,7 +194,8 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"pathfinding",
|
"pathfinding",
|
||||||
"rand",
|
"phf",
|
||||||
|
"rand 0.9.2",
|
||||||
"sdl2",
|
"sdl2",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -223,6 +224,48 @@ dependencies = [
|
|||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf"
|
||||||
|
version = "0.11.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
|
||||||
|
dependencies = [
|
||||||
|
"phf_macros",
|
||||||
|
"phf_shared",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf_generator"
|
||||||
|
version = "0.11.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
|
||||||
|
dependencies = [
|
||||||
|
"phf_shared",
|
||||||
|
"rand 0.8.5",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf_macros"
|
||||||
|
version = "0.11.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216"
|
||||||
|
dependencies = [
|
||||||
|
"phf_generator",
|
||||||
|
"phf_shared",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf_shared"
|
||||||
|
version = "0.11.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
|
||||||
|
dependencies = [
|
||||||
|
"siphasher",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project-lite"
|
name = "pin-project-lite"
|
||||||
version = "0.2.13"
|
version = "0.2.13"
|
||||||
@@ -253,15 +296,30 @@ version = "5.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core 0.6.4",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.9.2"
|
version = "0.9.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
|
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand_core",
|
"rand_core 0.9.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.6.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.9.3"
|
version = "0.9.3"
|
||||||
@@ -399,6 +457,12 @@ dependencies = [
|
|||||||
"lazy_static",
|
"lazy_static",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "siphasher"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smallvec"
|
name = "smallvec"
|
||||||
version = "1.15.1"
|
version = "1.15.1"
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ serde_json = "1.0.142"
|
|||||||
smallvec = "1.15.1"
|
smallvec = "1.15.1"
|
||||||
strum = "0.27.2"
|
strum = "0.27.2"
|
||||||
strum_macros = "0.27.2"
|
strum_macros = "0.27.2"
|
||||||
|
phf = { version = "0.11", features = ["macros"] }
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = true
|
lto = true
|
||||||
@@ -57,3 +58,8 @@ aarch64-apple-darwin = { triplet = "arm64-osx" }
|
|||||||
|
|
||||||
[target.'cfg(target_os = "emscripten")'.dependencies]
|
[target.'cfg(target_os = "emscripten")'.dependencies]
|
||||||
libc = "0.2.175"
|
libc = "0.2.175"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
serde_json = "1.0"
|
||||||
|
phf = { version = "0.11", features = ["macros"] }
|
||||||
|
|||||||
50
build.rs
Normal file
50
build.rs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::env;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{BufWriter, Write};
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct AtlasMapper {
|
||||||
|
frames: HashMap<String, MapperFrame>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, Deserialize)]
|
||||||
|
struct MapperFrame {
|
||||||
|
x: u16,
|
||||||
|
y: u16,
|
||||||
|
width: u16,
|
||||||
|
height: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let path = Path::new(&env::var("OUT_DIR").unwrap()).join("atlas_data.rs");
|
||||||
|
let mut file = BufWriter::new(File::create(&path).unwrap());
|
||||||
|
|
||||||
|
let atlas_json = include_str!("./assets/game/atlas.json");
|
||||||
|
let atlas_mapper: AtlasMapper = serde_json::from_str(atlas_json).unwrap();
|
||||||
|
|
||||||
|
writeln!(&mut file, "use phf::phf_map;").unwrap();
|
||||||
|
|
||||||
|
writeln!(&mut file, "use crate::texture::sprite::MapperFrame;").unwrap();
|
||||||
|
|
||||||
|
writeln!(
|
||||||
|
&mut file,
|
||||||
|
"pub static ATLAS_FRAMES: phf::Map<&'static str, MapperFrame> = phf_map! {{"
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
for (name, frame) in atlas_mapper.frames {
|
||||||
|
writeln!(
|
||||||
|
&mut file,
|
||||||
|
" \"{}\" => MapperFrame {{ x: {}, y: {}, width: {}, height: {} }},",
|
||||||
|
name, frame.x, frame.y, frame.width, frame.height
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
writeln!(&mut file, "}};").unwrap();
|
||||||
|
println!("cargo:rerun-if-changed=assets/game/atlas.json");
|
||||||
|
}
|
||||||
@@ -12,8 +12,6 @@ pub enum Asset {
|
|||||||
Wav3,
|
Wav3,
|
||||||
Wav4,
|
Wav4,
|
||||||
Atlas,
|
Atlas,
|
||||||
AtlasJson,
|
|
||||||
// Add more as needed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Asset {
|
impl Asset {
|
||||||
@@ -26,7 +24,6 @@ impl Asset {
|
|||||||
Wav3 => "sound/waka/3.ogg",
|
Wav3 => "sound/waka/3.ogg",
|
||||||
Wav4 => "sound/waka/4.ogg",
|
Wav4 => "sound/waka/4.ogg",
|
||||||
Atlas => "atlas.png",
|
Atlas => "atlas.png",
|
||||||
AtlasJson => "atlas.json",
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,6 +33,7 @@ mod imp {
|
|||||||
use crate::error::AssetError;
|
use crate::error::AssetError;
|
||||||
use crate::platform::get_platform;
|
use crate::platform::get_platform;
|
||||||
|
|
||||||
|
/// Returns the raw bytes of the given asset.
|
||||||
pub fn get_asset_bytes(asset: Asset) -> Result<Cow<'static, [u8]>, AssetError> {
|
pub fn get_asset_bytes(asset: Asset) -> Result<Cow<'static, [u8]>, AssetError> {
|
||||||
get_platform().get_asset_bytes(asset)
|
get_platform().get_asset_bytes(asset)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,15 +9,18 @@ use sdl2::{
|
|||||||
video::WindowContext,
|
video::WindowContext,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::entity::r#trait::Entity;
|
||||||
use crate::error::{EntityError, GameError, GameResult};
|
use crate::error::{EntityError, GameError, GameResult};
|
||||||
|
|
||||||
use crate::entity::{
|
use crate::entity::{
|
||||||
collision::{Collidable, CollisionSystem, EntityId},
|
collision::{Collidable, CollisionSystem, EntityId},
|
||||||
ghost::{Ghost, GhostType},
|
ghost::{Ghost, GhostType},
|
||||||
pacman::Pacman,
|
pacman::Pacman,
|
||||||
r#trait::Entity,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::map::render::MapRenderer;
|
||||||
|
use crate::{constants, texture::sprite::SpriteAtlas};
|
||||||
|
|
||||||
pub mod state;
|
pub mod state;
|
||||||
use state::GameState;
|
use state::GameState;
|
||||||
|
|
||||||
@@ -168,13 +171,36 @@ impl Game {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn draw<T: RenderTarget>(&mut self, canvas: &mut Canvas<T>, backbuffer: &mut Texture) -> GameResult<()> {
|
pub fn draw<T: RenderTarget>(&mut self, canvas: &mut Canvas<T>, backbuffer: &mut Texture) -> GameResult<()> {
|
||||||
|
// Only render the map texture once and cache it
|
||||||
|
if !self.state.map_rendered {
|
||||||
|
let mut map_texture = self
|
||||||
|
.state
|
||||||
|
.texture_creator
|
||||||
|
.create_texture_target(None, constants::CANVAS_SIZE.x, constants::CANVAS_SIZE.y)
|
||||||
|
.map_err(|e| GameError::Sdl(e.to_string()))?;
|
||||||
|
|
||||||
|
canvas
|
||||||
|
.with_texture_canvas(&mut map_texture, |map_canvas| {
|
||||||
|
let mut map_tiles = Vec::with_capacity(35);
|
||||||
|
for i in 0..35 {
|
||||||
|
let tile_name = format!("maze/tiles/{}.png", i);
|
||||||
|
let tile = SpriteAtlas::get_tile(&self.state.atlas, &tile_name).unwrap();
|
||||||
|
map_tiles.push(tile);
|
||||||
|
}
|
||||||
|
MapRenderer::render_map(map_canvas, &mut self.state.atlas, &mut map_tiles);
|
||||||
|
})
|
||||||
|
.map_err(|e| GameError::Sdl(e.to_string()))?;
|
||||||
|
self.state.map_texture = Some(map_texture);
|
||||||
|
self.state.map_rendered = true;
|
||||||
|
}
|
||||||
|
|
||||||
canvas
|
canvas
|
||||||
.with_texture_canvas(backbuffer, |canvas| {
|
.with_texture_canvas(backbuffer, |canvas| {
|
||||||
canvas.set_draw_color(Color::BLACK);
|
canvas.set_draw_color(Color::BLACK);
|
||||||
canvas.clear();
|
canvas.clear();
|
||||||
self.state
|
if let Some(ref map_texture) = self.state.map_texture {
|
||||||
.map
|
canvas.copy(map_texture, None, None).unwrap();
|
||||||
.render(canvas, &mut self.state.atlas, &mut self.state.map_tiles);
|
}
|
||||||
|
|
||||||
// Render all items
|
// Render all items
|
||||||
for item in &self.state.items {
|
for item in &self.state.items {
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
use sdl2::{image::LoadTexture, render::TextureCreator, video::WindowContext};
|
use sdl2::{
|
||||||
|
image::LoadTexture,
|
||||||
|
render::{Texture, TextureCreator},
|
||||||
|
video::WindowContext,
|
||||||
|
};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@@ -15,11 +19,13 @@ use crate::{
|
|||||||
game::EntityId,
|
game::EntityId,
|
||||||
map::Map,
|
map::Map,
|
||||||
texture::{
|
texture::{
|
||||||
sprite::{AtlasMapper, AtlasTile, SpriteAtlas},
|
sprite::{AtlasMapper, SpriteAtlas},
|
||||||
text::TextTexture,
|
text::TextTexture,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/atlas_data.rs"));
|
||||||
|
|
||||||
/// The `GameState` struct holds all the essential data for the game.
|
/// The `GameState` struct holds all the essential data for the game.
|
||||||
///
|
///
|
||||||
/// This includes the score, map, entities (Pac-Man, ghosts, items),
|
/// This includes the score, map, entities (Pac-Man, ghosts, items),
|
||||||
@@ -29,7 +35,6 @@ use crate::{
|
|||||||
pub struct GameState {
|
pub struct GameState {
|
||||||
pub score: u32,
|
pub score: u32,
|
||||||
pub map: Map,
|
pub map: Map,
|
||||||
pub map_tiles: Vec<AtlasTile>,
|
|
||||||
pub pacman: Pacman,
|
pub pacman: Pacman,
|
||||||
pub pacman_id: EntityId,
|
pub pacman_id: EntityId,
|
||||||
pub ghosts: SmallVec<[Ghost; 4]>,
|
pub ghosts: SmallVec<[Ghost; 4]>,
|
||||||
@@ -47,6 +52,11 @@ pub struct GameState {
|
|||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
pub audio: Audio,
|
pub audio: Audio,
|
||||||
|
|
||||||
|
// Map texture pre-rendering
|
||||||
|
pub(crate) map_texture: Option<Texture<'static>>,
|
||||||
|
pub(crate) map_rendered: bool,
|
||||||
|
pub(crate) texture_creator: &'static TextureCreator<WindowContext>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GameState {
|
impl GameState {
|
||||||
@@ -58,7 +68,7 @@ impl GameState {
|
|||||||
pub fn new(texture_creator: &'static TextureCreator<WindowContext>) -> GameResult<Self> {
|
pub fn new(texture_creator: &'static TextureCreator<WindowContext>) -> GameResult<Self> {
|
||||||
let map = Map::new(RAW_BOARD)?;
|
let map = Map::new(RAW_BOARD)?;
|
||||||
|
|
||||||
let pacman_start_node = map.start_positions.pacman;
|
let start_node = map.start_positions.pacman;
|
||||||
|
|
||||||
let atlas_bytes = get_asset_bytes(Asset::Atlas)?;
|
let atlas_bytes = get_asset_bytes(Asset::Atlas)?;
|
||||||
let atlas_texture = texture_creator.load_texture_bytes(&atlas_bytes).map_err(|e| {
|
let atlas_texture = texture_creator.load_texture_bytes(&atlas_bytes).map_err(|e| {
|
||||||
@@ -68,21 +78,15 @@ impl GameState {
|
|||||||
GameError::Texture(TextureError::LoadFailed(e.to_string()))
|
GameError::Texture(TextureError::LoadFailed(e.to_string()))
|
||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
let atlas_json = get_asset_bytes(Asset::AtlasJson)?;
|
|
||||||
let atlas_mapper: AtlasMapper = serde_json::from_slice(&atlas_json)?;
|
|
||||||
let atlas = SpriteAtlas::new(atlas_texture, atlas_mapper);
|
|
||||||
|
|
||||||
let mut map_tiles = Vec::with_capacity(35);
|
let atlas_mapper = AtlasMapper {
|
||||||
for i in 0..35 {
|
frames: ATLAS_FRAMES.into_iter().map(|(k, v)| (k.to_string(), *v)).collect(),
|
||||||
let tile_name = format!("maze/tiles/{}.png", i);
|
};
|
||||||
let tile = SpriteAtlas::get_tile(&atlas, &tile_name)
|
let atlas = SpriteAtlas::new(atlas_texture, atlas_mapper);
|
||||||
.ok_or(GameError::Texture(TextureError::AtlasTileNotFound(tile_name)))?;
|
|
||||||
map_tiles.push(tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
let text_texture = TextTexture::new(1.0);
|
let text_texture = TextTexture::new(1.0);
|
||||||
let audio = Audio::new();
|
let audio = Audio::new();
|
||||||
let pacman = Pacman::new(&map.graph, pacman_start_node, &atlas)?;
|
let pacman = Pacman::new(&map.graph, start_node, &atlas)?;
|
||||||
|
|
||||||
// Generate items (pellets and energizers)
|
// Generate items (pellets and energizers)
|
||||||
let items = map.generate_items(&atlas)?;
|
let items = map.generate_items(&atlas)?;
|
||||||
@@ -123,7 +127,6 @@ impl GameState {
|
|||||||
Ok(Self {
|
Ok(Self {
|
||||||
map,
|
map,
|
||||||
atlas,
|
atlas,
|
||||||
map_tiles,
|
|
||||||
pacman,
|
pacman,
|
||||||
pacman_id,
|
pacman_id,
|
||||||
ghosts,
|
ghosts,
|
||||||
@@ -135,6 +138,9 @@ impl GameState {
|
|||||||
score: 0,
|
score: 0,
|
||||||
debug_mode: false,
|
debug_mode: false,
|
||||||
collision_system,
|
collision_system,
|
||||||
|
map_texture: None,
|
||||||
|
map_rendered: false,
|
||||||
|
texture_creator,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use crate::entity::graph::{EdgePermissions, Graph, Node, NodeId};
|
|||||||
use crate::entity::item::{Item, ItemType};
|
use crate::entity::item::{Item, ItemType};
|
||||||
use crate::map::parser::MapTileParser;
|
use crate::map::parser::MapTileParser;
|
||||||
use crate::map::render::MapRenderer;
|
use crate::map::render::MapRenderer;
|
||||||
use crate::texture::sprite::{AtlasTile, Sprite, SpriteAtlas};
|
use crate::texture::sprite::{Sprite, SpriteAtlas};
|
||||||
use glam::{IVec2, Vec2};
|
use glam::{IVec2, Vec2};
|
||||||
use sdl2::render::{Canvas, RenderTarget};
|
use sdl2::render::{Canvas, RenderTarget};
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::{HashMap, VecDeque};
|
||||||
@@ -154,14 +154,6 @@ impl Map {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Renders the map to the given canvas.
|
|
||||||
///
|
|
||||||
/// This function draws the static map texture to the screen at the correct
|
|
||||||
/// position and scale.
|
|
||||||
pub fn render<T: RenderTarget>(&self, canvas: &mut Canvas<T>, atlas: &mut SpriteAtlas, map_tiles: &mut [AtlasTile]) {
|
|
||||||
MapRenderer::render_map(canvas, atlas, map_tiles);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Generates Item entities for pellets and energizers from the parsed map.
|
/// Generates Item entities for pellets and energizers from the parsed map.
|
||||||
pub fn generate_items(&self, atlas: &SpriteAtlas) -> GameResult<Vec<Item>> {
|
pub fn generate_items(&self, atlas: &SpriteAtlas) -> GameResult<Vec<Item>> {
|
||||||
// Pre-load sprites to avoid repeated texture lookups
|
// Pre-load sprites to avoid repeated texture lookups
|
||||||
|
|||||||
@@ -72,7 +72,6 @@ impl Platform for DesktopPlatform {
|
|||||||
Asset::Wav3 => Ok(Cow::Borrowed(include_bytes!("../../assets/game/sound/waka/3.ogg"))),
|
Asset::Wav3 => Ok(Cow::Borrowed(include_bytes!("../../assets/game/sound/waka/3.ogg"))),
|
||||||
Asset::Wav4 => Ok(Cow::Borrowed(include_bytes!("../../assets/game/sound/waka/4.ogg"))),
|
Asset::Wav4 => Ok(Cow::Borrowed(include_bytes!("../../assets/game/sound/waka/4.ogg"))),
|
||||||
Asset::Atlas => Ok(Cow::Borrowed(include_bytes!("../../assets/game/atlas.png"))),
|
Asset::Atlas => Ok(Cow::Borrowed(include_bytes!("../../assets/game/atlas.png"))),
|
||||||
Asset::AtlasJson => Ok(Cow::Borrowed(include_bytes!("../../assets/game/atlas.json"))),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
use pacman::{
|
use pacman::{
|
||||||
asset::{get_asset_bytes, Asset},
|
asset::{get_asset_bytes, Asset},
|
||||||
texture::sprite::SpriteAtlas,
|
game::state::ATLAS_FRAMES,
|
||||||
|
texture::sprite::{AtlasMapper, SpriteAtlas},
|
||||||
};
|
};
|
||||||
use sdl2::{
|
use sdl2::{
|
||||||
image::LoadTexture,
|
image::LoadTexture,
|
||||||
@@ -28,12 +29,13 @@ pub fn setup_sdl() -> Result<(Canvas<Window>, TextureCreator<WindowContext>, Sdl
|
|||||||
pub fn create_atlas(canvas: &mut sdl2::render::Canvas<sdl2::video::Window>) -> SpriteAtlas {
|
pub fn create_atlas(canvas: &mut sdl2::render::Canvas<sdl2::video::Window>) -> SpriteAtlas {
|
||||||
let texture_creator = canvas.texture_creator();
|
let texture_creator = canvas.texture_creator();
|
||||||
let atlas_bytes = get_asset_bytes(Asset::Atlas).unwrap();
|
let atlas_bytes = get_asset_bytes(Asset::Atlas).unwrap();
|
||||||
let atlas_json = get_asset_bytes(Asset::AtlasJson).unwrap();
|
|
||||||
|
|
||||||
let texture = texture_creator.load_texture_bytes(&atlas_bytes).unwrap();
|
let texture = texture_creator.load_texture_bytes(&atlas_bytes).unwrap();
|
||||||
let texture: Texture<'static> = unsafe { std::mem::transmute(texture) };
|
let texture: Texture<'static> = unsafe { std::mem::transmute(texture) };
|
||||||
|
|
||||||
let mapper: pacman::texture::sprite::AtlasMapper = serde_json::from_slice(&atlas_json).unwrap();
|
let atlas_mapper = AtlasMapper {
|
||||||
|
frames: ATLAS_FRAMES.into_iter().map(|(k, v)| (k.to_string(), *v)).collect(),
|
||||||
|
};
|
||||||
|
|
||||||
SpriteAtlas::new(texture, mapper)
|
SpriteAtlas::new(texture, atlas_mapper)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user