Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL 2.0 ScreenSurface

DumTom [14.12.2013 01:32:26]

#

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!

Metabolix [14.12.2013 12:44:56]

#

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.

jalski [14.12.2013 18:37:53]

#

Kuinkas toimisi SDL_GetWindowSurface(), blittaus tuohon ja SDL_UpdateWindowSurface() ?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta