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
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.
Kiitti tiedosta! kylläpäs täytyy olla hyvä muisti jätkällä.
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?
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 loppuunPaulus 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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.