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.02.2013, 18:22

Spiel mit der SDL, Bäume auf dei grafik setzen

HEy Leute

Bin mal wieder da und hab nen kleines problem, b.z.w bin mir unschlüssig wie ich es angehen soll.

Also meine idee :D das noch nie da gewesene Spiel Prinzip, man baut sich Gebäude, in diesem Fall sind es Bäume :).

Bis jetzt war ich soweit, das ich einen Baum Pflanzen konnte, aber lediglich nur einen.

Mein Versuch war, eine Struktur mit struct Baum{ bool Besetzt, int x, int y} die x und y Koordindaten enstsprechen dann nacher jeweils dem Rect.

Also bin ich hingegangen, habe mir ein array erstelle Baum Feld[10][10]; und habe dieses dann mit einer for schleife durchlaufen, um alle bool besetzt auf false zu setzen.

Soweit so gut.

Als nächste habe ich die Koordinaten für die jeweiligen strukturen gesetzt, was dann wie folgt aussah

Feld[2][2].x=10;

So das rect war dann wie folgt zu besetzen von mir.

SDL_Rect Test;
Test.x=Feld[2][2].x;


Das problem, das ich jedesmal nur das 1 Rect zur verfügung habe, ist mir bewusst, meine frage ist deshalb wie kann ich das problem lösen.
Ich habe schon versucht, jedem feld sein eigenes rec zur verfügung zu stellen, allerdings, hat mir daraufhin mein Kompiler zuerst warnungen rausgeschmissen, und nacher wegen überlastung aufgegeben XD


Ich hoffe ihr könnt mir helfen

Gruß Leri

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

2

18.02.2013, 18:42

Ehm… ein Array aus SDL_Rect , Aber irgendwie steige ich nicht durch… Also … deine Bäume haben x und y Koordinaten, die du in einem Feld… ebenfalls 2 Dimensional… anordnest. Und dann speicherst du sie in einer Struktur… die wie deine Bäume auch x und y Koordinaten besitzt.

Und wie hast du mehrere SDL_Rects benutzt? Was sagt der Compiler?

SDL_Rect

Du solltest mal ein Buch zu Rate ziehen, und Dokumentation lesen. Bücher werden hier genug im Forum genannt.
:love: := Go;

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

18.02.2013, 18:53

Also z.B.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
struct Baum {
    bool besetzt;
    SDL_Rect place;
}

Baum b1;
b1.besetzt = true;
b1.place = SDL_Rect(15, 15, 25, 25);

Baum b2;
b2.besetzt = true;
b2.place = SDL_Rect(115, 15, 25, 25);


Bei sowas wirft dein Kompiler Warnungen/Fehler?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

4

18.02.2013, 18:55

Ich habe heute schon ein schönes Menü mit SDL gemacht, ich möchte bloss nicht, das ich meinen Code zu sehr ausblähe.

Es geht mir momentan darum, das ich nicht genau weiß, wie ich das ganz anstellen soll.

Soll ich für jede Positionierung, eines neu hergestellten Baumes ein neues Rec anlegen oder halt nicht.

Ich habe erstmal versucht, ein Rec array zu erstellen, was dann in einer for schleife, die bool variable abfragt, ob diese Position b.z.w dieses Feld im array Spielfeld auf true steht.

Leider hat das ganze nicht sehr sauber funktioniert, und die SDl ist eingefroren.

5

18.02.2013, 18:58

ach du schande, ^^ ich hatte garnicht daran gedacht, das rect in jede Struktur zu packen.


hab für jede struktur ein rect erzeugt

also SDL_rect test[];

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

18.02.2013, 18:59

Für sowas sind Strukturen ja da. ;)
Klappst denn nun?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

7

18.02.2013, 19:07

Ist es denn wichtig zu wissen ob ein Feld leer oder besetzt ist? Es scheint doch so das, sobald es Koordinaten gibt dort auch ein Baum ist… keine Koordinaten, kein Baum. Dann würde doch das Flag wegfallen. Und ein Array aus SDL_Rect würde reichen.

C-/C++-Quelltext

