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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

26.02.2013, 21:36

Verschiedene Texturen

Hallo,

Ich möchte für einen Freund ein kleinens 2D Spiel Programmieren. Ich kann ein wenig C++ und SDL. Zurzeit läuft auch alles sehr gut auser das ich ein Objekt habe das jenachdem was ich für eine Taste drücke seine Textur endern soll. Ich habe zum testen vier verschiedenfabige Quadrate genommen, doch egal was ich drücke es endert sich nur die Position und nicht die Textur.

Hier Mein Code:
main

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
#include <SDL.h>


#include <iostream>

#include "Spielsteuerung.h"
#include "LevelMenu.h"
#include "Fred.h"

/*-------------------------------------------------------------------------------------*/

//Main
int main(int argc, char* argv[])
{

    //SDL einbauen

    // SDL mit dem Grafiksystem initialisieren.
    SDL_Init(SDL_INIT_VIDEO);
    if(SDL_Init(SDL_INIT_VIDEO) == -1)
    {
        // Ups, das hat nicht funktioniert!
        // Wir geben die Fehlermeldung aus.
        std::cerr << "Konnte SDL nicht initialisieren! Fehler: " << SDL_GetError() << std::endl;
        return -1;
    }

    //Bildschirm aufbauen
    SDL_Surface* screen = SDL_SetVideoMode(800, 500, 32, SDL_DOUBLEBUF);
    if(!screen)
    {
        // Fehler! Fehlermeldung ausgeben und Programm beenden.
        std::cerr << "Konnte SDL-Fenster nicht erzeugen! Fehler: " << SDL_GetError() << std::endl;
        return -1;
    }
    SDL_WM_SetCaption("Jetpack", "Jetpack");

//Objekte zum vorbereiten des Spiels
Spielsteuerung Steuerung;
LevelMenu Menu;
Fred Fred;

//Funktionen zum Speil
Fred.LadeFred ();
Fred.FredXYTest ();

Steuerung.Laden = true;
Steuerung.Löschen = false;

Steuerung.Spielstatus = 11;

Steuerung.run = true;
// die Event-Schleife
while(Steuerung.run)
{
    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
        // Was ist passiert?
        switch(event.type)
        {
            
            if( event.key.keysym.sym != SDLK_ESCAPE ) 
            {
                break;
                Steuerung.run = false;
            }
            // Alles außer [ESC] ignorieren
        case SDL_QUIT:
            // Das Programm soll beendet werden.
            // Wir merken uns das und brechen beim nächsten Mal die Schleife ab.
            Steuerung.run = false;
            break;
        }
    }
        //Abfangen der Tastertur
        Uint8 *keystates = SDL_GetKeyState( NULL );
        Fred.FredAnsichtY = FREDDOWN;
        if (keystates[ SDLK_LEFT ] || keystates[SDLK_a])
        {
            Fred.Fredx (-2);
            Fred.FredAnsichtX = FREDLEFT;
        }
        if (keystates[SDLK_RIGHT] || keystates[SDLK_d])
        {
            Fred.Fredx (+2);
            Fred.FredAnsichtX = FREDRIGHT;
        }
        if (keystates[SDLK_UP] || keystates[SDLK_w])
        {
            Fred.Fredy (-6);
            Fred.FredAnsichtY = FREDUP;
        }
        if (keystates[SDLK_DOWN] || keystates[SDLK_s])
        {
            Fred.Fredy (+1);
            Fred.FredAnsichtY = FREDDOWN;
        }
        if (keystates[SDLK_ESCAPE])
        {
            Steuerung.run = false;
        }
        Fred.FredGravitation ();
    
    

   
    if (Steuerung.Spielstatus = 11)
    {
        Fred.FredKolision ();
        Fred.FredAnzeigen (screen);
    }
    
    SDL_Delay(10);
    std::cout << Fred.FredAnsichtX << Fred.FredAnsichtY;
    SDL_Flip(screen);
}
 
// SDL herunterfahren
Fred.LöschenFred ();
SDL_Quit();
return 0;
}


Fred.h

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
class Fred
{
public:
    void LadeFred ();
    void LöschenFred ();
    void FredAnzeigen (SDL_Surface *screen);
    void FredKolision ();

    SDL_Surface * FredLeft;
    SDL_Surface * FredRight;
    SDL_Surface * FredRightUp;
    SDL_Surface * FredLeftUp;

