Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Taas SDL-ongelma

Sivun loppuun

Baglair [22.01.2006 19:23:49]

#

Eli minulla on nyt tuommonen SDL Surface. Mitenkäs onnistuu sitten toisen pinnan luominen, johon voi piirtää?

SDL_Surface *naytto;
naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN);

Heikki [22.01.2006 19:29:48]

#

SDL_CreateRGBSurface

Baglair [22.01.2006 19:35:39]

#

Kiitos, vaikka kysymys huonosti muotoiltu Heikki hoitaa homman kotiin.
EDIT: Heräsi mieleen kysymys mikä on RGBA maskissa tuon A:n eli Alphan tehtävä?

Metabolix [22.01.2006 20:30:53]

#

Se on läpinäkyvyys. 0 on läpinäkyvä, 255 on peittävin.

Muista tuhota kaikki tekemäsi surfacet lopuksi SDL_FreeSurface-funktiolla.

Baglair [22.01.2006 20:39:42]

#

Kiitos. Vielä semmoista että miten saan siirrettyä jostain surfacesta toiseen surfaceen?

Zach [22.01.2006 20:53:57]

#

SDL_BlitSurface

Metabolix [22.01.2006 21:04:38]

#

Kannattaa noita oppaitakin lueskella.

Baglair [22.01.2006 21:26:22]

#

Mikäs tässä nyt on vikana?

/*
	Tämän ohjelman idea on luoda hiiren kursorin paikalle rasti
	ja piirtää janaa leikkauspisteiden kohdalle hiiren vasenta
	nappia painettaessa.
*/
#include "omat_funktiot.h"
#define	RESOLUUTIO_X	1024
#define	RESOLUUTIO_Y	768
#define	BPP	32

int main(int argc, char *argv[])	{
	int x_hiiri, y_hiiri;
	int x_naytto, y_naytto;
	int hiiri_nappain;

	if(SDL_Init(SDL_INIT_VIDEO) < 0)	{
		return 0;
	}
//Pinnat:
	SDL_Surface *naytto;
	SDL_Surface *piirto;
	naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN);
	piirto = SDL_CreateRGBSurface(SDL_HWSURFACE, RESOLUUTIO_X, RESOLUUTIO_Y, BPP, 0, 0, 0, 0);
//Kursori piiloon
	SDL_ShowCursor(0);
//Näppäin
	SDL_Event tapahtuma;
	Uint8* nappi;
	for(;;)	{
		SDL_PollEvent(&tapahtuma);
		hiiri_nappain = SDL_GetMouseState(&x_hiiri, &y_hiiri);
//Piirrä leikkauspisteet
		for(x_naytto = 0; x_naytto < RESOLUUTIO_X; ++x_naytto)	{
			PiirraPikseli(naytto, x_naytto, y_hiiri, 25, 255, 25);
		}
		for(y_naytto = 0; y_naytto < RESOLUUTIO_Y; ++y_naytto)	{
			PiirraPikseli(naytto, x_hiiri, y_naytto, 25, 255, 25);
		}
//Jos hiiren vasen nappi pojassa, sytytä punainen pikseli leikkauspisteen kohdalle.
	if(hiiri_nappain & SDL_BUTTON(1)) {
		PiirraPikseli(piirto, x_hiiri, y_hiiri, 255, 0, 0);
	}
		SDL_BlitSurface(naytto, NULL, piirto, NULL);
		SDL_Flip(naytto);
		SDL_FillRect(naytto, NULL, 0x000000);
//Jos painetaan ESC niin poistutaan loopista.
		nappi = SDL_GetKeyState(NULL);
		if (nappi[SDLK_ESCAPE])
			break;
	}
	SDL_ShowCursor(1);

	SDL_FreeSurface(piirto);
	SDL_Quit();
	return 0;
}

Metabolix [23.01.2006 00:16:24]

#

No mitä se tekee ja mitä sen pitäisi tehdä?

Baglair [23.01.2006 08:56:33]

#

Se piirtää rastin hiiren paikalle, mutta sen pitäisi piirtää rastin lisäksi hiiren vasenta nappia painaessa pikseli leikkauspisteen kohdalle ja siirtää se sitten piirto surfacelta naytto surfaceen ja sitten Flipata näyttö esiin mutta sitä se ei tee

