Feuer auf der PSP - der Allgorythmus
Die Formel aus der das Feuer berechnet wird ist relativ einfach. Es gibt einschlägige Seiten (auch die meine )
die diesen näher beschreiben. Darum verweise ich hier auf die Beschreibung im Netz. Anhand eines Windows-Programmes wird hier die Formel erläutert. Doch wir wollen das ganze ja in der PSP implementieren.
Das Feuer Homebrew
Als erstes erstellen wir in unserem Projekt ein Klasse, welche von der allgemeinen 2D-Homebrewklasse abgeleitet wird und
nennen diese ClPspFeuer. Bevor wir hier auf die PSP spezifika eingehen werden wir in dieser Klasse erstmal
die Feuerroutine implementieren. Dazu definieren wir einen Puffer der die Hitzepunkte unseres Feuers aufnehmen kann und
die Routine welche das Feuer in diesem Puffer berechnet.
#define FIRE_WIDTH 240
#define FIRE_HEIGHT 50
class ClPspFeuer : public Cl2dHomebrew {
protected:
/*
* berechnen des Feuers
*/
void calculateFire();
private:
/*
* das Feuer in einer Größe 240×50
*/
unsigned char feuer[FIRE_WIDTH][FIRE_HEIGHT];
Die Implementierung der Feuerberechnung sieht dann wie folgt aus:
void ClPspFeuer::calculateFire(){
//zunächst in der letzten Zeile des Feuers ganz heiße Punkte dazu..
for (int n=0;n<25;n++){
//25 neue Punkte
int x = rand() % FIRE_WIDTH;
int heat = feuer[x][FIRE_HEIGHT-1];
heat += rand() % 16;
if (heat > 255) heat = 0;
feuer[x][FIRE_HEIGHT-1] = heat;
}
//dann von oben nach unten die neue Hitze berechnen
for (int y=0;y < FIRE_HEIGHT-1;y++){
for (int x=1;x < FIRE_WIDTH-1;x++){
int heat = feuer[x][y] + feuer[x][y+1] + feuer[x+1][y+1] + feuer[x-1][y+1];
heat >>= 2;
//abkühlen
if (heat > 0) heat--;
feuer[x][y] = heat;
}
}
}
Feuer und Homebrew
Nun ist der “heiße” Teil erledigt. Nun müssen wir unsere Homebrew Klasse noch erweitern, so dass wir diese auch nutzen können.
Wenn wir an die allgemeine Homebrewklasse zurückdenken sehen wir, dass wir folgende Methoden implementieren müssen:
init(): initialisieren der Basisklasse und den Zufallsgenerator rand() initialisieren.
mainthread(): Hier wird das Feuer berechnet und gezeichnet
Wir brauchen ein paar neue Includes und können dann die verschiedenen Methoden implementieren...
extern “C”{
#include
#include
}
bool ClPspFeuer::init(){
if (!Cl2dHomebrew::init()) return false;
//Zufallsgenerator initialisieren
srand(1002345);
return true;
}
void ClPspFeuer::render(u32* vram){
//in der Hauptroutine das Feuer Berechnen und zeichnen
calculateFire();
//ein kleiner Text...
pspDebugScreenPrintf(”Hallo Feuer!”);
//zeichne Feuer an festgelegter Position (top, left)
drawFire(120, 110);
}
void ClPspFeuer::drawFire(int startX, int startY){
//jeden Feuerpunkt als Bildpunkt mit einer Farbe
//in Abhängigkeit von der Hitze setzen
for (int x=0;x<240;x++){
for (int y=0;y<50;y++){
setPixel(x+startX, y+startY, (int)feuer[x][y]);
}
}
}
Das Ergebnis
Wenn das erstellen des Homebrews geklappt hat, dann sollte es auf der PSP nun so aussehen:
|