    void Fredx (int a);
    void Fredy (int a);
    void FredXYTest()
    {
        FredX = 100;
        FredY = 100;
    }
    void FredGravitation ();
    bool FredAnsichtX;
    bool FredAnsichtY;
#define FREDUP true
#define FREDDOWN false
#define FREDLEFT true
#define FREDRIGHT false
private:
    int FredX;
    int FredY;


Fred.ccp

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
void Fred::FredAnzeigen (SDL_Surface *screen)
{
    SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 255, 255));
    if (FredAnsichtY = FREDDOWN)
    {
        if (FredAnsichtX = FREDLEFT)
        {
            SDL_Rect FredLeftPosition;
            FredLeftPosition.x = FredX;
            FredLeftPosition.y = FredY;
            SDL_BlitSurface(FredLeft, 0, screen, &FredLeftPosition);
        }
        if (FredAnsichtX = FREDRIGHT)
        {
            SDL_Rect FredRightPosition;
            FredRightPosition.x = FredX;
            FredRightPosition.y = FredY;
            SDL_BlitSurface(FredRight, 0, screen, &FredRightPosition);
        }
    }
    if (FredAnsichtY = FREDUP)
    {
        if (FredAnsichtX = FREDLEFT)
        {
            SDL_Rect FredLeftUpPosition;
            FredLeftUpPosition.x = FredX;
            FredLeftUpPosition.y = FredY;
            SDL_BlitSurface(FredLeftUp, 0, screen, &FredLeftUpPosition);
        }
        if (FredAnsichtX = FREDRIGHT)
        {
            SDL_Rect FredRightUpPosition;
            FredRightUpPosition.x = FredX;
            FredRightUpPosition.y = FredY;
            SDL_BlitSurface(FredRightUp, 0, screen, &FredRightUpPosition);
        }
    }

}

Ich würde mich sehr Freuen wenn mir jemand helfen könnte.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

26.02.2013, 22:23

In C++ ist der Vergleichsoperator ein == und nicht =.
@D13_Dreinig

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

26.02.2013, 23:37

Ändern, nicht "endern".

4

26.02.2013, 23:50

In C++ ist der Vergleichsoperator ein == und nicht =.

Und genau aus diesem Grund, ist es gut sich anzugewöhnen, die Konstante nach links zu schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if (Steuerung.Spielstatus = 11)

// wird zu

if (11 = Steuerung.Spielstatus)

// und weil das nicht kompiliert, weil man 11 keinem neuen Wert geben kann, machst du daraus

if (11 == Steuerung.Spielstatus)

Und schon ist zumindest ein Fehler weniger drin.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

27.02.2013, 09:06

Und genau aus diesem Grund, ist es gut sich anzugewöhnen


Oder man gewöhnt sich den richtigen Operator an! :)
@D13_Dreinig

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

27.02.2013, 09:11

Der Einwand von Jonathan_Klein finde ich aber erstmal auch ok. Wir haben sogar jemanden auf arbeit, der immer jede Bedinging mit kleiner ausdrückt...

C-/C++-Quelltext

1
if (5 < currentItems)



z.b. Ich werd jedes mal wahnsinnig! Aber beim == find ich das noch verkraftbar.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.02.2013, 09:31

Ich persönlich bin kein Fan von Yoda Conditions. Ich find sie unintuitiv zu lesen und zumindest meiner Erfahrung nach sind potentielle Bugs praktisch sofort gefunden und moderne Compiler warnen einen sowieso, von statischer Code-Analyse ganz zu schweigen. Ich hatte jedenfalls noch nie das Gefühl, dass ich dadurch irgendwo mal was hätte gewinnen können...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

27.02.2013, 11:10

Ich finde "5 < irgendwas" tatsächlich schwerer verständlich als "irgendwas > 5".
Compiler-Warnings sollte man generell wohl einfach mal nicht ignorieren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

9

27.02.2013, 15:37

Vielen Dank für eure schnellen Antworten jetzt läuft alles. :D

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

27.02.2013, 18:03

Was ich in deinem Quellcode erkennen kann ist zum Einen, dass du in Z.19/20 2 - mal SDL initialisierst. Ist das so gewollt?

Außerdem solltest du bei 65/66 break als letztes schreiben, da sont Steuerung.run = false; nicht mehr ausgeführt wird.

Werbeanzeige