aWW [23.01.2006 09:33:13]

#

Mikset piirrä suoraan naytto-pintaan?

en ole testannut, mutta nyt sen pitäisi toimia oikein

/*
    Tämän ohjelman idea on luoda hiiren kursorin paikalle rasti
    ja piirtää janaa leikkauspisteiden kohdalle hiiren vasenta
    nappia painettaessa.
*/
#include "omat_funktiot.h"
#define    RESOLUUTIO_X    1024
#define    RESOLUUTIO_Y    768
#define    BPP    32

int main(int argc, char *argv[])    {
    int x_hiiri, y_hiiri;
    int x_naytto, y_naytto;
    int hiiri_nappain;

    if(SDL_Init(SDL_INIT_VIDEO) < 0)    {
        return 0;
    }
//Pinnat:
    SDL_Surface *naytto;
    naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN);
//Kursori piiloon
    SDL_ShowCursor(0);
//Näppäin
    SDL_Event tapahtuma;
    Uint8* nappi;
    for(;;)    {
        SDL_FillRect(naytto, NULL, 0x000000);
        SDL_PollEvent(&tapahtuma);
        hiiri_nappain = SDL_GetMouseState(&x_hiiri, &y_hiiri);
//Piirrä leikkauspisteet
        for(x_naytto = 0; x_naytto < RESOLUUTIO_X; ++x_naytto)    {
            PiirraPikseli(naytto, x_naytto, y_hiiri, 25, 255, 25);
        }
        for(y_naytto = 0; y_naytto < RESOLUUTIO_Y; ++y_naytto)    {
            PiirraPikseli(naytto, x_hiiri, y_naytto, 25, 255, 25);
        }
//Jos hiiren vasen nappi pojassa, sytytä punainen pikseli leikkauspisteen kohdalle.
    if(hiiri_nappain & SDL_BUTTON(1)) {
        PiirraPikseli(naytto, x_hiiri, y_hiiri, 255, 0, 0);
    }
        SDL_Flip(naytto);
//Jos painetaan ESC niin poistutaan loopista.
        nappi = SDL_GetKeyState(NULL);
        if (nappi[SDLK_ESCAPE])
            break;
    }
    SDL_ShowCursor(1);

    SDL_FreeSurface(piirto);
    SDL_Quit();
    return 0;
}

Baglair [23.01.2006 16:25:54]

#

Tämän hiiren nappia painaessa piirrettävän pikselin tulisi jäädä näytölle. Sen takia en piirrä suoraan naytto-pintaan.

Metabolix [23.01.2006 21:28:02]

#

Piirrät apupinnalle ensin sen pikselin, sitten blittaat apupinnan ruudulle ja lopuksi piirrät suoraan ruudulle kursorin.

Baglair [24.01.2006 16:44:05]

#

Eipä toiminu :/

ezuli [24.01.2006 16:57:39]

#

SDL_BlitSurface(naytto, NULL, piirto, NULL);

Eikös tuossa ole "naytto" ja "piirto" väärinpäin?

Baglair [24.01.2006 17:05:07]

#

No kyllähän se sille vaikuttaa, mutta ei toimi vieläkään vaikka korjasin tuon.

/*
	Tämän ohjelman idea on luoda hiiren kursorin paikalle rasti
	ja piirtää janaa leikkauspisteiden kohdalle hiiren vasenta
	nappia painettaessa.
*/
#include "omat_funktiot.h"
#define	RESOLUUTIO_X	1024
#define	RESOLUUTIO_Y	768
#define	BPP	8

int main(int argc, char *argv[])	{
	int x_hiiri, y_hiiri;
	int x_naytto, y_naytto;
	int hiiri_nappain;

	if(SDL_Init(SDL_INIT_VIDEO) < 0)	{
		return 0;
	}
//Pinnat:
	SDL_Surface *naytto;
	SDL_Surface *piirto;
	naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN);
	piirto = SDL_CreateRGBSurface(SDL_HWSURFACE, RESOLUUTIO_X, RESOLUUTIO_Y, BPP, 0, 0, 0, 0);
//Kursori piiloon
	SDL_ShowCursor(0);
