Anfänger: Pointer auf SDL_Surface-Pointer,funktioniert nicht. Warum?
-
Storm.Xapek.de schrieb:
Nein ich bekomms nicht hin
die WErte sind bei beiden gleich! info.current.x = 0 info.current.y = 0
info.current.w = image->w info.current.h = image->h
so hab ich das definiert.
Aber so wie ich das jetzt sehe liegts am surface (dem Hauptfenster also auf das ich zeichnen will) das ist irgendwie gesperrt:
Surfaces must not be locked during blitAber warum? Die Variable surface ist in der main definiert, vielleicht wird sie irgendwie automatisch gesperrt wenn ich die main verlasse.
Also ich kapiers garnicht.Vielelicht ist das auch ein folgefehler aus einem anderen fehler

Hast du ne ahnung von was sowas kommen kann?
Du hattest anfangs recht. Es liegt am übergeben per Zeiger (Warum weiß ich grad auch nicht...bin auch recht verwundert.Vllt beim poppen vom Stack
. bei mir kam der gleiche Fehler).Wie du bereits gesagt hast, funktioniert es, wenn man den Zeiger zurückgibt.
Dann gib halt einfach den Zeiger auf dein Bildschirmsurface zurück.#include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <stdlib.h> SDL_Surface* init (int width , int height) { if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr , "error: SDL_Init()\n%s" , SDL_GetError()); exit(-1); } SDL_Surface* surface = SDL_SetVideoMode(width , height , 16 , SDL_DOUBLEBUF | SDL_HWSURFACE); if (surface == 0) { fprintf(stderr , "error: SDL_VideoMode()\n%s" , SDL_GetError()); exit(-1); } atexit(SDL_Quit); return surface; } int main (void) { SDL_Surface* surface; surface = init(800 , 600); if (surface == 0) { printf("surface == 0\n"); exit(-1); } SDL_Surface* img = IMG_Load("aaa.png"); if (img == 0) { fprintf(stderr , "IMG_Load\n"); exit(-1); } SDL_Rect srect , drect; /* srect == Quelle (sourcerect) , drect == Ziel (destination rect)*/ srect.x = 0; srect.y = 0; srect.w = img->w; srect.h = img->h; drect.x = 20; drect.y = 20; drect.w = img->w; drect.h = img->h; for (int frames = 0; frames < 20; ++frames) { SDL_BlitSurface(img , &srect , surface , &drect); SDL_Flip(surface); SDL_Delay(20); printf("%d \n" , frames); } SDL_Delay(3000); SDL_FreeSurface(img); exit(0); return 0; }Dann brauchst du aber den Zeiger auf das surface nicht der init() funktion zu übergeben.
also:
SDL_Surface* init (int width , int height);Was besseres fällt mir im Moment auch nicht ein.
EDIT:
Der code funkt jetzt wenigstens. ALso das Bild wird gezeichnet.
-
Das heißt aber acuh das ich das so wie ich es jetzt habe nicht machen kann,
also das mit der methode draw(). Das finde ich allerdings am einfachsten.
Ich hab leider heut kaum noch zeit, aber sobald ich kann versuche ich
es mal mit ner referenz. Vielleicht klappts ja so.ansonsten muss ich mein klassendesign nochmal neu überdenken
-
Storm.Xapek.de schrieb:
Das heißt aber acuh das ich das so wie ich es jetzt habe nicht machen kann,
also das mit der methode draw(). Das finde ich allerdings am einfachsten.
Ich hab leider heut kaum noch zeit, aber sobald ich kann versuche ich
es mal mit ner referenz. Vielleicht klappts ja so.ansonsten muss ich mein klassendesign nochmal neu überdenken
Ähm was?
Warum soll was nicht mit deiner draw funktion funktionieren?
Änder einfach mal die int funktion ab. (zB wie in dem code, den ich gepostet hab)
Probiers dann mal aus. Vllt gehts. Ich kann dir nix genaueres sagen, da ich dein code net kenne.
-
Ok,
hast recht es läuft jetzt halbwegs, ich denke mit dem rest werd ich alleine fertig.
Sonst post ich wieder.Danke für deine hilfe
-
int init (SDL_Surface* surface , int width , int height) { if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr , "error: SDL_Init()\n%s" , SDL_GetError()); exit(-1); } surface = SDL_SetVideoMode(width , height , 16 , SDL_DOUBLEBUF | SDL_HWSURFACE); if (surface == 0) { fprintf(stderr , "error: SDL_VideoMode()\n%s" , SDL_GetError()); exit(-1); } atexit(SDL_Quit); return 0; }falsch richtig währe
int init (SDL_Surface** surface , int width , int height) { if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr , "error: SDL_Init()\n%s" , SDL_GetError()); exit(-1); // oder return false; } *surface = SDL_SetVideoMode(width , height , 16 , SDL_DOUBLEBUF | SDL_HWSURFACE); if (*surface == 0) { fprintf(stderr , "error: SDL_VideoMode()\n%s" , SDL_GetError()); exit(-1); // oder return false; } atexit(SDL_Quit); return true; }aber wie du es jetzt hast ist es besser