Ich sitze diesmal vor keinem wirklichen Problem, aber vor einer Frage. Undzwar bin ich gerade dabei bzw. habe gerade angefangen eine Physik/Grafic Engine (oder auch Schnittstellenbibiliothek) für mein eigenes kleines Spiel zu programmieren. Nun nehme ich gerade das Simulieren des Fallens auf mich. Da ich nichts derweiteren gefunden habe in der Allegro lib was dem gleicht, was ich vorhabe, habe ich meine eigenen kleinen Funktionen dazu geschrieben. Noch dazu zu sagen ist, dass der Code den ich poste nur für Testzwecke der Fallgeschwindigkeit etc. gedient hat und ich in meiner eigentlichen Bibiliothek/Engine das etwas anders darstellen werde, um es in mein Spiel zu intregrieren.
Von euch würde ich nun gerne wissen ob es vllt. noch eine weiter, besser Methode/Möglichkeit giebt das von mir erklärte Fallen darzustellen.
Freue mich über jede Antwort die mir weiter hilft.
Hier der Code:
PHP Code:
#include "stdafx.h" // allegro.h, winalleg.h aus ALLEGRO
double xpos=300; // x-Position (links-rechts)
double ypos; // y-Position (hoch-runter )
bool move_; //wird später noch gebraucht (ob Bewegung vorhanden)
BITMAP* back, *soldier; //2Bilder ( ein strichmännchen, ein hintergrund(siehe back=create_bitmap))
double fall_speed(double high){ //berechnen der Fallgeschwindigkeit (herzstück zum testen)
double speed;
speed=high/50; //geschwindigkeit= höhe(ypos) / Wert(veränderbar->langsamer)
return speed;
}
double move(){ //verändert bei dem Tasetendruck w die ypos
if(key[KEY_W]){
ypos=ypos-300; //ypos (höhe) -Wert BEACHTE: Koordinatensystem nicht mathematisch, sondern von oben nach unten zunehmend
move_=true;
}
else{move_=false;} //falls keine Bewegung vorhanden setze move_ auf false
return ypos;
return move_;
}
void demo_fall(double bottom,double speed){ //demonstrieren des Fallens (zeichnen)
while(ypos<bottom){ //solange nicht der Boden der Karte erreicht wird( Boden= höhe des Fensters - höhe des soldier BITMAPS)
/* Zeichne die beiden BITMAPS */
draw_sprite(screen,back,0,0);
draw_sprite(screen,soldier,xpos,ypos);
ypos+=4; //ypos(höhe) schrittweise zurücksetzen via berechneter Geschwindigkeit
Sleep(speed); // 1sec. warten bis zum nächsten Schleifendurchlauf
}
}
int set_y_back(){ // setzt ypos(höhe) auf bottom
int y; //ypos
y=600-(soldier->h); //ypos= bottom
return y;
}
int main(){
double speed; // Geschwindigkeit des Fallens
/* Installiere: allegro,keyboard */
allegro_init();
install_keyboard();
/* Erstellen eines Fensters und Farbentiefe setzen */
set_color_depth(16); //Farbentiefe: 16
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0); //Fenstermodus
/* Lade beide BITMAPS */
back=create_bitmap(800,600);
soldier=load_bitmap("Soldier.bmp",NULL);
double bottom=600-(soldier->h); //boden
ypos=600-(soldier->h); // erste Berechnung der ypos(höhe) (default auf den boden {siehe oben})
while(!key[KEY_ESC]){ //solange kein esc gedrückt wurde
ypos=set_y_back(); //setze ypos (höhe) zurück auf bottom (default)
/* Zeichne die beiden BITMAPS */
draw_sprite(screen,back,0,0);
draw_sprite(screen,soldier,xpos,ypos);
readkey(); //lese/warte auf eingabe
if(key[KEY_ESC]){ //falls esc schon hier gedrückt wurde gehe aus der Schleife hinaus
continue; //überspringe rumpf
}
move();
if(move_=true){ //falls eine Bewegung von statten gegangen ist
speed=fall_speed(ypos); //errechne Fallgeschwindigkeit
demo_fall(bottom,speed); //demonstriere das Fallen
}
}
/* BITMAPS löschen und allegro beenden */
destroy_bitmap(soldier);
destroy_bitmap(back);
allegro_exit();
/* Main Feedback */
return 0;
}
END_OF_MAIN();
P.S. Ich möchte keine fertigen Codes, ich möchte (nur) einen weiteren Denkanstoß den ich umsetzen könnte.