//Näppäin
	SDL_Event tapahtuma;
	Uint8 *nappi;
	for(;;)	{
		SDL_PollEvent(&tapahtuma);
		hiiri_nappain = SDL_GetMouseState(&x_hiiri, &y_hiiri);
//Jos hiiren vasen nappi pojassa, sytytä punainen pikseli leikkauspisteen kohdalle.
		if(hiiri_nappain & SDL_BUTTON(1)) {
			PiirraPikseli(piirto, x_hiiri, y_hiiri, 0, 255, 0);
		}
		SDL_BlitSurface(piirto, NULL, naytto, NULL);

		for(x_naytto = 0; x_naytto < RESOLUUTIO_X; ++x_naytto)	{
			PiirraPikseli(naytto, x_naytto, y_hiiri, 0, 255, 0);
		}
		for(y_naytto = 0; y_naytto < RESOLUUTIO_Y; ++y_naytto)	{
			PiirraPikseli(naytto, x_hiiri, y_naytto, 0, 255, 0);
		}
		SDL_Flip(naytto);
		//SDL_FillRect(naytto, NULL, 0x000000);
//Jos painetaan ESC niin poistutaan loopista.
		nappi = SDL_GetKeyState(NULL);
		if (nappi[SDLK_ESCAPE])
			break;
	}
	SDL_ShowCursor(1);

	SDL_FreeSurface(piirto);
	SDL_Quit();
	return 0;
}

Metabolix [24.01.2006 17:36:34]

#

Piirrät apupinnalle ensin sen pikselin, sitten blittaat apupinnan ruudulle ja lopuksi piirrät suoraan ruudulle kursorin.

Kannattaisi ihan paperilla miettiä rivi riviltä, mitä millekin pinnalle on kunkin toimituksen jälkeen piirretty.

ezuli [24.01.2006 17:44:12]

#

Selvisi: Vaihdo BPP arvoksi joku suurempi (16,24,32)

8 bittisenä on palettivärit:
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fCreateRGBSurface
"If bitsPerPixel is 8 an empty palette is allocated for the surface, otherwise a 'packed-pixel' SDL_PixelFormat is created using the [RGBA]mask's provided (see SDL_PixelFormat). The flags specifies the type of surface that should be created, it is an OR'd combination of the following possible values."

Baglair [24.01.2006 17:49:54]

#

Noni kiitos ezulille :) Ihmettelinkin jo kun mielestäni toimin Metabolixin neuvon mukaan.

ezuli [24.01.2006 17:52:01]

#

Yleensä vika on siellä mistä sitä ei ymmärrä etsiä.

Baglair [24.01.2006 17:58:22]

#

Näin on. Vielä muuten sellaista että tekeekö tuo BlitSurface jonkun ihme päivityksen, kun selviän ilman SDL_FillRectiä?

ezuli [24.01.2006 18:05:41]

#

Ei siinä mielessä mitä tarkoitat, mutta tuo "piirto" pintahan on muuten musta, mutta sisältää ne klikatut pisteet. Ja sehän läntätään aina aluksi "naytto":n päälle.

Baglair [24.01.2006 18:08:14]

#

Äh. Olipa huonosti selitetty. Tarkoitin siis, että esim BlitSurface(pinta, NULL, kohde, NULL) siirtää siis pinta -pinnan kohde -pintaan ja kopioi siis itsensä kohde -pintaan pyyhkien entisen tiedot pois sieltä

ezuli [24.01.2006 18:25:04]

#

Ei se pyyhi, vaan tässä tapauksessa "piirto" sattuu peittämään koko "naytto"-pinnan alleen.

Baglair [24.01.2006 18:28:38]

#

No nyt selkis. Kiitoksia

Metabolix [24.01.2006 19:03:07]

#

Eikös tuolla pitäisi olla vielä SDL_DOUBLEBUFFER-flagi tjsp, kun kerran SDL_Flip on käytössä?

tgunner [25.01.2006 12:21:32]

#

Jos käyttää tuota doublebuffia niin kyllä silloin pitää olla SDL_Flip.

rndprogy [25.01.2006 12:31:13]

#

Itse olen käyttänyt SDL_flippiä ilman SDL_DOUBLEBUFFER-flagia. Mutta jos flippataan tietty recti surfacella niin silloin on käytössä SDL_DOUBLEBUFFER.


Sivun alkuun

Vastaus

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

Tietoa sivustosta