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

xXSlayerXx

Treue Seele

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

11

12.02.2013, 12:52

um nochmal auf deine Funktion zurrück zu kommen.
Beim Aufruf der Funktion kennt dein Programm die Funktion noch garnicht.

Sie muss zu beginn des Programms bekannt gemacht werden.(Zumindest in diesem Fall)

Du musst den Funktionskopf oben als Prototypen angeben.
Zu diesem Thema steht auch im Buch von Heiko Kalista was geschrieben.
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »xXSlayerXx« (12.02.2013, 19:57)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

12.02.2013, 13:19

Der Compiler läuft übrigens, bevor das Programm läuft. Der Compiler ruft daher gar keine Funktion auf, er übersetzt sie.
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]

13

12.02.2013, 21:39

Also ich habe mir heute nochmal alles durchgelesen, und ich denke die Grundlagen von Zeiger, Refferenzen sitzen nun :)

Möchte das ganze auch festigen, und deswegen hab ich klein angefangen, und arbeite mich gerade zur MAP Funktion hoch :).

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
//Include SDL functions and datatypes
#include "SDL/SDL.h"
void        LadeBild(SDL_Surface* screen, SDL_Surface* hello,  SDL_Surface* eplogo, SDL_Surface* eplogo2,SDL_Rect *rect, SDL_Rect *Coords);
int main( int argc, char* args[] )
{
    //The images
    SDL_Surface* hello = NULL;
    SDL_Surface* screen = NULL;
    SDL_Surface *eplogo = NULL;
    SDL_Surface *eplogo2 = NULL;
    eplogo = SDL_LoadBMP("Grassland.bmp");
    eplogo2 = SDL_LoadBMP("Weg.bmp");



SDL_Rect  Coords;

Coords.x = 0;
Coords.y=0;
Coords.h = 50;
Coords.w = 50;

SDL_Rect  rect;

rect.x=0;
rect.y=0;
rect.h=50;
rect.w=50;

    //Start SDL
    SDL_Init( SDL_INIT_EVERYTHING );
    //Set Screen
    screen = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );

    //Load image
    hello = SDL_LoadBMP( "hello.bmp" );

        LadeBild(screen, hello, eplogo, eplogo2, &rect,&Coords);

        //Quit SDL
        SDL_Quit();
        return 0;
        }

void    LadeBild(SDL_Surface* screen, SDL_Surface* hello, SDL_Surface* eplogo, SDL_Surface* eplogo2, SDL_Rect *rect, SDL_Rect *Coords )
        {
    //Apply image to screen
    SDL_BlitSurface( hello, NULL, screen, NULL );
            //Update Screen
    SDL_Flip( screen );
            //Pause
    SDL_Delay( 2000 );
        //Apply image to screen
    SDL_BlitSurface( eplogo, NULL, screen, NULL );
            //Update Screen
    SDL_Flip( screen );
                //Pause
    SDL_Delay( 2000 );

            //Free the loaded image
    SDL_FreeSurface( hello );
        }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

13.02.2013, 06:35

Du brauchst nicht an jede Zeile Code einen Kommentar schreiben! Da steckt absolut kein Mehrwert drin, sondern du duplizierst genau das, was der Code eh schon sagt. Das nützt keinem etwas und macht das Lesen des Codes schwerer, sowie die Funktionen überflüssig länger. Auch die grauenvolle Einrückung solltest Du eventuell vereinheitlichen, solchen Code zu lesen macht keinen Spaß.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    //Load image
    hello = SDL_LoadBMP( "hello.bmp" );
        //Quit SDL
        SDL_Quit();
                //Pause
    SDL_Delay( 2000 );
            //Free the loaded image
    SDL_FreeSurface( hello );
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]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

13.02.2013, 13:20