1
2
3
4
5
std::vector<SDL_Rect> baeume;
for (auto baum : baeume)
{
    Boden.Planzen(baum);
}
:love: := Go;

8

18.02.2013, 19:08

ich verändere das nacher mal, muss leider jetzt nochn bisschen was machen, aber wenn wir schonmal hier sind.

Habe mir nen kleines Menü gebastelt, was nur ein screen surface braucht, um zu funktionieren.

Würde gerne mal wissen, ob das so in ordnung ist.

MAIN CPP

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
#include "SDL\SDL.h"
#include "Menu.hpp"
int main( int argc, char* args[] )
{
    SDL_Surface* screen = NULL;

        //Start SDL
    SDL_Init( SDL_INIT_EVERYTHING );

        //Set Screen
    screen = SDL_SetVideoMode( 800, 600, 32, SDL_SWSURFACE|SDL_DOUBLEBUF );

    Menu Laha;
    Laha.Getsscreen(screen);





SDL_Quit();
    return 0;
}





MENU.HPP

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Menu
{
public:
void Getsscreen(SDL_Surface *screen);
Menu();
void SButtonPos();


private:
SDL_Rect ButtonPos;
SDL_Rect AniButton;



};





MENU.CPP

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
#include "SDL\SDL.h"
#include "Menu.hpp"
#include "SDL\SDL_mixer.h"
#include "SDL\SDL_image.h"

Menu::Menu()
{

}



void Menu::Getsscreen(SDL_Surface *screen)
{
    //ENUM Zur Animierung Des MENUES
    enum walk { Banner , Banner1 , Banner2 , Banner3
                    , Banner4 , Banner5 , Banner6  };
    //ENUM

    //Positioniert den Button Im MEnue
    SButtonPos();
    //Buttton

    //Deklariert Sound Zeiger
    Mix_Chunk *Effekt1;
    Mix_Chunk *Effekt2;
    Mix_Music *Maska;
    //Sounds Zeiger

    //Definiert, wie Der Sound ausgegeben werden soll
    Mix_OpenAudio(22050,AUDIO_S16SYS,2,640);
    //Definierung Sound

    //Definierung der Sounds (Zeiger Sound)
    Maska =Mix_LoadMUS("test.mid");
    Effekt1=Mix_LoadWAV("test1.wav");
    Effekt2=Mix_LoadWAV("test2.wav");
    //Definiert die Sound Zeiger

    //Spielt die Hintergrund Musik ab
    Mix_PlayMusic(Maska,1); //Music loop=1
    //Spielt Musik mit 1 LOOP(Durchlauf ab)

    //Handelt alle Events, wie Tastatureingabe und MAus
    SDL_Event event;
    //Events

    //Zahlvariable für die Animation
    //Animationszaehler

    //Zeiger für die Späteren Bilder
    SDL_Surface *Button;
    SDL_Surface *Load;
    SDL_Surface *LerixLogo;
    SDL_Surface *sdlLogo;
    SDL_Surface *Buttonover;
    //Zeiger Bilder

    //Definiert die Zeiger (Bilder)
    Buttonover=IMG_Load("test.gif");
    sdlLogo= SDL_LoadBMP("sdllogo.bmp");
    Load= SDL_LoadBMP("bis.bmp");
    LerixLogo= SDL_LoadBMP("Banner.bmp");
    Button = SDL_LoadBMP("startbutton.bmp");
    //Definition Bilder

    //Rect für Animation SDL LOGO
    SDL_Rect Logo;
    Logo.x=250;
    Logo.y=0;
    Logo.h=67;
    Logo.w=123;

    //Laufzeitvariable für die Schleife des Menüs
    bool Run = true;
    //Laufzeitzschleife(Menü)

//Hauptschleife(Menü)
while(Run)
{
    //Variable für die Animation

    SDL_Delay(100);

    //While schleife für Events, wenn etwas gedrückt wird, bearbeitung HIER
    while(SDL_PollEvent(&event))
    {
        //Event Type, Maus Tastatur, bearbeitung erfolgt hier
        switch(event.type)
        {
        case SDL_MOUSEMOTION:
            {


            }break;
            case SDL_MOUSEBUTTONDOWN:
            {

                //X,Y Koordinate von der Maus ZUR ZEIT
                int x= event.motion.x;
                int y=event.motion.y;


                    //Ueberpruefune, ob Maus, im Bereich des Buttons gedrückt wurde
                    if(x>ButtonPos.x&&x<ButtonPos.x+ButtonPos.w &&y>ButtonPos.y&&y<ButtonPos.y+ButtonPos.h)
                    {
                        //Sound Abspielen
                        Mix_PlayChannel(-1,Effekt1, 0);

                        //Ladebildschirm Laden
                    SDL_BlitSurface(Load,NULL, screen, NULL);
                    //Bildschirm erneuern
                    SDL_Flip(screen);
                    //5 Sekunden warten
                    SDL_Delay(5000);
                    //Hauptschleife auf false setzen, eigentliches Spiel beginnt
                    Run=false;
                    }


            }break; //Case Endet

        }//Switch Zuende


    }//While Event Zuende


    //Wenn Ende des Animationsarrays erreicht ist, Zeahler wieder auf 0

    //Ausgabe des Hintergrunds
    SDL_BlitSurface(LerixLogo, NULL,screen, NULL);
    //Ausgabe Animation
    SDL_BlitSurface(sdlLogo, NULL,screen, &Logo);

    //Button Ausgeben
    SDL_BlitSurface(Button,NULL, screen, &ButtonPos);
    SDL_BlitSurface(Buttonover, NULL,screen,&AniButton);
    //Bildschirm erneuern
    SDL_Flip(screen);

    SDL_FillRect(screen,NULL, 0x221122);
    Logo.y+=5;
if(Logo.y>=533)
{
    Logo.y=0;
}


}//Ende Der Hauptschleife(Menü)



    //Freigeben der Geladenen Sounds
    Mix_FreeChunk(Effekt1);
    Mix_FreeChunk(Effekt2);
    Mix_FreeMusic(Maska);
    Mix_CloseAudio();
    //Soundfreigabe Ende



    //Freigabe Der Bilder
    //


    SDL_FreeSurface(sdlLogo);
    SDL_FreeSurface(LerixLogo);

    //Animationsschleife freigabe Endet
    SDL_FreeSurface(Button);
    SDL_FreeSurface(Load);
    //Ende Bilderfreigabe


}
//Klassenfunktion Getsscreen Ende


