Unohdin BlitzBasic projektini ja aloin tehdä sitä SDL 2.0:lla.
Homma on alkutekijöissään.
Grafiikat kyllä osaan ladata SDL_Surfaceihin mutta kuinka luodaan 800x600 kokoinen *screen surface jonne voi sitten blitata?
Peli ei tarvitse vauhtia niin palj0n että joutuisin käyttämään tekstuureja.
Lisäys:
Koodi on tälläinen ja seuraa seuraava virhe:
F:main.cpp:46:24: error: cannot convert 'SDL_Rect' to 'const SDL_Rect*' for argument '2' to 'int SDL_UpperBlit(SDL_Surface*, const SDL_Rect*, SDL_Surface*, SDL_Rect*)'
#include <iostream> #include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <stdlib.h> #include <stdio.h> using namespace std; int main(int argc, char** argv) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { fprintf(stderr, "Virhe: %s\n", SDL_GetError()); exit(1); } atexit(SDL_Quit); SDL_Surface *floor; floor=IMG_Load("lattia.gfx"); SDL_Window *window; // Declare a pointer to an SDL_Window SDL_Init(SDL_INIT_VIDEO); // Initialize SDL2 // Create an application window with the following settings: window = SDL_CreateWindow( "An SDL2 window", // window title SDL_WINDOWPOS_UNDEFINED, // initial x position SDL_WINDOWPOS_UNDEFINED, // initial y position 800, // width, in pixels 600, // height, in pixels SDL_WINDOW_FULLSCREEN ); SDL_Rect srcrect; srcrect.x=100; srcrect.y=32; SDL_Rect dstrect; dstrect.x=300; dstrect.y=300; SDL_BlitSurface(floor, srcrect, floor, dstrect); SDL_Delay(1000); SDL_FreeSurface(floor); }
Lisäys:
SDL2-opas kirjoitti:
SDL2 sisältää kuvia kahdessa muodossa: kuvapintoina (SDL_Surface) ja tekstuureina (SDL_Texture). Kuvapinnat ovat pakkaamatonta pikselidataa ja sijaitsevat koneen keskusmuistissa. Niitä voi ladata tiedostosta, muokata ja tallentaa. Jotta kuvia voisi piirtää ruudulle, ne pitää kopioida tekstuureiksi näytönohjaimen muistiin. Tekstuureita ei voi enää käytännöllisesti itse käsitellä, mutta näytönohjain pystyy venyttämään ja pyörittämään niitä ja piirtämään ne ruudulle erittäin nopeasti.
TUOSSAPA SELITYS SUORAAN OPPAASTA
Mod. lisäsi lainaustagit!
SDL2:lla ei ole tarkoitus blitata ikkunaan. Siksi oppaassa ei vihjatakaan siitä mahdollisuudesta. Jos et erityisesti muokkaa kuviesi pikseleitä jatkuvasti läpi ohjelman, ei ole mitään syytä, miksi blittaaminen olisi yhtään käytännöllisempää kuin tekstuurien käyttö.
Jos silti haluat välttämättä blitata, voit luoda erikseen funktiolla SDL_CreateRGBSurface pinnan, jolle blittaat muita pintoja, ja voit tehdä tekstuurin vain tuosta yhdestä pinnasta lopullista ruudulle piirtämistä varten. Tästä on esimerkki SDL2:n Wikissä. Kunnollinen tekstuurien käyttö kuitenkin nopeuttaa ohjelmaa huomattavasti, ja vaikka et tarvitsisi nimenomaan vauhtia, ehkä joku muu toivoo, että pelisi kuluttaa koneen tehoista vain promillen eikä neljännestä.
Koodissasi käännösvirheen syy on aivan typerä: yrität syöttää funktiolle SDL_BlitSurface kokonaisia SDL_Rect-tietueita (srcrect ja dstrect) etkä osoittimia (&srcrect, &dstrect). Ihan saman virheilmoituksen olisit saanut tuolla koodirivillä SDL 1.2:ssa tai vastaavassa tilanteessa täysin ilmankin SDL:ää, joten nyt asia on kyllä ihan C++-taidoista kiinni. Tietenkään virheen korjaaminen ei paljon auta, kun sekä lähde- että kohdepintana on floor.
Kuinkas toimisi SDL_GetWindowSurface(), blittaus tuohon ja SDL_UpdateWindowSurface() ?
Aihe on jo aika vanha, joten et voi enää vastata siihen.