Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.09.2010, 12:26

allegro logische frame rate

ich hab ein problem mit einem frame limiter mit allegro ich hab follgendes programmiert

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <allegro.h>
#include<time.h>
 
volatile int timerCounter = 0;
static void timerCounterUpdater(){
timerCounter++;
}
END_OF_STATIC_FUNCTION(timerCounterUpdater);
 
LOCK_FUNCTION(timerCounterUpdater);
LOCK_VARIABLE(timerCounter);
 
install_int_ex(timerCounterUpdater, BPS_TO_TIMER(60));
int main(int argc, char **argv) 
{ 
allegro_init();
install_keyboard();
set_color_Depth(32);
set_gfx_mode(GFX_AUTODETECT_FULLSCREEN 800, 800, 0, 0);
BITMAP *doublebuffer = create_bitmap(SCREEN_W, SCREEN_W);
BITMAP *logo = load_bitmp("allegro.tga", NULL);
if(timerCounter > 0)
{
do
{
cur.logic++;
timerCounter--;
}while(timerCounter > 0);
needsRefresh = TRUE;
}if(needsRefresh){
 
acquire_bitmap(doublebuffer);
clear(doublebuffer); 
blit(logo, doublebuffer, 0, 0, 0, 0 logo->w, logo->h);
release_bitmap(doublebuffer);
blit(doublebuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
 
needsRefresh = FALSE;
}
 
 
 
}
END_OF_MAIN();


aber ich krieg nur errors hab allegro auf jeden fall richtig verlinkt laut dem compiler liegt der fehler in install_int_ex(timerCounterUpdater, BPS_TO_TIMER(69))

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

26.09.2010, 12:43

Pack die LOCK Anweisungen _in_ die main Funktion und zwar _nach_ dem initialisieren von allegro (sprich: nach allegro_init).
edit:
Ach ja, den Aufruf von "install_timer" würde ich auch noch ergänzen. Hier mal ein Beispiel wie deine main Datei später aussehen sollte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
volatile int timerCounter = 0;
static void timerCounterUpdater() { 
    timerCounter++;     
} 
END_OF_STATIC_FUNCTION(timerCounterUpdater); 

int main() { 
    allegro_init(); 

    install_timer(); 
    
    vsync(); 
    /* Timer Funktionen und Variablen locken */ 
    LOCK_FUNCTION(timerCounterUpdater); 
    LOCK_VARIABLE(timerCounter); 
    /* Die logische Framerate setzen */     
    install_int_ex(timerCounterUpdater, BPS_TO_TIMER(69)); 
    
    // .. etc.
}
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Architekt« (26.09.2010, 12:54)


3

26.09.2010, 14:00

Erstmal danke für diese unglaublich schnelle Antwort (hab ich noch nie erlebt). Aber der Fehler mit install_int_ex... ist jetzt weg aber zwei Fehler die eigentlich ganz simpel sint hab ich noch uns zwar die stellen needsRefresh = TRUE; und cur.logic++; dort hab ich folgende errors cur.lgic++; undeclared
needsRefresh = TRUE; undeclared.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

26.09.2010, 14:04

Erstmal danke für diese unglaublich schnelle Antwort (hab ich noch nie erlebt). Aber der Fehler mit install_int_ex... ist jetzt weg aber zwei Fehler die eigentlich ganz simpel sint hab ich noch uns zwar die stellen needsRefresh = TRUE; und cur.logic++; dort hab ich folgende errors cur.lgic++; undeclared
needsRefresh = TRUE; undeclared.

Das heißt, dass diese beiden Variablen nicht vorher angelegt worden sind.
Auch ganz logisch, denn nirgendwo legst du needsRefresh fest und cur.logic sieht mir ganz nach einem struct aus.
Leg vor der Schleife ein bool needsRefresh; an und finde mal raus, vorher du dieses cur.logic hast. Ich sehe aber auch nirgends wofür du es brauchst. Also entweder du legst die Struktor an, findest raus, woher sie stammt und includest die notwendige Datei oder du machst daraus einfach einen integer:

C-/C++-Quelltext

1
unsigned int cur_logic = 0;
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

26.09.2010, 17:37

den quelcode hab ich aus dem buch spieleprogrammierung von lennart steinke auf seiner website http://www.steinke.net/coding.php ist auch noch mal der code. und da hat er es so ähnlich stehen

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

26.09.2010, 17:47

den quelcode hab ich aus dem buch spieleprogrammierung von lennart steinke auf seiner website http://www.steinke.net/coding.php ist auch noch mal der code. und da hat er es so ähnlich stehen

Kenne das Buch, habe selber damit angefangen.
Und wie du siehst, steht da nicht

C-/C++-Quelltext

1
cur.logic++
sondern

C-/C++-Quelltext

1
int curSkip = 0;
sowie

C-/C++-Quelltext

1
curSkip++;  
.
Wie ich also schon anmerkte: ein integer.
Der Punkt Operator ist Zugriff auf z.B. eine Struktur oder eine Klasse.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

7

26.09.2010, 18:03

ja habe nun wie er geschrieben Aber es wird zwar jetzt fehler frei compiliert aber wenn ich es dann ausführen will sagt mir windows das das programm nicht mehr funktioniert.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <allegro.h>
#include<time.h>
 
volatile int timerCounter = 0;
static void timerCounterUpdater(){
timerCounter++;
}
END_OF_STATIC_FUNCTION(timerCounterUpdater);
 
LOCK_FUNCTION(timerCounterUpdater);
LOCK_VARIABLE(timerCounter);
 
install_int_ex(timerCounterUpdater, BPS_TO_TIMER(60));
int main(int argc, char **argv) 
{ 
allegro_init();
install_keyboard();
set_color_Depth(32);
set_gfx_mode(GFX_AUTODETECT_FULLSCREEN 800, 800, 0, 0);
BITMAP *doublebuffer = create_bitmap(SCREEN_W, SCREEN_W);
BITMAP *logo = load_bitmp("allegro.tga", NULL);

bool needsRefresh;
int curskip = 0;
int maxskip = 6;

if(timerCounter > 0)
{
do
{

timerCounter--;
curskip++;

if(curskip>=maxskip)
{
timerCounter = 0;
break;
}
}while(timerCounter > 0);
needsRefresh = TRUE;
}if(needsRefresh){
 
acquire_bitmap(doublebuffer);
clear(doublebuffer); 
blit(logo, doublebuffer, 0, 0, 0, 0 logo->w, logo->h);
release_bitmap(doublebuffer);
blit(doublebuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
 
needsRefresh = FALSE;
}
 
 
 
}
END_OF_MAIN();

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

26.09.2010, 18:13

Hast du mal was von vernünftiger Einrückung gehört? Ist ja schrecklich ._.
Zu deinem Problem: ich sehe da immer noch so viele Mängel, die sollten erstmal beseitigt werden, bis man deinem Problem auf den Grund gehen kann.
Existiert "allegro.tga" eig. in deinem Ordner? Ansonsten bekommst du eh schon einmal einen Fehler.
Ich hab' mir mal die Mühe gemacht und deinen Code aufgeräumt, versuch es mal damit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <allegro.h>
#include <time.h>
 
volatile int timerCounter = 0;
static void timerCounterUpdater(){
    timerCounter++;
} END_OF_STATIC_FUNCTION(timerCounterUpdater);

const unsigned int SCREEN_W = 800;
const unsigned int SCREEN_H = 600;

int main() { 
    allegro_init();
    
    install_keyboard();
    install_timer();
    
    vsync();
    LOCK_FUNCTION(timerCounterUpdater);
    LOCK_VARIABLE(timerCounter);
    
    install_int_ex(timerCounterUpdater, BPS_TO_TIMER(60));
    
    set_color_Depth(32);
    set_gfx_mode(GFX_AUTODETECT_FULLSCREEN 800, 800, 0, 0);
    
    BITMAP * doublebuffer = create_bitmap(SCREEN_W, SCREEN_W);
    BITMAP * logo = load_bitmp("allegro.tga", NULL);
    
    bool needsRefresh;
    
    unsigned int cur_skip = 0;
    unsigned int max_skip = 6;
    
    if (timerCounter > 0) {
        do {
            timerCounter--;
            cur_skip++;
            
            if(cur_skip >= max_skip) {
                timerCounter = 0;
                break;
            }
        } while(timerCounter > 0);
        
        needsRefresh = true;
    }
    
    if (needsRefresh) {
        acquire_bitmap(doublebuffer);
        
        clear(doublebuffer); 
        blit(logo, doublebuffer, 0, 0, 0, 0 logo->w, logo->h);
        
        release_bitmap(doublebuffer);
        
        blit(doublebuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
        
        needsRefresh = false;
    }
} END_OF_MAIN();


edit: nochmal Code editiert.
Dein Programm müsste sich ohne hin sofort wieder schließen, da du keine Game Loop eingebaut hast.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (26.09.2010, 18:18)


9

26.09.2010, 18:26

Ja ich weiß ich tuh mich sehr schwer mit dem einrücken ^^ jetzt hab ich wieder 12 fehler ich schreibe in diesem thread wenn ich sieh weg hab und natürlich hab ich die tga datei auch im ordner ^

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

26.09.2010, 18:28

Sag sie mir, dann kann ich dir weiterhelfen. Am besten mit dem jeweiligen Code Teil.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige