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

Anonymous

unregistriert

11

15.03.2009, 19:36

C-/C++-Quelltext

1
2
3
4
5
        dst.x ++;   
        SDL_BlitSurface(image, NULL, screen, &dst);   
      }

      dst.y ++; 

Warum gibst du hier so sinnlose Positionsangaben an? Ich habe dir die richtige Berechnung (und sogar noch kommentiert!) gegeben.

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

12

15.03.2009, 20:28

ich kapiere das nicht ich habe alles versucht.
Dann hab ich was anderes versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (int x=0; x<Breite; x++)
{
    for (int y=0; x<Höhe; y++)
    {
        image = SDL_LoadBMP("Boden.bmp");
        if (image == NULL) {
        printf("Can't load image of tux: %s\n", SDL_GetError());
        exit(1);}
        dst.y = dst.y + 64;
        y++;
    }
    image = SDL_LoadBMP("Boden.bmp");
    if (image == NULL) {
    printf("Can't load image of tux: %s\n", SDL_GetError());
    exit(1);}
    dst.x = dst.x + 128;
    x++;
}
Every day is a programming day ;)

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

13

15.03.2009, 20:39

Zitat von »"CrazyPlayer"«


C-/C++-Quelltext

1
    for (int y=0; x<Höhe; y++)

So kann das ganz sicher nicht funktionieren.

14

15.03.2009, 20:43

Damit lädst du immer wieder und wieder die Boden.bmp. Das ist völliger Blödsinn. Vielleicht solltest du erstmal versuchen in der Konsole etwas vernünftiges zustande zu kriegen oder du liest nochmal vernünftig das Buch durch und probierst auch mal kleinere komplett eigene Testprogramme zu schreiben. Weil so wirst du nichts vernünftiges hinkriegen auf die Schnelle, das versprech ich dir.

Anonymous

unregistriert

15

15.03.2009, 21:11

Also dein Source da oben ist ja absolut keine Grundlage zum lernen. Wirr, konfus und absolut unübersichtlich. Das tut ja schon in den Augen weh.

Damit du mal wenigstens ENTWAS anständiges hast zum Lernen, habe ich dir mal schnell ein kleines Framework zusammgenbastelt, was du auch benutzen solltest! Dein alter Code ist Schrott und solltest du löschen.

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

/// Der Backbuffer. Auch "Secondary Buffer" genannt.

::SDL_Surface* g_secondary = NULL;
/// Dein Bild.

::SDL_Surface* g_image = NULL;

/// //////////////////////////////////////////////////////////////////////////

/// Läd eine Grafikdatei und gibt diese als SDL_Surface wieder.

///

/// \param file:

///     Name der Grafikdatei die geladen werden soll.

///

/// \return:

///     Gibt die Grafikdatei als SDL_Surface wieder oder 'NULL' bei Fehlern.

///

/// //////////////////////////////////////////////////////////////////////////

::SDL_Surface* load_image (char* file)
{
    ::SDL_Surface* image = ::SDL_LoadBMP (file);
    if (image != NULL)
        ::SDL_SetColorKey (image, SDL_SRCCOLORKEY, ::SDL_MapRGB (image->format, 255, 0, 255));

    return (image);   
}

/// //////////////////////////////////////////////////////////////////////////

/// Initialisiert das Programm.

///

/// \return:

///     Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.

///

/// //////////////////////////////////////////////////////////////////////////

bool initialise (void)
{
    if ((g_image = load_image ("bild.bmp")) == NULL)
        return (false);

    return (true);
}

/// //////////////////////////////////////////////////////////////////////////

/// Deinitialisiert das Programm.

///

/// \return:

///     Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.

///

/// //////////////////////////////////////////////////////////////////////////

bool uninitialise (void)
{
    ::SDL_FreeSurface (g_image);

    return (true);
}

/// //////////////////////////////////////////////////////////////////////////

/// Aktuallisiert alle Elemente des Programms.

///

/// \return:

///     Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.

///

/// //////////////////////////////////////////////////////////////////////////

bool update (void)
{
    return (true);
}

/// //////////////////////////////////////////////////////////////////////////

/// Zeichnet alle Elemente des Programms.

///

/// \return:

///     Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.

///

/// //////////////////////////////////////////////////////////////////////////

bool draw (void)
{
    ::SDL_Rect dest = { 0 }; 
    dest.w = g_image->w;
    dest.h = g_image->h;

    for (int i = 0; i < 7; ++i)
    {
        for (int j = 0; j < 7; ++j)
        {
// [...]

// DEIN CODE HIER! Denken musst du selbst.

// [...]

        }
    } 

    return (true);
}

/// //////////////////////////////////////////////////////////////////////////

/// Programmeinsprungspunkt.

///

/// \return:

///     Exit-Code des Programms.

///

/// //////////////////////////////////////////////////////////////////////////

int main (void)
{   
    if (::SDL_Init (SDL_INIT_VIDEO) == -1)
        return 0;
        
    if ((g_secondary = SDL_SetVideoMode (800, 600, 16, SDL_HWSURFACE | SDL_DOUBLEBUF)) == NULL)
    {
        ::SDL_Quit ();
        return 0;
    }
    
    if (!initialise ())
    {
        uninitialise ();
        ::SDL_Quit ();
        return 0;
    }
        
    for (bool done = false; !done; )
    {  
        for (::SDL_Event event; ::SDL_PollEvent (&event) && !done; )
        {
            switch (event.type)
            {
            case SDL_QUIT:
                done = true;
                break;
            }
            
            ::SDL_FillRect (g_secondary, NULL, ::SDL_MapRGB (g_secondary->format, 58, 95, 205)); 
                        
            if (!update () || !draw ())
                done = true;
            
            ::SDL_Flip (g_secondary);
        }
    }
    
    uninitialise ();    
    ::SDL_Quit ();
    
    return 0;
}


