Pokitto-Raycasting/README.md
2018-10-04 19:27:03 +00:00

83 lines
3.8 KiB
Markdown

# 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.
![](https://gitlab.com/drummyfish/raycastlib/raw/master/media/pokitto1.gif)
![](https://gitlab.com/drummyfish/raycastlib/raw/master/media/pokitto2.gif)
![](https://gitlab.com/drummyfish/raycastlib/raw/master/media/pokitto3.gif)
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](https://gitlab.com/drummyfish/raycastlib).
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.