Anfängerprobleme
-
Also ich hab ein wenig c++ über die schule an der uni gelernt (also grundlagen pointer klassen unsdsoweiter) und hatte vorher schonmal mit dem borland c++builder rumgespielt
. So was ich jetzt machen möchte ist ums auf den punkt zu bringen ein 2d sidescroller mit tilebasierendem hintergrund + halt raumschiffe undsoweiter im vordergrund. Zum programieren benutz ich dev-c++. Ich hatte schonmal mitm c++builder angefnagen aber das hörte dann mit diversen TImages und timern auf. Also was ich wissen möchte ist welche libraries ich einbinden muss, nachdem ich mal im internet rumgeguckt habe frage ich mich ob man irgendwie ein Feld machen kann in das man dann die Bitmaps reinzeichnen lassen kann? (bezieht sich auf http://www.codeproject.com/gdi/flickerfree.asp )und eventuell noch wie ich alle Bitmaps einbinden kann, denn beim letzten mal musste ich alle Frames der animierten sachen immer neu laden lassen was sehr unschön ist.
Ich bedank mich schonmal für jegliche Hilfe und hoffe das ihr solche fragen nicht schon zu oft beantworten musstet
achja http://www.c-plusplus.net/forum/viewtopic.php?t=39436 hab ich angefangen zu lesen aber ich hab alt das problem mit den bitmaps zeichnen
-
Am Besten Schrittweise:
1. Ein Bitmap der Größe x*y blitten können an der linken oberen Ecke.
2. Das selbe Bitmap zeichnen können an beliebiger Stelle x1,y1.
3. Jetzt kannst du auch mehrer Bitmaps zeichnen Feldweise.
4. Bitmaps noch um einen Gewissen Offset verschieben können (Scrolling)Wenn nicht, schau dir halt mal die SDL an.
-
SeppSchrot schrieb:
1. Ein Bitmap der Größe x*y blitten können an der linken oberen Ecke.
2. Das selbe Bitmap zeichnen können an beliebiger Stelle x1,y1.
3. Jetzt kannst du auch mehrer Bitmaps zeichnen Feldweise.
4. Bitmaps noch um einen Gewissen Offset verschieben können (Scrolling)1. Hab ich (wenn auch nich unter vc++ aber ichdenke mal das bremst sowieso nur und bringt mir keine vorteile.
2. Hab ich.
3. Also ich hab das dann einfach dahinter nochmal meinen original code mit anderen koordinaten durchlaufen lassen also ich benutz folgenden code
image = SDL_LoadBMP("tile1.bmp"); if(image == NULL) { printf("Can't load image: %s\n", SDL_GetError()); exit(1); } dst.x = 216; dst.y = 216; 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); SDL_FreeSurface(image); SDL_Flip(screen);
(agewandelt von http://www.funkystuff.org/tutorials.html)
4.also wenn ich
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
benutzen würde um den anzeigebereich wieder zu löschen würdes doch denkichmal flickern.. und ausserdem wärs doch praktisch wenn ich die bilder zussammenfassen könnte (http://www.c-plusplus.net/forum/viewtopic.php?t=97737 is ja wenn mich nicht alles täuscht ein ähnliches problem gewesen)also 1-3 hab ich geschafft aber 4. da hab ich probleme
-
1. Hab ich (wenn auch nich unter vc++ aber ichdenke mal das bremst sowieso nur und bringt mir keine vorteile.
Hä?
Also erstmal sollest du überlegen, ob du wirklich den Bildschirm immer löschen musst, oder ob du sowieso immer alles überzeichnest.
Dann ist es natürlich sinnvoll, die Surface der Quellbilder im Speicher zu halten und nicht immer neu zu laden.
Flickern dürfte es eigentlich nicht, denn du benutzt ja schon DoubleBuffering.
-
äh also ich hatte am anfang die windows gui librarie noch drin.. aber das ist ja so ziemlich sinnlos... ist ja auch egal
also ich hatte eigentlich einen recht großen schwarzen bereich eingeplant, dann müsste ich ja n schwarzen sprite machen.. also ich hab keine ahnung was schneller läuft (ich denk mal ich überschreibs einfach und nehm schwarze sprites dann kann ich bei bedarf auch noch einfach sterne und ähnliches einfügen)
-
also ich hab jetzt mal probiert das blitten in ne funktion gemacht und bin dabei wieder gestolpert
also ich wollte
int drawsprite(SDL_Rect dst,SDL_Surface *screen,SDL_Surface *image, char* filename, int x, int y);
(ja da wird ein bisschen viel übergeben aber ich kanns nicht besser
)
machen aber wenn ich dass dan durchdrawsprite(dst, *screen, *image, "tile1.bmp", 200,200);
beschwert sich der compiler: zitat"cannot convert `SDL_Surface' to `SDL_Surface*' for argument `2' to `int" nunja ich hoffe das lässt sich einfach beheben
-
drawsprite(dst, *screen, *image, "tile1.bmp", 200,200);
screen und image sind normaler Weise bereits Zeiger, also lass die Sternchen einfach weg:
drawsprite(dst, screen, image, "tile1.bmp", 200,200);
-
vielen dank funktioniert jetzt
kann ich das jetzt irgendwie schafen das die bilder mit compiliert werden und in der exe sind?
-
philipptr schrieb:
vielen dank funktioniert jetzt
kann ich das jetzt irgendwie schafen das die bilder mit compiliert werden und in der exe sind?
Unter Windows: Als Ressourcen.
Ansonsten: Als Header.
-
Sgt. Nukem schrieb:
...
Unter Windows: Als Ressourcen.
Ansonsten: Als Header.Also ich nehm mal an das ressourcen nihct unter linux funktionieren. wollte aber eigenltlich obwohl ich linux (noch) nicht benutze das spiel möglichst kompatibel halten so das ich nur möglichst wenig code ändern muss ums auf Linux zu kompilieren.. was meinst du mit "Als Header."? und würde das dann auch unter win laufen?
ausserdem hab ich noch ein problem beim laden meines levels: ich benutz
typedef string level[20]; level level1; string filename; int levelnr=1; ... string levelfile; switch (levelnr) { case1: levelfile = "level1.txt"; break; } ifstream readfile (levelfile.c_str()); for (unsigned int i=0;i<20;i++) { readfile>>level1[i]; } readfile.close();
aber level1 bleibt leer
-
Das erste was mir auffällt ist ein typedef auf arrays -> BÖSE
(nur mal so nebenbei)...
-
Vor allem gibts std::string.
Bye, TGGC \-/
-
zu dem bild als header einbinden...da geht man hin und schreibt sich n kleines tool, vielleicht gibts das auch irgendwo...sicherlich eigentlich...das dann die pixel des bildes einzeln ausliest und ne "bild.h" datei bastelt die dann irgendwie so aussehen könnte
Uint8 bild[3][3][3] = { { 255,0,0 }, { 255,0,0 }, { 255,0,0 } }, { { 255,255,0 }, { 255,255,0 }, { 255,255,0 } }, { { 0,255,0 }, { 0,255,0 }, { 0,255,0 } }
wär zum beispiel die jamaica flagge rot-gelb-grün
aber verstehst du was ich meine...die pixelinfos die eigentlich in der datei stehen werden irgendwie in eine datei gepckt die man mit dem code kompilieren und dann intern weiterverarbeiten kann.
problem bei meiner methode ist allerdings warscheinlich etwas die performance, da die bilder im arbeitsspeicher verweilen und wenn sie noch im spiel selbst geladen sind doppelt existieren...da gibt es noch einiges zu optimieren...eine idee wäre vielleicht sie direkt als pixelliste wie sie SDL speichert da rein zu packen...aber da bin ich dann an meinen grenzen.
Für kleinere projekte kann man das aber sicherlich verwenden.Ich hab auch schon irgendwo (http://www.robsite.de/daten/programme/ezip.zip) ein programm gesehen, da packst du den ganzen spiel ordner in eine zipdatei und das programm bastelt dann ein selbstextrahierendes archiv draus, das sich temporär entpackt, die exe startet und danach wieder die dateien löscht...benutzt hab ich das allerdings noch nicht...aber hört sich interessant an
und ist warscheinlich einfacher+besser als meine gammelheader methodecya kolf
-
das mit dem level laden funktioniert (mit stings) jetzt, der ignoriert zwar erste zeile und spalte aber damit kann ich leben
hab immoment noch ein bisschen probleme 1. mit sdl threads (ja ich weis die sind eigentlich pups einfach aber ich bin halt ein noob) und 2. läuft es jetzt wo bewegeung ins spiel kommt recht langsam aber ich glaub da gibt es noch andere threads die sich dem thema geschwindigkeits optimierung annehmen
daher werd ich mich erst wieder melden wenn ich entweder mit den threads gar nicht mehr weiterkomm oder neue probleme auftauchen
btw: bei der methode mit den Bildern in ner header datei.. dann würde das bilder benutzen doch schneller laufen oder ich mein die sind ja schon geladen.. (mach mir bei schätzungsweise max 10fps auf 2.8ghz echt sorgen
)
-
philipptr schrieb:
btw: bei der methode mit den Bildern in ner header datei.. dann würde das bilder benutzen doch schneller laufen oder ich mein die sind ja schon geladen.. (mach mir bei schätzungsweise max 10fps auf 2.8ghz echt sorgen
)
Das solltest Du anders lösen...
Wenn Du nachher mehrere Level hast, würdest Du ja sämtliche Bilder immer im Speicher halten... (Quake 3 hatte 500 MB Ressourcen
)
Und an den FPS wird das auch nix ändern. Du lädst die Bilder ja eh nur einmal am Anfang sonst...
-
also die fps hab ich in den griff bekommen hatte ein paar sehr blöde fehler gemacht... was jetzt mein problem ist: ich woltle das tileset des spieles in eine datei machen und hab das dann wie folgt versucht:
SDL_Surface *tileset; SDL_Rect SourcRect = {0,0,16,16};; tileset = SDL_LoadBMP("tileset.bmp"); sprites[0]=SDL_CreateRGBSurface(SDL_HWSURFACE, 16, 16, 16, rmask, gmask, bmask, amask); SDL_BlitSurface(tileset, &SourcRect, sprites[0], &SourcRect);
allerdings bleibt sprites[0] leer... hat jemand ne idee was ich falsch gemacht haben könnte?
-
also weis niemand wieso das nicht funktioniert / kennt niemand eine andere art auf die ich einen teil eines surfaces in ein anderes kopieren kann?
-
kolloffnikoff schrieb:
zu dem bild als header einbinden...da geht man hin und schreibt sich n kleines tool, vielleicht gibts das auch irgendwo...sicherlich eigentlich...das dann die pixel des bildes einzeln ausliest und ne "bild.h" datei bastelt ...
also nochmal dazu: dieses eine linux-bitmap format (kann mich jetzt nicht an den namen erinnern
) besteht aus header dateien, daher werd ich wenn ich das dann machen will einfach die bmps mithilfe von gimp umwandeln und dann dürfte ich die eigentlich normal einbinden können