Und gewöhn dir bitte direkt vernünftige Benennung an. Warum heißt der zweite Parameter von LadeBild hello? Außerdem ist eine einheitliche Sprache sinnvoll. Deutsch oder Englisch. Durch diese beiden Punkte kannst du deinen Code noch mal um einiges lesbarer machen. Das kommt dann vor allem dir selbst zugute. Die beiden Punkte die BlueCobold genannt hat sind auch sehr wichtig. Richtig einrücken hilft enorm um dich im Code zurechtzufinden. Und Kommentare sind super, aber vor allem da wichtig wo viel passiert. Wenn du zwei geschachtelte Schleifen hat bei denen was weiß ich was passiert, dann kann es sinnvoll sein jede Zeile zu kommentieren. Einfach damit du dich zurecht findest. Aber was bei SDL_Flip passiert ist auch ohne Kommentar klar. Da musst du aber einen Weg finden, mit dem du selbst klar kommst. Das kommt mit der Zeit.
Da fällt mir noch was auf:
void LadeBild(SDL_Surface* screen, SDL_Surface* hello, SDL_Surface* eplogo, SDL_Surface* eplogo2,SDL_Rect *rect, SDL_Rect *Coords);

Warum wechselst du bei der Groß- und Kleinschreibung. Mach das der Übersicht halber besser nicht. Und bei manchen Parametern nutzt du die ungarische Notation. Zumindest irgendetwas was mich daran erinnert. SDL_Surface* eplogo. Warum nennst du das so? Nenn den Parameter doch einfach logo. Dass es ein Zeiger ist verrät dir deine IDE vermutlich auch und wofür das e am Anfang steht bin ich mir selbst nicht sicher;)
„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.“

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

16

13.02.2013, 18:37

Ich hätte auch noch einen Verbesserungsvorschlag bezüglich der Surfaces.

Du verwendest für jede Tile-Grafik ein eigenes Surface. Das gibt jetzt mit 2 Surfaces noch keine Probleme, aber stell dir mal vor, du hast später 20 Tiles oder mehr. Du solltest alle Tile-Grafiken in ein Bilddatei packen und in ein einzelnes Surface laden. Du kannst dann eine einzelne Grafik aus diesem Surface durch entsprechende Anpassung von xyhw in der SDL_Rect-Struktur auswählen und brauchst nur 1 Surface für alle Tile-Grafiken übergeben.

Nur so als Hinweis, falls du da nicht schon selbst daran gedacht und das nur zum herumprobieren jetzt so gemacht hast ;)

17

14.02.2013, 07:07

:) Danke erstmal für die vielen Anregungen, werde sie beherzigen.

Für mich war in dem Beispiel momentan nur wichtig, das ich Zeiger nochmal deutlich wiederhole und lerne.

Ich denke das habe ich eigentlich mittlerweile gut hinbekommen.

Ich habe jetzt eine Figur, die über eine Map läuft, allerdings wird diese immer neu auf den Bildschirm geladen, und nicht wieder gelöscht.
Habe mal mit SD_Rect rumprobiert, komme aber nicht auf das erwünschte ergebnis.

Bei SDL_Blitsurface(NULL,SREC, NULL, SREC) Der 2 Parameter ist ja für das zu Ladende Bild, wie groß und an welcher Position es sitzen soll, und der zweite sollte ja die Hoehe und die Breite, sowie x und y akze bestimmten die zu rendern ist richtig?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

18

14.02.2013, 11:37

Wenn du dir damit unsicher bist, gibt es ein ganz ordentliches Nachschlagewerk für die SDL: http://sdl.beuc.net/sdl.wiki/SDL_BlitSurface
Vllt. hilfreich für spätere Probleme.
Ich empfehle Newbies die die SDL verwenden auch gerne die LazyFoo Tutorials: http://lazyfoo.net/SDL_tutorials/index.php
Vllt. ist ja da was für dich dabei? :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

19

14.02.2013, 18:25

Ich habe jetzt eine Figur, die über eine Map läuft, allerdings wird diese immer neu auf den Bildschirm geladen, und nicht wieder gelöscht.

Der Bildschirm wird auch nicht automatisch wieder gelöscht. Du musst das Bild in jedem Schleifendurchlauf (Frame) neu aufbauen, d.h. nach aktualisieren der Positionen (Spieler etc.) zeichnest du die Map neu (damit wird der alte Inhalt überschrieben) und dann den Spieler etc. mit den neuen Positionen.

Werbeanzeige