This page was last updated on March 13th, 2020(UTC) and it is currently May 30th, 2023(UTC).
That means this page is 3 years, 78 days, 3 hours, 54 minutes and 21 seconds old. Please keep that in mind.
40 - Classes for Stars
Now, that which makes C++ more popular than C for most projects. C++ is a constantly evolving language, unfortunately, which means you might've run into some snags if you tried this on a modern C++ compiler. Ultimately, you'll want to leave what you learned here behind on the DOS emulator, and learn the modern equivalent, reading from a reference book. That said, I expect most of this to stay the same. While C has structs and enums, which C++ still has, C++ has classes, which can do some things that structs cannot. Down the rabbit hole we go...
#include <stdio.h>
//-------------------------------------------------------------------------
//Defines are compiletime only variables.
#define xsize 320
#define ysize 200
#define starnum 200
//-------------------------------------------------------------------------
extern "C" void srand(int seed);
extern "C" int rand();
extern "C" int time(int ptr);
//-------------------------------------------------------------------------
extern "C" int easymode();
extern "C" char buffer[0xfa00];
//-------------------------------------------------------------------------
class star {
int x, y;
public:
star(){
x = rand() % xsize;
y = rand() % ysize;
}
void draw(int px, int py){
if((y - py) < 0){
y = ysize + py;
x = rand() % xsize - px;
} else if((y - py) > ysize){
y = py;
x = rand() % xsize - px;
}
if((x - px) < 0) {
x = xsize + px;
y = rand() % ysize - py;
} else if ((x - px) > xsize){
x = px;
y = rand() % ysize - py;
}
buffer[(y - py) * xsize + (x - px)] = 0x0f;
}
};
//-------------------------------------------------------------------------
star starfield[starnum];
int scroll = 0;
//-------------------------------------------------------------------------
int main(){ return easymode(); }
//-------------------------------------------------------------------------
extern "C" int init(){
srand(time(0));
for(int i = 0; i < starnum; i++) starfield[i] = star();
return 0;
}
//-------------------------------------------------------------------------
extern "C" int cleanup(){ return 0; }
//-------------------------------------------------------------------------
extern "C" int draw(){
for (int i = 0; i < starnum; i++) starfield[i].draw(scroll, 0);
scroll++;
return 1;
}
Yep, we have the impossibly fast moving stars, 'cause we're in space and moving fast, even though we don't have a ship or anything on the screen. This is to show classes at their most basic before moving on. The idea is a "class" allows you to create your own datatypes, with their own properties. Functions from a class are identified via the object (viariable instance of the class) then a dot, then the function (and paramters). There's also "this->" ("this" is actually a pointer to the object from within the defining class) for referring to variables from the class, but it's OK as long as there's no conflicts to omit the "this->", but feel free to experiment. I'm honestly not sure why they insisted on making "->" separate from "." but note that it's not advised to try to use them interchangeably.
Get your own web kitty here!
©Copyright 2010-2023. All rights reserved.