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

18.06.2012, 22:50

C++ Allegro Problem

Hey,
ich habe ein Problem.
Ich habe nämlcih seit neuestem angefangen mit der Game Library Allegro zu programmieren, d.h. ich bin ein anfänger was das betrifft.
So nun hier mein Problem.
Ich habe 2 Bilder, einmal wo mein Character nach rechts schaut und einmal wo er nach link schaut.
So nun habe ich ein Program geschrieben mit dessen Hilfe ich diesen Character (PNG-DAtei) bewegen kann.
Erstmal nur nach rechts und links. DAs klappt auch sehr gut. Das Problem ist nun das wenn ich Pfeiltaste Links Drücke l1.png angezeigt werden sollte und wenn ich Pfeiltaste rechts drücke r1.png.
Nun wird aber immer nur r1.png angezeigt.....
Irgendwie nimmt er die Bool-Bedingung nicht an die ich ihm zuteilen möchte.
Hier ein Auschnitt des Codes:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
while(!doexit)
   {
    ALLEGRO_EVENT ev;
    al_wait_for_event(event_queue, &ev);

      
    if(ev.type == ALLEGRO_EVENT_TIMER) {
        if(key[KEY_UP]) {
        
            //y1=y1-4;
             jump = true;
            
        }
 
        if(key[KEY_DOWN]) {
            
            
        }
 
        if(key[KEY_LEFT]) {
            
            x1=x1-4;
            Links = true;
        }
 
        if(key[KEY_RIGHT]) {
            
            x1=x1+4;
            Links = false;
        }
 
        redraw = true;
    }
    else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
        break;
    }
    else if(ev.type == ALLEGRO_EVENT_KEY_DOWN) {
        switch(ev.keyboard.keycode) {
            case ALLEGRO_KEY_UP:
            key[KEY_UP] = true;
            break;
 
            case ALLEGRO_KEY_DOWN:
            key[KEY_DOWN] = true;
            break;
 
            case ALLEGRO_KEY_LEFT: 
            key[KEY_LEFT] = true;
            break;
 
            case ALLEGRO_KEY_RIGHT:
            key[KEY_RIGHT] = true;
            break;
        }
    }
    else if(ev.type == ALLEGRO_EVENT_KEY_UP) {
        switch(ev.keyboard.keycode) {
            case ALLEGRO_KEY_UP:
            key[KEY_UP] = false;
            break;
 
            case ALLEGRO_KEY_DOWN:
            key[KEY_DOWN] = false;
            break;
 
            case ALLEGRO_KEY_LEFT: 
            key[KEY_LEFT] = false;
            break;
 
            case ALLEGRO_KEY_RIGHT:
            key[KEY_RIGHT] = false;
            break;
 
            case ALLEGRO_KEY_ESCAPE:
            doexit = true;
            break;
        }
    }
 
    if(redraw && al_is_event_queue_empty(event_queue)) {
        redraw = false;
 
        al_clear_to_color(al_map_rgb(0,0,0));

        al_draw_bitmap(image,100,100,0);

        

        if (Links = true)
        {

            al_draw_bitmap(l1,x1,y1,0);
        }

        else {

            al_draw_bitmap(r1,x1,y1,0);
        }
        
 
        al_flip_display();
         
    }
   }


Kann da irgendwer helfen?

2

18.06.2012, 23:04

Ja: ==

3

18.06.2012, 23:05

Oh man -.-
ja klar hab ich echt komplett übersehen sitze schon fast ne stunde dran ....
viele dank :)

(nächste frage wird dann schwerer ;) )

4

18.06.2012, 23:36

OK ne ganz schwere Frage:

HAt mir wer ein Tutorial oder möchte mir jemand erklären wie ich das hinkriege, dasss sich mein Character "richtig" bewegt.
Ich kann den jetzt ja nach links/rechts "schieben". Ich habe aber 4 Bilder für je eine richtung. D.h. wenn ich anch rechts drücke sollte bild1,bild2,bild3 und bild4 nacheinander erscheinen ,damit mein Char einen Schritt macht.
Finde leider nirgends im I-net etwas dazu und selber fällt mir auch nix mehr ein bei mir werden irgendwie alle 4 Bilder nacheinander auf einem Punkt immer wieder geladen sieht dann aus als ob der wackelt.

Meine Version, die leider nicht fuktioneirt:

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
if(key[KEY_RIGHT]) {
            
            x1=x1+4;
            Links = false;

}


[....................
....................
....................]


if (Links == true)
        {

            al_draw_bitmap(l1,x1,y1,0);
        }

        else {

            laufenr++;

            if(laufenr==1)
            {bild1=r1;}

                if(laufenr==2)
                    {bild1=r2;}
                    if(laufenr==3)
                        {bild1=r3;}
                        if(laufenr==4)
                            {bild1=r4;}

            al_draw_bitmap(bild1,x1,y1,0);

            if(laufenr==5)
            {
             laufenr=0;
            }
        }

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

5

19.06.2012, 11:59

Hi als ich damals nach einem Tutorial für Allegro gesucht habe, bin ich auf den Link aufmerksam geworden. Es sind zwar alles Video-Tutorials aber das sollte kein Problem sein. Für dich ist dann Part 7 besonders interessant.

