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

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

1

15.03.2009, 15:34

Wie kann mann ein Sprite nebeneinander anzeigen ? [SDL]

Hi Community,
wie es schon in der Überschrift steht wie kann mann ein Sprite bei SDL nebeneinander anzeigen?
Da ich noch relativ neu bin beim Programmieren von C++.

Ein Beispiel:

(Link)

Dies soll Grundsprite für den Boden darstellen.


(Link)

Und so soll es dann ausehen.
Every day is a programming day ;)

Anonymous

unregistriert

2

15.03.2009, 15:49

Sehr easy. Hier ein Beispiel von einem Tile das 128x64 Pixel groß ist:

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);
    }
}


Zeichnet ein 7x7 Iso-Feld. Drauf zu achten ist, dass bei jeder 2. Zeile (oder 1. Je nachdem wie man es will) die Tiles in dieser Zeile um die Hälfte auf der X-Achse "eingerückt" werden.

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

3

15.03.2009, 16:18

thx ;) es gibt aber ein problem der Compiler zeigt ständig folgendes an:

Quellcode

1
error C2064: Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt
Every day is a programming day ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

15.03.2009, 16:23

Zeichne_Tile is natürlich nur ein platzhalter für was auch immer du verwendest um dein tile an position x, y zu zeichnen...

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

5

15.03.2009, 16:34

Das hat es ja angezeigt.
Hier der gesamte Code:

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
#include <SDL.h>
#include <windows.h>
int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{

    int tile_width = 128;
    int tile_height = 64;

    SDL_Surface*    screen;        // unser Bildschirm/Zeichenfläche/Frontbuffer

    SDL_Surface*    image;        // unsere Bitmap

    SDL_Rect    src_bmp;    // Maße der Bitmap

    SDL_Rect    dest_scr;    // Maße der Bitmap auf dem Bildschirm


    // SDL initialisieren

    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        // Fehlerbehandlung

        return 1;
    }

    // Videomodus setzten(640*480*32) und abspeichern

    screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    if(!screen)
    {
        // Fehlerbehandlung

        return 1;
    }

    // Bitmap laden und abspeichern

    image = SDL_LoadBMP("Boden.bmp");
    if(!image)
    {
        // Fehlerbehandlung

        return 1;
    }

    // Werte für unsere Bitmap setzten

    src_bmp.w = image->w;        // Ganze Breite der Bitmap, die wir von unseren Surface beziehen

    src_bmp.h = image->h;        // Ganze Höhe der Bitmap, die wir von unseren Surface beziehen

    src_bmp.x = src_bmp.y = 0;    // Ganze Bitmap zeichen, also von obenan zeichnen (0;0)


    dest_scr = src_bmp;            // Ziel auf dem Bildschirm = Maße der Bitmap


    // Colorkey setzen, also die Farbe, die transparent wird, hier rosa

    SDL_SetColorKey(image, SDL_SRCCOLORKEY, 0xFF00FF);

    // Bild auf den Backbuffer blitten(zeichnen)

    SDL_BlitSurface(image, &src_bmp, screen, &dest_scr);

    // Jetzt vom Backbuffer auf dn Frontbuffer

    SDL_Flip(screen);

        // 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

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

    // Jetzt Aktion...

    SDL_Delay(3000);    // 3 Sekunden warten


    // Surface löschen

    SDL_FreeSurface(image);
    SDL_FreeSurface(screen);

    // SDL herunterfahren

    SDL_Quit();

    return 0;
}
Every day is a programming day ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

15.03.2009, 16:39

Zitat

C-/C++-Quelltext

1
screen (tile_width * i + offset_x, tile_height / 2 * j);


ich hab jetzt net viel ahnung von SDL, aber ich frag mich ernsthaft wie das gehen soll wenn man versucht nen Zeiger auf ne SDL_Surface wie ne Funktion aufzurufen dass das dann das entsprechende Bild an die entsprechende Stelle bringt...

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

7

15.03.2009, 16:47

Es scheint als würde da sehr viel an Grundlagenwissen fehlen. Ich würde dir empfehlen ein Buch über C++ zu lesen, oder (falls du das schon getan hast) nochmal gründlicher durchzuarbeiten.

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

8

15.03.2009, 16:48

ich hab es mal wie im Buch (C++ für Spieleprogrammierer) versucht aber es zeigt nur ein Sprite an:

Quellcode

1
2
    int Breite = 7;
    int Höhe   = 7;

Quellcode

1
2
3
4
5
6
7
    for (int y=0; y<Höhe; y++)
    {
        for (int x=0; x<Breite; x++)
        {
            SDL_Flip(screen);
        }
    }
Every day is a programming day ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

15.03.2009, 16:54

du übergibst der funktion SDL_Flip nirgendwo weder das zu zeichnende bild noch die position an die gezeichnet werden soll.
ohne je eine zeile SDL programmiert zu haben kann da wohl jeder durch hinschauen sagen dass das so nicht gehen wird...

ich schließe mich xardias an: setz dich nochmal etwas genauer mit den grundlagen auseinander. einfach rumprobieren wird schnell nur frustrierend werden...

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

10

15.03.2009, 19:26

So ich hab ein paar Tutorial durch gearbeitet und glaube fast es zu geschaft zu haben.
Aber es geht immer noch nicht

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
#include <stdlib.h>
#include <SDL.h>
int main(int argc, char *argv[])
{   
   int Breite = 7;
   int Höhe   = 7; 

    SDL_Surface *screen, *image;
    SDL_Rect dst;
    SDL_Event event;
    int done = 0;
    if (SDL_Init(SDL_INIT_VIDEO) == -1) {
        printf("Can't init SDL:  %s\n", SDL_GetError());
        exit(1);
    }
    atexit(SDL_Quit); 
    screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 58,95,205));
    if (screen == NULL) {
        printf("Can't set video mode: %s\n", SDL_GetError());
        exit(1);
    }
    image = SDL_LoadBMP("Boden.bmp");
    if (image == NULL) {
        printf("Can't load image of tux: %s\n", SDL_GetError());
        exit(1);
    }
    dst.x = 200;
    dst.y = 200;
    dst.w = image->w;
    dst.h = image->h;


    SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 255));
    SDL_BlitSurface(image, NULL, screen, &dst); 

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

        dst.x ++;   
        SDL_BlitSurface(image, NULL, screen, &dst); 
      }

      dst.y ++;
   } 
    SDL_FreeSurface(image);  
    SDL_Flip(screen);
    


   
    while (!done) {
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
            case SDL_QUIT:
                done = 1;
                break;
            }
        }
    }
    return 0;
}

Ich glaub das es was hier mit zu tun hat

C-/C++-Quelltext

1
SDL_BlitSurface(image, NULL, screen, &dst); 
Every day is a programming day ;)

Werbeanzeige