Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: SDL ja pikselin piirto (C++)?

Paulus M [22.07.2008 23:56:12]

#

Hain netistä tällaisen esimerkin ja käytän sitä jo sovellettuna omassa koodissani, mutta heräsi vielä yksi kysymys pikselin piirtämisestä:
(kysymys löytyy koodin ala-osasta.)

void setPixel(SDL_Surface *screen, int x, int y, Uint8 r, Uint8 g, Uint8 b) {
	Uint8 *ubuff8;
	Uint16 *ubuff16;
	Uint32 *ubuff32;
	Uint32 color;
	char c1, c2, c3;

	// Lock the screen, if needed
	if(SDL_MUSTLOCK(screen) < 0 && SDL_LockSurface(screen) < 0) return;

	// set color
  	color = SDL_MapRGB( screen->format, r, g, b );

	// How we draw the pixel depends on the bitdepth
	switch(screen->format->BytesPerPixel) {
	case 1:
                 //tässä oli koodia, mutta poistin sen selkeyden vuoksi.
		break;
	case 2:
                 //tässä oli koodia, mutta poistin sen selkeyden vuoksi.
		break;
	case 3:
                 //tässä oli koodia, mutta poistin sen selkeyden vuoksi.
		break;

	case 4:
		ubuff8 = (Uint8*) screen->pixels;   //miksi myös tämä muuttuja?
		ubuff8 += (y*screen->pitch) + (x*4);
		ubuff32 = (Uint32*)ubuff8;
		*ubuff32 = 0x444444; //poistin myös tuon värin säädön selkeyden
                                     //vuoksi.


                //KYSYMYS kuuluu: miksi pitää määritellä tuollainen
                // "välittäjä" muuttuja ubuff8 ja miksi tämä ei toimi:

                //Uint32* pikselit;
                //pikselit = (Uint32*) screen->pixels;
                //pikselit += (y*screen->pitch) + x;
                //*pikselit = 0x444444;
		break;

	default:
      fprintf(stderr, "Error: Unknown bitdepth!\n");
    }

	// Unlock the screen if needed
	if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
}

tässä vielä suora linkki sivuille, jos haluat käydä katsomassa koko koodia: http://ubuntuforums.org/showthread.php?t=70426

vidar [23.07.2008 00:14:22]

#

Paulus M kirjoitti:

//KYSYMYS kuuluu: miksi pitää määritellä tuollainen
// "välittäjä" muuttuja ubuff8 ja miksi tämä ei toimi:

//Uint32* pikselit;
//pikselit = (Uint32*) screen->pixels;
//pikselit += (y*screen->pitch) + x;
//*pikselit = 0x444444;

pitch taisi palauttaa tavuja, eli kahdeksan bitin pätkiä. Jos Uint32*:sta viedään pitchin verran eteenpäin, se hyppää yli tarkoitetun kohdan. screen->w taas palauttaa pikseleitä, joten sillä pitäisi toimia.

Paulus M [23.07.2008 00:17:05]

#

Kiitti tiedosta! kylläpäs täytyy olla hyvä muisti jätkällä.

Paulus M [23.07.2008 10:13:21]

#

Kysyn tähän alle vielä nopee yhden pikku kysymyksen:

Miksi kääntäjä heittää tämän errorin:

C:\Ckieli\Dev-Cpp\omat projektit\Makefile.win [Build Error]
No rule to make target `naytto.o'. Stop.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <windows.h>



class naytto
{


 public:
 {
//PiirraNaytto():
//VAROITUS:
//leveys ja korkeus koordinaatit täytyvät olla samoja, mitä resoluutio.
//
  void naytto(){}


  void piirraNaytto(SDL_Surface *screen, Uint32 *naytto32, int leveys, int korkeus){
     if(SDL_MUSTLOCK(screen) < 0 && SDL_LockSurface(screen) < 0) return;

      Uint8 *pmuuttuja8;
      Uint32 *ppikseli32;

      pmuuttuja8 = (Uint8*)screen->pixels;
      ppikseli32 = (Uint32*)pmuuttuja8;
      for(int i =0;i<leveys*korkeus;i++){
            *(ppikseli32 + i) = *(naytto32+i);
      }

	if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);


 }
}

ps. onko olemassa vielä mircissä jotain ohjelmointiputka kanavaa, joissa vois kysellä tällaisia pikku juttuja?

Metabolix [23.07.2008 10:24:14]

#

Ainakaan publicin jälkeen ei kuulu aaltosulkuja eikä muodostimen (naytto-"funktio") tyyppi ole void, vaan muodostin on tyypitön.

class naytto {
  public:
    // Ei aaltosulkua "{"
    naytto() {}
    void piirra() {
      if (a) {
        b();
      }
    } // Ei puolipistettä
    void ulkoinen_funktio(); // Puolipiste
}; // Puolipiste luokan loppuun

Paulus M kirjoitti:

No rule to make target `naytto.o'. Stop.

Kun kerran kyseessä on IDE, joka käyttää Makefilejä omalla logiikallaan, ei voi suoraan sanoa kuin sen, että jossain on ilmeisesti vikaa. Katselepa tarkemmin, josko laatikossa olisi muitakin virheilmoituksia (kuten noista yllä korjaamistani asioista).

Makefilejä oikein käytettäessä tuo tarkoittaisi, että jossain kohti vaaditaan naytto.o-tiedostoa mutta missään ei kerrota, miten se luodaan (yleensä kääntämällä esimerkiksi naytto.cpp).

Paulus M kirjoitti:

ps. onko olemassa vielä mircissä jotain ohjelmointiputka kanavaa, joissa vois kysellä tällaisia pikku juttuja?

mIRCissä ei ole yhtäkään kanavaa. (Lue Wikipediasta artikkeli IRC, mm. kohta Verkot, tai tutustu IRC-Gallerian IRC-oppaaseen.) #ohjelmointiputka@IRCnet, tervetuloa.

Paulus M [23.07.2008 11:00:17]

#

Kiitti vastauksista! Sun vinkistä oppia ottaen testasin tallentaa tuon nautto.h, niin homma toimi. Anteeksi näin aloittelija virheet, mutta kun on pitkä aika siitä kun käytin C++:ssaa.

Täytyypä käydä katsomassa tuota IRC gallerian ircciä, niin ei tartte aina tehdä isoja aloituksia pikku virheistä. Mulle on ollut mielettömän paljon apua teistä "ammatti" ohjelmoijista, sillä joskus kun yrittää fiksaa ite jotain ongelmaa, niin saattaa mennä monta päivää virheen selvittämisessä, sen sijaan vastaus tulee teiltä melkein kuin tykin suusta.

Vastaus

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

Tietoa sivustosta