gruß
Saik0

6

19.06.2012, 12:17

Vielen vielen DAnk ahbe genau nach so etwas gesucht... habe immer nur allegro 4 Tutorials gefunden.

7

19.06.2012, 23:32

Also hier die nächste Frage:

Habe jetzt einiges probiert und geschieben und arbeite nun auch mit Sprites.
So nun habe ich je 4 Bilder für eine Richtung Links und Rechts eben diese ergeben dann eine Laufanimation.
Nur leider sieht das total kacke und "unrealistisch" aus eben nicht so wie in vielen anderen spielenb sondern i-wie abgehackt.
Weis wer was ich da falsch gemacht habe?
Hier ein Ausschnitt des Codes:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
while(!doexit)
   {

      
    ALLEGRO_EVENT ev;
    al_wait_for_event(event_queue, &ev);

      
    if(ev.type == ALLEGRO_EVENT_TIMER) {
          if(key[KEY_UP]) {

        }
 
        if(key[KEY_DOWN]) {

        }
 
        if(key[KEY_LEFT]) { 
             MoveShooterLeft(Shooter);
        }
 
        if(key[KEY_RIGHT]) {
             MoveShooterRight(Shooter);
        }
        redraw = true;


         UpdateBullet(Bullets, Num_Bullets,Cross);



//Nach Links laufen===================================================================================================


         if(++frameCountl >= frameDelay && key[KEY_LEFT]==TRUE )
         {
            if(++curFramel >= maxFrame)
            {
                curFramel = 1;

                frameCountl = 0;
            }
         }


//Nach Rechts laufen===================================================================================================
         if(++frameCountr >= frameDelay && key[KEY_RIGHT]==TRUE )
         {
    
            if(++curFramer >= maxFrame)
            {
                curFramer = 1;

                frameCountr = 0;
            }
         }

         
         
//========================================================================================================================

    }
    else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
        break;
    }

      else if(ev.type == ALLEGRO_EVENT_MOUSE_AXES) {
      
            Cross.x = ev.mouse.x;
            Cross.y = ev.mouse.y;
      }

      else if(ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {

          if(ev.mouse.button & 1)
          {

              //SHOOT
              FireBullet(Bullets, Num_Bullets, Shooter);
      }

      }



    else if(ev.type == ALLEGRO_EVENT_KEY_DOWN) {
        switch(ev.keyboard.keycode) {
            case ALLEGRO_KEY_UP:
            key[KEY_UP] = true;
            break;
 
            case ALLEGRO_KEY_DOWN:
            key[KEY_DOWN] = true;
            break;
 
            case ALLEGRO_KEY_LEFT: 
            key[KEY_LEFT] = true;
               roderl = true;
            break;
 
            case ALLEGRO_KEY_RIGHT:
            key[KEY_RIGHT] = true;
               roderl=false;
            break;

            case ALLEGRO_KEY_SPACE:
            key[KEY_SPACE] = true;
               
            break;
        }
    }




    else if(ev.type == ALLEGRO_EVENT_KEY_UP) {
        switch(ev.keyboard.keycode) {
            case ALLEGRO_KEY_UP:
            key[KEY_UP] = false;
            break;
 
            case ALLEGRO_KEY_DOWN:
            key[KEY_DOWN] = false;
            break;
 
            case ALLEGRO_KEY_LEFT: 
            key[KEY_LEFT] = false;
            break;
 
            case ALLEGRO_KEY_RIGHT:
            key[KEY_RIGHT] = false;
            break;

            case ALLEGRO_KEY_SPACE:
            key[KEY_SPACE] = false;
            break;
 
            case ALLEGRO_KEY_ESCAPE:
            doexit = true;
            break;
        }
    }




 
    if(redraw && al_is_event_queue_empty(event_queue)) {
        redraw = false;
 
        al_clear_to_color(al_map_rgb(255,255,255));


        if(roderl==true)
        {
            al_draw_bitmap(bildl[curFramel], Shooter.x, Shooter.y,0);
            
        }
        else
        {
            al_draw_bitmap(bildr[curFramer], Shooter.x, Shooter.y,0);
        }


        al_draw_bitmap(crosshair,Cross.x - 10,Cross.y - 10,0);

        al_draw_line(0,height - 100,width,height - 100,al_map_rgb(255,0,0),10);
 
        DrawBullet(Bullets, Num_Bullets);


        al_flip_display();
         
    }
   }


 
   al_destroy_display(display);
   al_destroy_timer(timer);
   al_destroy_event_queue(event_queue);

   for(int i=0; i<maxFrame; i++)
   {
        al_destroy_bitmap(bildr[i]);
        al_destroy_bitmap(bildl[i]);
   }
 
    al_destroy_bitmap(crosshair);
 
   return 0;
}