In dem Code gibt es insgesammt 4 Funktionen die für dich wichtig sind: initialise, unitialise, update und draw.

initialise ist für die einmalige Initialisierung des Programms. Hier werden deine Grafiken geladen - das du die wie in deinem Code jedes mal neu lädst ist Unsinn!

uninitialise ist das Gegenteil zu initialise und ist für das einmalige Aufräumen da. Hier wird die Grafik entladen.

update ist für die Aktuallisierung aller Objekte in deinem Spiel - Aktuell hast du noch keine, weil du keine benötigst. Also ist diese Funktion für dich erstmal uninteressant.

draw ist die Funktion in der alle Elemente in deinem Programm gezeichnet werden. Hier solltest du für dein Spielfeld ansetzen.

Funktionen wie "load_image" und "main" fasst du erst gar nicht an. Die sind gut so und fertig. Nur die 4 oben genannten Funktionen sind für dich relevant, die anderen sind taboo!

Bau auf dem Code auf und wir können dir auch besser helfen, da wir den Code - im Gegensatz zu deinem Aktuellen - viel angenehmer verstehen können.

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

16

15.03.2009, 21:32

thx, unsigned long aber der Compiler zeigt folgende 2 Fehlern und eine Warnung an:

C-/C++-Quelltext

1
2
3
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken;
/NODEFAULTLIB:Bibliothek verwenden.
 

C-/C++-Quelltext

1
1>sdlmain.lib(SDL_win32_main.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_SDL_main" in Funktion "_main".

C-/C++-Quelltext

1
fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

-insane- ich kenn mich mit der Console schon relativ gut aus. Blos bei SDL usw. kenn ich mich noch nicht so aus.
Every day is a programming day ;)

Anonymous

unregistriert

17

15.03.2009, 21:34

füg das noch oben hin unter dein include

C-/C++-Quelltext

1
#undef main


Na ja, nichts für Ungut, ich sehe hier doch ordentliche defizite in den Grundlagen, die nichts mit der SDL zu tun hat.

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

18

15.03.2009, 22:20

thx, usigned long und die anderen die dabei geholfen haben.
Ich hab es jetzt geschaft ,aber ich werde mich mit diesen Code erst mal auseinandersetzten, und ich glaube ich lese das Buch nochmal durch.

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
...
bool draw (void)
{
    ::SDL_Rect dest = { 0,0,0 };
    dest.w = g_image->w;
    dest.h = g_image->h;

    for (int i = 0; i < 7; ++i)
    {
        for (int j = 0; j < 7; ++j)
        {
            SDL_BlitSurface(g_image, NULL, g_secondary, &dest);
            dest.x = dest.x + 32;
        }
        dest.x = 0;
        dest.y = dest.y + 16;
    }

    dest.x = 16;
    dest.y = 8;

    for (int i = 0; i < 7; ++i)
    {
        for (int j = 0; j < 7; ++j)
        {
            SDL_BlitSurface(g_image, NULL, g_secondary, &dest);
            dest.x = dest.x + 32;
        }
        dest.x = 16;
        dest.y = dest.y + 16;
    }

    return (true);
} 
...


Ergebniss:

(Link)
Every day is a programming day ;)

19

15.03.2009, 22:53

Es geht auch mit 2 for Schleifen statt mit 4. Solltest du mal probieren hinzukriegen. Sieh dir dazu unsigned long's Beispiel an und versuch es richtig zu verstehen und einzubauen. Sowas ist wichtig beim programmieren, wenn du solche Fehler ständig bei einem größeren Projekt machst, ist das Spiel plötzlich nur noch halb so schnell ;)

Zitat von »"unsigned long"«

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int tile_width = 128;
int tile_height = 64;

// X

for (int i = 0; i < 7; ++i)
{
    // Y

    for (int j = 0; j < 7; ++j)
    {
        int offset_x = (!(j & 1) ? tile_width / 2 : 0);
                    // X     , Y

        Zeichne_Tile (tile_width * i + offset_x, tile_height / 2 * j);
    }
}

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

20

15.03.2009, 23:17

Also das war ja nicht schwer :lol:

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
bool draw (void)
{
    ::SDL_Rect dest  = { 0,0,0 };
    ::SDL_Rect dest2 = { 0,0,0 };
    dest.w = g_image->w;
    dest.h = g_image->h;
    dest2.x = 16;   
    dest2.y = 8;

    for (int i = 0; i < 117; ++i)
    {


        for (int j = 0; j < 117; ++j)
        {
            SDL_BlitSurface(g_image, NULL, g_secondary, &dest);
            SDL_BlitSurface(g_image, NULL, g_secondary, &dest2);
            dest.x = dest.x + 32;
            dest2.x = dest2.x + 32;
        }
        dest.x = 0;
        dest.y = dest.y + 16;
        dest2.x = 16;
        dest2.y = dest2.y + 16;
    }

    return (true);
}
Every day is a programming day ;)

Werbeanzeige