![logo](./screen-shot/logo.png) ![License] [![Latest Version]][crates.io] ![Downloads] [![API Documentation]][docs.rs] ![MSRV] [License]: https://img.shields.io/badge/license-Apache2.0-blue.svg [Latest Version]: https://img.shields.io/crates/v/rust_pixel.svg [crates.io]: https://crates.io/crates/rust_pixel [Downloads]: https://img.shields.io/crates/d/rust_pixel.svg [API Documentation]: https://docs.rs/rust_pixel/badge.svg [docs.rs]: https://docs.rs/rust_pixel [MSRV]: https://img.shields.io/badge/rust-1.71+-brightgreen.svg?&logo=rust [Change Log]  |  [Principle]  |  [Coding]  |  [FAQ]  |  [TODO] [Change Log]: doc/change.md [Principle]: doc/principle.md [Coding]: doc/coding.md [FAQ]: doc/faq.md [TODO]: doc/todo.md RustPixel is a **2D game engine** & **rapid prototyping tools**, supporting both **text** and **graphics** rendering modes.
It is suitable for creating **2D pixel-style games** and developing **terminal applications**.
It can be compiled into **FFI** for front-end and back-end use, and into **WASM** for web projects. - Text Mode: Built with **crossterm**, runs in the terminal, and uses **ASCII & Unicode Emoji** for drawing. - Graphical Mode (SDL2 & WEB): Built with **glow** & **sdl2**, using **PETSCII & custom graphics symbols** for rendering. [online demo]: https://zipxing.github.io/rust_pixel Here is a petscii art painting browser made with **rust_pixel**. Special thanks to x.com/PETSCIIWORLD for the character painting and the transition shader provided by **gltransition**. Click here for [online demo]。 https://github.com/user-attachments/assets/8e9e0837-43fd-4f18-a5ad-265a06ddb47e ### Features - Game loops & Model/Render design pattern (game.rs) - Event/Timer messaging mechanism (event.rs) - Support text render mode (crossterm) (adapter.rs, cross.rs) - Unified OpenGL drawing mode supports sdl and wasm (glow & sdl2) (adapter.rs, sdl.rs, web.rs) - 3 core OpenGl shaders for sdl2 & web graphics mode: (gl/) - gl instance rendering shader for draw mainbuffer (render_symbols.rs) - gl transition shader for transition effect (render_transition.rs) - gl general 2d shader for draw render texture (render_general2d.rs) - Some common game algorithms (algorithm.rs, algorithm/, util.rs, util/) - audio & log support (audio.rs, log.rs) - Demo games: tetris, tower, poker... (games/) - Demo terminal ui app: palette... (apps/) - Examples of wrapping core algorithms into FFI and WASM (games/poker/ffi, games/poker/wasm) ### Installation Guide The main steps of the installation process are as follows: - Install [DroidSansMono Nerd Font] & setup terminal - Install dependent libraries and softwares - Install **Rust** and **Wasm-pack** The detailed steps for each operating system:   [MacOS]   |   [Linux]   |   [Windows] [MacOS]: doc/mac.md [Linux]: doc/linux.md [Windows]: doc/win.md [DroidSansMono Nerd Font]: https://github.com/ryanoasis/nerd-fonts Next, you should clone **RustPixel** and deploy **cargo-pixel** tool: ``` git clone https://github.com/zipxing/rust_pixel cd rust_pixel cargo install --path tools/cargo-pixel --root ~/.cargo ``` ### Usage Instructions ``` cd rust_pixel cargo pixel run snake term #Run the snake game in terminal mode cargo pixel r snake t #Run the snake game in terminal mode - shorthand cargo pixel r tetris s #Run the Tetris game in SDL window mode cargo pixel r tower w #Run tower in web,visit http://localhost:8080/ in your browser cargo pixel r tower w --webport 8081 #Change web server port cargo pixel r tower w -r #Run with release mode ``` You can also use cargo pixel to create your own game or app: ``` cargo pixel c games mygame #Create mygame in ./games using games/template as a template cargo pixel c apps myapp #Create myapp in ./apps using games/template as a template ``` Creat a standalone app in some directory: ``` cargo pixel c .. myapp --standalone #Create a standalone crate in ../myapp cd ../myapp cargo pixel r myapp t cargo pixel r myapp s ``` RustPixel also includes several tools: 1. **palette**: A terminal-ui tool to generate, analyze, convert and manipulate colors. ``` cargo pixel r palette t -r ``` ![palette](./screen-shot/palette.gif) 2. **tedit**: Used to edit character art assets, example: ``` #term mode cargo pixel r tedit term assets/screen-shot/tedit.txt #graphics mode cargo pixel r tedit sdl assets/screen-shot/tedit.pix ``` ![tedit_t](./screen-shot/tedit_term.png) ![tedit_s](./screen-shot/tedit_sdl.png) 3. **tpetii**: Used to convert regular images into PETSCII character art, example: ``` cargo pixel r tpetii t assets/a.png -r > assets/a.pix cargo pixel r tedit s assets/a.pix ``` ``` cargo pixel r tpetii t assets/lion.png 40 40 -r > assets/lion.pix cargo pixel r tedit s assets/lion.pix ``` ![tpetii_1](./screen-shot/a.png) ![tpetii_2](./screen-shot/lion.png) 4. Script to automatically **convert gif images into PETSCII animations (.ssf)** ``` cargo pixel cg assets/sdq/fire.gif assets/sdq/fire.ssf 40 25 ``` ### Demo games 1. snake: A snake game with a cool PETSCII animations ``` #graphics mode cargo pixel r snake s -r ``` ![graphics mode](./screen-shot/snake_sdl.gif) ``` #term mode cargo pixel r snake t -r ``` ``` #web mode cargo pixel r snake w -r #and visit http://localhost:8080/ in your browser ``` 2. tetris: A Tetris game where you can play against AI ``` #term mode cargo pixel r tetris t -r ``` ![term mode](./screen-shot/tetris_term.gif) ``` #graphics mode cargo pixel r tetris s -r ``` ![graphics mode](./screen-shot/tetris_sdl.gif) ``` #web mode cargo pixel r tetris w -r #and visit http://localhost:8080/ in your browser ``` ![web mode](./screen-shot/tetris_web.gif) 3. poker: Includes the core algorithms for Texas Hold'em and Gin Rummy ``` cargo pixel r poker t -r cargo pixel r gin_rummy t -r ``` ![gin_rummy](./screen-shot/ginrummy.png) ![red_black](./screen-shot/redblack.png) The poker/ffi directory demo how to wrap Rust algorithms into CFFI for use with other languages, showcasing C++ and Python calling poker_ffi ``` cd games/poker/ffi make run ``` The poker/wasm directory demo how to wrap Rust algorithms into wasm for JS calling ``` cd games/poker/wasm make run ``` 4. tower: A tower defense game prototype demonstrating the use of objpool and pixel_sprite for pixel-perfect sprite movement ``` #graphics mode cargo pixel r tower s -r #web mode cargo pixel r tower w -r #and visit http://localhost:8080/ in your browser ``` ![tower](./screen-shot/tower_sdl.gif) and so on ... ...