void MoveShooterRight(Hitman &Shooter)
{
    Shooter.x += Shooter.speed;
    if(Shooter.x > width -20)
        Shooter.x = width -20;

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

20.06.2012, 10:06

Ist leider abgeschnittener Code und auch relativ viel zu lesen. Aber eins sei zu dem Thema gesagt. Du kannst mit verschiedenen Werten spielen um ein Sprite zu bewegen. Je mehr Pixel du pro Frame bewegst und umso größer deine Auflösung ist, desto abgehackter wird die Bewegung wirken. Du solltest also gucken, dass deine Framerate und deine Auflösung irgendwie im Verhältnis zueinander stehen. Hatte mal eine Liste mit Beispiel Frameraten für Beispiel Auflösungen. Ganz pauschal kann man hier jetzt nicht sagen, bei 800x600 benötigst du 60fps und bei 480x320 reichen dir 40 oder wie auch immer. Damit kannst du aber rum spielen. Dazu kommt, dass man manchmal nicht in jedem Frame die Tastatur abfragt und direkt darauf die Bewegung folgen lässt, sondern sagt ein Schritt benötigt (als Beispiel) 5 Frames und pro Frame wird die Figur um (als Beispiel) 3 Pixel verschoben. Dann kann deine Animation für einen Schritt komplett abgearbeitet werden und erst dann kommt die nächste Bewegung. Das kommt halt immer auch ein bisschen auf das Spiel an und wie man es haben möchte. Das ganze kann man dann natürlich beliebig komplex gestalten. Normal würde man auch versuchen die Bewegung von der Zeit abhängig zu machen, aber ich möchte jetzt nicht überfordern. Sicherlich wäre ein Buch zu dem Thema nicht schlecht. Ich habe zum Thema Allegro mal das Buch von Lennart Steinke gelesen. Blutiger Anfänger sollte man dafür nicht sein, da es hinterher zum Teil etwas aufwendiger wird, aber an sich erklärt er viele nette Prinzipien. Sein Stil zu programmieren hat mir persönlich nicht 100% gefallen aber das ist Geschmackssache. Seine Internetseite findest du hier. Dort sind auch ein paar Infos und ein paar Codes aus dem Buch zu finden. Ansonsten tut es sicherlich auch so gut wie jedes andere Buch, nur das kannte ich jetzt halt zum Thema Allegro;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

9

20.06.2012, 10:58

OK erstmal vielen Danke.
HAbe jetzt mit den Frames bisschen rumgespielt und ahbe festgestellt, dass meien Bilder falsch ablaufen.
Das Problem.... ich habe keine Ahnugn warum.
HAbe das Programm auf FPS = 5 gestellt und siehe da , wenn ich eine Pfeiltaste gedrückt halte zeigt er nacheinander die Bilder 1,2,3,1,1,2,3,1,1,2,3.... statt eben 1,2,3,1,2,3,1,2,3
Er lädt das Bild 1 also zweimal.... so kommt eine unflüssige bewegung zu stande.

EDIT: OK habe es nun hingekriegt in meiner LAuf-"Funktion" musste FrameCountl außerhalb des zweiten if-Befehls stehen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if(++frameCountl >= frameDelay && key[KEY_LEFT]==TRUE )
         {
            if(++curFramel >= maxFrame)
            {
                curFramel = 1;

                frameCountl = 0;
            }
          
          frameCountl = 0;
         }



D.h. also ein DAnke an alle die mir geantwortet haben und versucht haben mir zu helfen.

Und gleich mal die nächste Frage:

ICh habe, wie vielleicht einige schon bemerkt haben, ein Fadenkreuz das sich zusammen mit der Maus bewegt.
NUn kann ich auch schon in Mausrichtung schießen.
Jedoch ist das Problem jetzt:
ICh schieße eine/mehrere Kugeln ab und diese fliegen in Mausrichtung.
Wenn ich nun jedoch während die Kugeln fliegen die Maus bewege, ändert sich auch die Richtung der Kugeln.
Diese sollten aber eigneltich da hin fliegen wo ich hingeklickt habe bis diese aus dem Bildschirm austreten.

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
void UpdateBullet(Bullet bullet[], int size, Fadenkreuz &Cross, Hitman &Shooter)
{
    for(int i = 0; i<size; i++)
    {
        if(bullet[i].live)
        {

            //bullet[i].x += 5;



            bullet[i].NewX = Shooter.x + bullet[i].VariableT * (Cross.x - Shooter.x);

            bullet[i].x = bullet[i].NewX;

            bullet[i].NewY = Shooter.y + bullet[i].VariableT * (Cross.y - Shooter.y);

            bullet[i].y = bullet[i].NewY;

            bullet[i].VariableT += 0.1;





            
            if(bullet[i].x > width){
                bullet[i].live = false;
                bullet[i].VariableT = 0;
                }
            if(bullet[i].y > height){
                bullet[i].live = false;
                bullet[i].VariableT = 0;
                }
            if(bullet[i].y < 0){
                bullet[i].live = false;
                bullet[i].VariableT = 0;
                }
            if(bullet[i].x < 0){
                bullet[i].live = false;
                bullet[i].VariableT = 0;
                }
        }
    }

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Ilthiaros« (21.06.2012, 12:10)


10

21.06.2012, 12:09

Kann niemand helfen?
Ich kriegs echt nicht hin .....

Werbeanzeige