83 lines
3.8 KiB
Markdown
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.
|