Allegrospiel läuft mal, mal aber auch nicht...
-
Hallo,
Vorgestern hab ich mein erstes allegrobasierendes Spiel fertiggeschrieben. An meinem Schrottrechner (Pentium III 500 MHz, 256 MB Arbeitsspeicher) lief und läuft alles prima. Dann hab ich mir gedacht, das Spiel mal auf anderen PCs auszuprobieren. Und siehe da: Auf einem recht neuen kann man's so gut wie gar nicht spielen (ruckelt!); einem ähnlich modernen Computer wieder schon, und auf einem dritten läuft alles bis auf ein stark ruckelndes Sprite.

Tja, irgendwie hab ich keine Ahnung was ich machen soll. Der Doublebuffer wird als Video- oder, wenn nicht möglich, als Systembitmap angelegt. Daran sollte es also auch nicht liegen. Aber woran dann?
Danke an alle, die mehr wissen als ich.Tschau,
Bernd
-
Könnt ein Timerproblem sein.
-
das kommt vor wenn man die geschwindigkeitsbegrenzungen im spiel mit so sachen wie
animateWalk();
_sleep(200);
animateWalk();
_sleep(200);anstatt mit framemessung und anpassung macht
-
Naja eigentlich sollte ich "eine logische konstante Framerate" (laut Programmierbuch) haben. Vielleicht hab ich da aber auch irgendwas falsch gemacht.
Aber wenns daran liegt, wieso läufts dann auf einem schnelleren PC langsamer
?
Mittlerweile hab ich das Spiel noch auf einem Notebook getestet; da hats prima geklappt. (Alle PCs mit Win XP!)dali schrieb:
Könnt ein Timerproblem sein.
Vielleicht schon eher. Aber recht viel weiter bringt mich das jetzt auch nicht...
-
Benutzt Du Allegro mit Visual C++ (also erzeugst Du ein Windows-Programm?) oder mit DJGPP oder einem anderen Compiler?
-
Ich nehm den Dev-C++ mit cygwin als Compiler (OK, eigentlich g++) her.
-
Ohne Sourcecode kann man da nicht viel sagen... Könnt zb auch eine Grafikkartengeschichte sein wenn die eine nur alles zb in Software macht die andere nicht denn was heißt schon schnellerer PC?
-
So, hier ist die Datei util.cpp, die für alles mögliche und die Grafik zuständig ist; direkt von der Buch CD eingefügt; ich hoff mal, dass man das darf. Meinen Quellcode fürs Spiel selbst möcht ich erst dann rausrücken, wenn in der Datei wirklich kein Fehler ist. Das liegt daran, dass mein Quellcode momentan noch ziemlich bescheiden aussieht (alles in eine main-Funkton gestopft...). Ansonsten geh ich sowieso davon aus, dass ihr meine primitiven Spielideen nicht gerade klauen müsst
Und wenn wärs mir auch egal. Aber im Moment ist mir der Quellcode noch ein wenig zu peinlich.
Hoffe ihr könnt mir auch so helfen.#include "util.h" // Double Buffer BITMAP *screenAlias = NULL; BITMAP *doubleBuffer = NULL; // Die Timer Variablen // ------------------------------------------------------- volatile int timerCounter = 0; static void timerCounterUpdater() { timerCounter++; } END_OF_STATIC_FUNCTION(timerCounterUpdater); void fatalError(char *str) { allegro_message(str); exit(0); } int setGfxMode(int mode, int width, int height) { static int colorDepths[] = { 16, 24, 15, 32}; int a; for (a=0; a < 4; a++) { set_color_depth(colorDepths[a]); if (set_gfx_mode(mode, width, height, 0, 0) >= 0) { return TRUE; } } return FALSE; } void playSound(SAMPLE *sample, int vol) { int freq= rnd(100) + 950; vol *= 5+(rnd(5)+1); vol /= 10; play_sample(sample, vol, 128, freq, 0); } void show() { blit(doubleBuffer, screen, 0, 0, 0, 0, doubleBuffer->w, doubleBuffer->h); } int rnd( int n ){ return (int)( n * ( (double)rand() / (double)(RAND_MAX + 1.0 ) ) ); } void init(int w, int h, int fps, bool fullscreen) { srand(time(NULL)); // Allegro und Grafik, Timer, Sound und Eingabemedien // initilaisieren allegro_init(); if (!fullscreen || !setGfxMode(GFX_AUTODETECT_FULLSCREEN, w, h)) { if (!setGfxMode(GFX_AUTODETECT_WINDOWED, w, h)) { fatalError("Unable to set a graphics mode"); } } install_timer(); /* Den DoubleBuffer erstellen */ screenAlias = create_video_bitmap(SCREEN_W, SCREEN_H); doubleBuffer = create_video_bitmap(SCREEN_W, SCREEN_H); if (!doubleBuffer) { if (screenAlias != NULL) { destroy_bitmap(screenAlias); } doubleBuffer = create_system_bitmap(SCREEN_W, SCREEN_H); if (!doubleBuffer) { fatalError("Unable to create double buffer"); } } vsync(); /* Timer Funktionen und Variablen locken */ LOCK_FUNCTION(timerCounterUpdater); LOCK_VARIABLE(timerCounter); /* Die logische Framerate setzen */ install_int_ex(timerCounterUpdater, BPS_TO_TIMER(fps)); // Allegro Logo anzeigen BITMAP *logo = load_bitmap("allegro.tga", NULL); if (logo) { blit(logo, screen, 0, 0, (SCREEN_W-logo->w)/2, (SCREEN_H-logo->h)/2, logo->w, logo->h); } destroy_bitmap(logo); if (fullscreen) { rest(1000); } rest(1000); install_keyboard(); install_joystick(JOY_TYPE_AUTODETECT); install_mouse(); install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL); // Den Rahmen um den Text verschwinden lassen text_mode(-1); // ASCII Zeichen benutzen set_uformat(U_ASCII); } // Gibt die in init() angelegten Resourcen // wieder frei void done() { destroy_bitmap(doubleBuffer); if (screenAlias != NULL) { destroy_bitmap(screenAlias); } } void syncTimer(volatile int * timer) { int value = *timer; while (*timer == value); }