bin | ||
resources | ||
convert_png.py | ||
demo1.cpp | ||
demo2.cpp | ||
demo3.cpp | ||
general.hpp | ||
helloRay.cpp | ||
My_settings.h | ||
raycastlib.h | ||
README.md |
Pokitto Ray Casting Demos
These are demos showing advanced ray casting (pseudo) 3D rendering technique using raycastlib (a Pokitto-independent C library I made along with this project) on a small open gaming console Pokitto.
There are these demos:
- helloRay: Hello world program showing the very basic usage of raycastlib on Pokitto. If you want to learn about the code, start here.
- demo1: Showoff RPG-like program demonstrating most raycastlib features. Controls:
- arrows: move, rotate
- A + arrows: strafe, look up/down
- B: jump
- C: toggle running
- demo2: Classic "flat/1D" ray casting program in a sci-fi mood. Controls:
- arrows: move, rotate
- A: strafe
- B: shoot plasma
- demo3: Minecraft-like demo with procedurally generated editable world. Controls:
- arrows: move, rotate
- A + arrows: strafe, look up/down
- B: jump
- C: toggle square editing (up/down: change height, left/right: change color)
Included are also other tools I created, such as Python scripts for image conversion to the format I use. Everything should be sufficiently commented.
The last three demos use common definitions from the general.hpp file. This file contains some useful resources that you can use in your own game. You can of course as well create a game by expanding any of the demos.
There are a lot of compile-time options you can try out (especially in demo2), like turning various effects on/off, setting the rendering quality etc. Check out the defines at the beginning of each source code file.
The biggest impact on performance comes from per-pixel operations, so try to
keep the pixelFunc
as fast as possible. Turn unneeded raycastlib features off
with given defines.
The most effective way of increasing FPS is subsampling -- that means decreasing
horizontal resolution -- it looks uglier, but still very okay as the vertical
resolution still stays the same. You can do this by defining SUBSAMPLE
to a
specific value (1 = full resolution, 2 = half resolution etc.) before
including general.hpp header. You can also cut the resolution by e.g. adding
an info bar to the screen (it's better to add a vertical bar to the screen side
as that will also reduce the number of rays cast).
This repository contains the version of raycastlib that I tested the demos with, but you can find the most recent version of the library among my other repositories.
The demos use display Mode13, i.e. 110x88 with 256 colors. I recommend you use this mode for your games, but the other ones are an option too. I created a custom general 256-color HSV-based palette that allows for fast brigtness manipulation of colors, which is important for fog/dimming. Reusing this palette (or modifying it) will most likely be the best option for your project.
I used GNU Arm Embedded toolchain to compile the programs. Other compilers are
not tested. Don't forget to compile with -O3
!
Ideas For Games
Besides the obvious use the demos show, you can try to be more creative and try e.g.:
- a racing game
- 3D versions of classic 2D array games (snake, tetris, tower defense, ...)
- Casting the rays vertically instead of horizontally (just switch x and y when drawing the pixels). Walls become floors and vice versa. Could result in interesting games (and maybe faster rendering).
License
Everything is under CC0 1.0, including all the assets (they are mostly based on CC0 images I found at OpenGameArt). I always appreciate credit, but it's not required. More than credit I appreciate if you share your own software as free and open-source. With that said, use this in any way you want.