void Menu::SButtonPos()
{
    //Position für Startbutton
    ButtonPos.h=123;
    ButtonPos.w=527;
    ButtonPos.x=130;
    ButtonPos.y=450;
    //Ende Position Startbutton

    //Position für animation Buttopn
    AniButton.h=100;
    AniButton.w=200;
    AniButton.x=200;
    AniButton.y=460;
}






Die rect struktur für den AniButton muss noch richtig gemacht werden von mir, flimmert momentan noch, und überlege mir schon eine lösung ^^, soll ja nur über den button von links nach rechts drüberhuschen, wenn man mit der Maus drauf ist.
»leridan« hat folgendes Bild angehängt:
  • Menu.JPG

9

18.02.2013, 20:01

Was mir als erstes aufgefallen ist:
void Menu::Getsscreen(SDL_Surface *screen)
Getter-Methoden geben den Wert von Membervariablen zurück oder berechnete Werte. Um Membervariablen zu setzen oder zu ändern werden üblicherweise Setter-Methoden benutzt.

So würde ich es empfehlen:
void Menu::SetScreen(SDL_Surface *screen)
bzw. sogar:
void Menu::setScreen(SDL_Surface *screen)
Ist natürlich nicht unbedingt nötig um den Code erfolgreich zu kompilieren, aber eben die Norm.

10

18.02.2013, 20:25

ist denn soweit alles bei mir im code im normbereich, ausser jetzt grad die bennenung der funktionen ^^.

Ok das Enum wird nicht benutzt ist nun draußen und die Animation auf dem Button ist auch eben fertig geworden

Werbeanzeige