Hey Z,
[edit #2]
Ok this is a crude attempt of a remake of the Atari game Indy 500 that was published in 1978. If you've ever played it you'll remember it mostly for the oval track with the ice surface. Sliding around on that track was more fun than actually racing.
It's not completed, but you can drive around and the car responds to different types of terrain. I wanted to finish this, but I've had guests all weekend. Problems I still haven't fixed with the basic game mechanics include (there may be others):
* if you're sliding and accelerating you get odd boosts of speed (I tried fixing this by normalizing the vector with weird results)
* when doing "donuts" car will slide out a bit, periodically. While kinda cool, it's not by design.
* the "friction coefficients" could probably use some tweaking. Notice that the closer the friction value gets to zero, the greater the friction. It's counter-intuitive, I know, but that's how dbCurveValue() works.
Next steps after fixing these would be
* allowing 2 player interaction
* provide checkpoints, goals and scoring
-Frank
#ifndef _LEVELS_H
#define _LEVELS_H
/******************************************************************************
* At first glance, this might seem like it's declared backwards. It isn't.
* When I first declared it, I had declared it as level1[40][24] but the
* subaggregate grouping in C++ specifies that the sub-groups correspond with
* the first index, not the second.
*
* As a result, throughout my program I'll be referencing these arrays [y][x]
* instead of [x][y]. I had to look this up to make sure I wasn't missing
* something. I strongly recommend a good C/C++ reference.
******************************************************************************/
int level1[24][40] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
int level2[24][40] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
int level3[24][40] = {
{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
};
int level4[24][40] = {
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1}
};
int level5[24][40] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1},
{1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1},
{1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
#endif
And here's the main program itself:
#include "DarkGDK.h"
#include "levels.h"
// Playing area dimensions
const int g_width = 640;
const int g_height = 384;
// Since I have so few unique images, I'll just declare constants for the image numbers
const int CAR1 = 1;
const int CAR2 = 2;
const int PAVEMENT = 3;
const int GRASS = 4;
const int DIRT = 5;
const int ICE = 6;
// the cars use sprite numbers 1 and 2, so we start terrain tiles at 3
const int TILE_OFFSET = 3;
// friction coefficient for different types of terrain (the higher the number, the lower the friction)
const double g_iceFriction = 100;
const double g_dirtFriction = 50;
const double g_grassFriction = 25;
const double g_pavementFriction = 10;
// vehicle acceleration
const double g_acceleration = 3.00;
// player structure to hold all necessary info
struct objPlayer {
float x, y; // current position
float angle; // current heading
float vx, vy; // current velocity along the x and y axes, respectively
float mx, my; // maximum velocity along the axes
};
struct objPlayer g_player1;
struct objPlayer g_player2;
// function prototypes
void makeCars(void);
void myBox(int x1, int x2, int y1, int y2, int c1, int c2, int orientation);
void makeTerrain(void);
void semiRandomTile(int left, int top, int width, int height, int rMax, int gMax, int bMax);
void displayLevel(int ptr[24][40], int img1, int img2);
void handleInput(void);
void update(void);
// main body of the program
void DarkGDK(void) {
dbSetDisplayMode(640, 384, 32);
dbSetWindowTitle("Dark GDK Challenge 1 - Indy 500 (Atari 1978)");
dbSyncOn();
dbSyncRate(60);
makeCars();
makeTerrain();
dbColorBackdrop(0);
g_player1.x = 480;
g_player1.y = 336;
g_player1.angle = 180;
while (LoopGDK()) {
// displayLevel(level3, DIRT, GRASS);
// displayLevel(level1, ICE, DIRT);
displayLevel(level5, ICE, PAVEMENT);
// dbSprite(CAR1, 31*16, (18*16) + 4, CAR1);
// dbSprite(CAR2, 31*16, (20*16) + 12, CAR2);
handleInput();
update();
dbSync();
}
return; // end the program properly
}
/******************************************************************************
* This makes our cool little indy cars.
******************************************************************************/
void makeCars(void) {
int c1, c2;
// make the tires
c1 = dbRGB(32, 32, 32);
c2 = dbRGB(64, 64, 64);
myBox(0, 0, 12, 8, c1, c2, 0);
myBox(16, 0, 28, 8, c1, c2, 0);
myBox(0, 24, 12, 32, c1, c2, 0);
myBox(16, 24, 28, 32, c1, c2, 0);
// make the axles
c1 = dbRGB(64, 64, 64);
c2 = dbRGB(128, 128, 128);
myBox(4, 8, 8, 12, c1, c2, 0);
myBox(20, 8, 24, 12, c1, c2, 0);
myBox(4, 20, 8, 24, c1, c2, 0);
myBox(20, 20, 24, 24, c1, c2, 0);
// make the body of the blue car and get the image
c1 = dbRGB(0, 0, 96);
c2 = dbRGB(0, 0, 192);
myBox(2, 12, 32, 20, c1, c2, 1);
dbGetImage(CAR1, 0, 0, 32, 32);
// make the body of the red car and get the image
c1 = dbRGB(96, 0, 0);
c2 = dbRGB(192, 0, 0);
myBox(2, 12, 32, 20, c1, c2, 1);
dbGetImage(CAR2, 0, 0, 32, 32);
}
/******************************************************************************
* Draw a two boxes drawn seamlessly together with gradients radiating from a
* center line to simulate a round shape.
******************************************************************************/
void myBox(int x1, int y1, int x2, int y2, int c1, int c2, int orientation) {
int mid;
// an orientation of 0 results in a gradient that runs left to right
if (orientation == 0) {
mid = ((x2 - x1) / 2) + x1;
dbBox(x1, y1, mid, y2, c1, c1, c2, c2);
dbBox(mid, y1, x2, y2, c2, c2, c1, c1);
// while an orientation of 1 results in a gradient that runs top to bottom
} else {
mid = ((y2 - y1) / 2) + y1;
dbBox(x1, y1, x2, mid, c2, c1, c2, c1);
dbBox(x1, mid, x2, y2, c1, c2, c1, c2);
}
}
/******************************************************************************
* Make all of the appropriate terrain tiles
******************************************************************************/
void makeTerrain(void) {
semiRandomTile(32, 0, 16, 16, 32, 32, 32);
dbGetImage(PAVEMENT, 32, 0, 48, 16);
semiRandomTile(48, 0, 16, 16, 0, 128, 0);
dbGetImage(GRASS, 48, 0, 64, 16);
semiRandomTile(64, 0, 16, 16, 128, 64, 0);
dbGetImage(DIRT, 64, 0, 80, 16);
semiRandomTile(80, 0, 16, 16, 128, 128, 255);
dbGetImage(ICE, 80, 0, 96, 16);
}
/******************************************************************************
* This makes a tile at a specific location, in the specified color with
* variations in the saturation level.
******************************************************************************/
void semiRandomTile(int left, int top, int width, int height, int rMax, int gMax, int bMax) {
double red, green, blue;
int sat;
// convert all of our color values to a number between 0.0 and 1.0
red = rMax / 255.0;
green = gMax / 255.0;
blue = bMax / 255.0;
// place dots of random saturation levels all throughout our tile
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// pick a saturation level between 50-100% (RGB values of 128-255)
sat = dbRnd(127) + 128;
dbInk(dbRGB(red * sat, green * sat, blue * sat), 0);
dbDot(x + left, y + top);
}
}
}
/******************************************************************************
* Step through the array in question and draw the sprites using the given
* images. This allows us to easily use the same basic level with multiple
* terrain types.
******************************************************************************/
void displayLevel(int ptr[24][40], int img1, int img2) {
int i = TILE_OFFSET;
for (int y = 0; y < 24; y++) {
for (int x = 0; x < 40; x++) {
if (ptr[y][x] == 2) {
dbSprite(i, x*16, y*16, img1);
} else {
dbSprite(i, x*16, y*16, img2);
}
i++;
}
}
}
void handleInput(void) {
g_player1.mx = 0.0; g_player1.my = 0.0;
// rotate the player's car clockwise
if (dbRightKey() == 1) { g_player1.angle = dbWrapValue(g_player1.angle + 2); }
// rotate the player's car counter-clockwise
if (dbLeftKey() == 1) { g_player1.angle = dbWrapValue(g_player1.angle - 2); }
// accelerate the car to it's maximum velocity -- restrict each component to the maximum velocity allowed
if (dbUpKey() == 1) {
// calculate the x component
g_player1.mx = g_acceleration * dbCos(g_player1.angle);
// calculate the y component
g_player1.my = g_acceleration * dbSin(g_player1.angle);
// g_player1.vx = g_player1.mx;
// g_player1.vy = g_player1.my;
// only modify our current velocity upwards
if (abs(g_player1.mx) > abs(g_player1.vx)) { g_player1.vx = g_player1.mx; }
if (abs(g_player1.my) > abs(g_player1.vy)) { g_player1.vy = g_player1.my; }
}
}
void update(void) {
int sprite, terrain;
float mag;
// adjust the player's position based on the current movement vector
g_player1.x = g_player1.x + g_player1.vx;
g_player1.y = g_player1.y + g_player1.vy;
// wrap around the edges of the playing area
if (g_player1.x > g_width) { g_player1.x -= g_width; }
if (g_player1.x < 0) { g_player1.x += g_width; }
if (g_player1.y > g_height) { g_player1.y -= g_height; }
if (g_player1.y < 0) { g_player1.y += g_height; }
dbSprite(CAR1, g_player1.x, g_player1.y, CAR1);
dbOffsetSprite(CAR1, 16, 16);
dbRotateSprite(CAR1, g_player1.angle);
sprite = dbSpriteCollision(CAR1, 0);
terrain = dbSpriteImage(sprite);
// adjust the x and y components of the player's velocity using the correct friction value
switch (terrain) {
case ICE:
g_player1.vx = dbCurveValue(0.0, g_player1.vx, g_iceFriction);
g_player1.vy = dbCurveValue(0.0, g_player1.vy, g_iceFriction);
break;
case DIRT:
g_player1.vx = dbCurveValue(0.0, g_player1.vx, g_dirtFriction);
g_player1.vy = dbCurveValue(0.0, g_player1.vy, g_dirtFriction);
break;
case GRASS:
g_player1.vx = dbCurveValue(0.0, g_player1.vx, g_grassFriction);
g_player1.vy = dbCurveValue(0.0, g_player1.vy, g_grassFriction);
break;
case PAVEMENT:
g_player1.vx = dbCurveValue(0.0, g_player1.vx, g_pavementFriction);
g_player1.vy = dbCurveValue(0.0, g_player1.vy, g_pavementFriction);
break;
default:
g_player1.vx = 0;
g_player1.vy = 0;
}
// if our velocity vector is less than our current maximum, adjust it to our maximum
if (abs(g_player1.vx) < abs(g_player1.mx)) { g_player1.vx = g_player1.mx; }
if (abs(g_player1.vy) < abs(g_player1.my)) { g_player1.vy = g_player1.my; }
}