Tervehdys olen aloitellut tekemään SDL kirjastolla jutskia koska se on aikas helpon näköista, kopsasin koodin suoraan Heikin SDL tutoriaalista katsokaapas
#include <SDL/SDL.h> // sisällytetään SDL:n otsikkotiedostot #pragma comment(lib, "SDLmain.lib") // otetaan SDL:n LIB-tiedostot mukaan. Kun nämä rivit ovat ohjelman alussa, #pragma comment(lib, "SDL.lib") // sinun ei tarvitse lisätä LIB-tiedostoja "käsin" // #pragma-rivit toimivat VAIN Visual c++:alla! gcc:llä parametri -lSDL ajaa saman asian int main(int argc, char *argv[]) { // funktio piirtää parametrina annetun kuvan ruudulle (toinen parametri) tiettyyn kohtaan (3. ja 4. parametri) void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y) { SDL_Rect alue; // mille alueellä näyttöä kuva piirretään alue.x = x; // koordinaatit alue.y = y; SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto } SDL_Flip(naytto); SDL_Surface *naytto; SDL_Surface *kuva; naytto = SDL_SetVideoMode(1024, 768, 30, SDL_HWSURFACE|SDL_DOUBLEBUF); kuva=SDL_LoadBMP("kuva.bmp"); // ruudulle: PiirraKuva(kuva, naytto, 50, 50); }
Hops yksi virhe tulee
10 C:\Documents and Settings\JNE\JNE\JNE...\main.cpp a function-definition is not allowed here before '{' token
Kun kumitan tuon { merkin riviltä 10 se valittaa seuraavaa...
10 C:\Documents and Settings\päläpälä\main.cpp expected init-declarator before "SDL_Rect"
Mikä ihme on vikana, suoraan kopsattu tutosta eikä toemi???
Funktiota ei kuulu määritellä main-funktion sisällä, joten siirräpä PiirraKuva -funktio sisältöineen, siis sisältö on { ja }:n välissä, mainin yläpuolelle (tai alapuolelle, kunhan esittelet ensin funktion (opetelepa c:n perusteet?)). Lisäksi '{'-merkkiin ei tarvitse koskea.
Minkä ihmeen takia piirrakuva funktio on mainin sisällä?
Yrität määritellä PiirraKuva-funktiota main-funktion sisällä, mikä ei ole sallittua. Siirrä siis se mainin ulkopuolelle, niin pitäisi onnistua.
ps. Käytä seuraavalla kerralla koodic-tageja, niin tulee selventävä väritys mukaan.
muoks. Olipas vastausryntäys...
Kannattaa ehkä tutustua C-kielen alkeisiin, ennen kuin yrittää tehdä graafisia ohjelmia SDL:llä.
PiirraKuva-funktio on sinulla main-funktion sisällä, mutta C:ssä ei ole sisäkkäisiä funktioita. Helpointa on siirtää main-funktion esittely PiirraKuva-funktion jälkeen.
Sen jälkeen voitkin ihmetellä, miksei koodi tee sitä, mitä todennäköisesti odotat sen tekevän.
Suosittelen opettelemaan ensin asiat Ohjelmointiputkan C-opassarjasta. SDL:n käyttäminen tuskin tulee olemaan helppoa, jos nuo eivät ole hallussa.
Tein uudestaan ja kokonaan itse peliini koodin ja nyt se toimii kuin unelma, ukko liikkuu näppäimistä ja piirtää kuvan oikealle kohdalle, mutta yksi bugi vielä joka on ilmeisesti helppo korjata...
Ukko jättää vanaa, eli oman spriten kuvaa koko ajan jälkeensä, miten sen saisi korjattua että se ei jätä jälkeä?
nappi = SDL_GetKeyState(NULL); if ( nappi[SDLK_UP] ) { kuvay -= 1; } if ( nappi[SDLK_DOWN] ) { kuvay += 1; } if ( nappi[SDLK_LEFT] ) { kuvax -= 1; } if ( nappi[SDLK_RIGHT] ) { kuvax += 1; } PiirraKuva(ukko, naytto, kuvax, kuvay);
Jartsala kirjoitti:
Ukko jättää vanaa, eli oman spriten kuvaa koko ajan jälkeensä, miten sen saisi korjattua että se ei jätä jälkeä?
nappi = SDL_GetKeyState(NULL); if ( nappi[SDLK_UP] ) { kuvay -= 1; } if ( nappi[SDLK_DOWN] ) { kuvay += 1; } if ( nappi[SDLK_LEFT] ) { kuvax -= 1; } if ( nappi[SDLK_RIGHT] ) { kuvax += 1; } PiirraKuva(ukko, naytto, kuvax, kuvay);
Tuosta pätkästä vika ei löydy, mutta veikkaisin, että syy on siinä, että piirrät taustakuvan ainoastaan ennen pääsilmukkaa etkä silmukassa ollenkaan.
Laitappa sinne SDL_Flip:n jälkeen tuollainen: SDL_FillRect(naytto, NULL, NULL);
Se täyttää näytto pinnan mustalla ennenkuin alat piirtäämaan seuraava ruutua.
Jou en piirtäny taustaa ollenkaan ^,^ ihmekkös, työ sanoitte että pelin tekeminen on vaikeaa minä sanon että pah helppoa kuin mikä olen oma oppisesti saanut valikon, ukon liikkumaan ja kaikkea muuta, nooh
nyt tässä ois yksi jutsku mitä en löytäny ees oppaasta
miten saa monta samaa muuttujaa kun joka seinän palaselle pitäs saada muuttuja kalikkax ja kalikkay, collsision checkkini toimii mutta vain yhden palikan kanssa, jos tekee toisen se menee läpi koska voi olla kerralaan vain yksi kalikkax ja kalikkay... Miten on?
///////määrittää vähä muuttujia :P int kalikkax, kalikkay; /////piirtääpi kalikoita PiirraKuva(kalikka, naytto, kalikkax = 96, kalikkay = 64); PiirraKuva(kalikka, naytto, kalikkax = 32, kalikkay = 32); /////tarkistaa onko yläpuolella palikkaa if ( nappi[SDLK_UP] ) { if(!(kalikkay == kuvay - 32 && kalikkax == kuvax)) { kuvay -= 32; SDL_Delay(100); } }
Eli homma pelaa ihan helvetin hyvin yhellä palikalla mutta jos on monta, ja kyllähän mää sen tajuankin miksi, mutta miten saa saman nimisiä muuttujia mutta kuitenkin eri siis juu nou?
Yksinkertainen vastaus ohjelmoinnin tässä vaiheessa on: taulukko. Eli yksittäisen muuttujan sijaan onkin taulukko arvoja, jolloin vertailu voidaan tehdä for-silmukn sisällä (tällöin vain palikkax[<silmukkamuuttuja>] korvaa palikkax:n vanhassa koodissa).
Käytin itse muinoin ~seuraavaa (pseudo):
int kalikkax[Max_Palikka], kalikkay[Max_Palikka]; ... tormays = 0; for(a = 0; a < Max_Palikka; a++){ if(hahmo törmää palikkaan <a>){tormays = 1; break;} } if(tormays){ Aih. }
Taulukoista löytyy lisätietoa oppaasta. Sitten kun vähän laajemmin alkaa pelejä tekemään niin voi miettiä hivene monimuotoisempia ratkaisuja >_>
Ömm en oikein saanu tolkku koodipätkästäsi XD ähähäh!
mitä laitan tuon Max_kalikan tilalle kun se valittaa siitä?
Max_Kalikka on vakio, joka kuvaa kalikoiden määrää kentällä. Voi asettaa sen itse tavalla/toisella; tässä vaiheessa varmaan yksinkertaisin #define-lauseella.
#define Max_Kalikka 100
Ja tietenkin, arvot kannattaa muistaa alustaa.
Editios: tässä vähäsen valmiimpaa >_>
#define Max_Palikka 100 ... int palikkax[Max_Palikka], palikkay[Max_Palikka]; /* Alustus */ palikkax[0] = 32; palikkay[0] = 32; palikkax[1] = 64; palikkay[1] = 32; palikkax[2] = 96; palikkay[2] = 32; ... jne /* Piirto - annetaan muuttujina taulukon arvoja */ for(a = 0; a < Max_palikka; a++){ Piirrakuva(kalikka, naytto, kalikkax[a], kalikkay[a]); } /* Törmäystarkistus - missä vaan */ for(a = 0; a < Max_palikka; a++){ if(kalikkax[a] == kuvax && kalikkay[a] == kuvay){ /* Törmäys tapahtui */ <koodi joka palauttaa kuvan takaisin> SDL_Delay(100); break; /* Turha tarkistaa enää muita palikoita */ } }
Mitäs tämä kääntäjäni sekoilee, mulla on kyllä tuo Define max palikka ylähäällä mutta se kysyy silti että "watteffak is that max palikka??!? ÖYH?" mitähä tämä nyt meinaa?
Edit: Ahh tuossa Definessäsi oli Max_Palikka ja koodissa Max_palikka, pienellä peellä... korjasin ni se valitta joka kohdassa jossa on [] merkit tätä
"invalid types `int[int]' for array subscript"
Muistitko määritellä palikkax:n ja palikkay:n taulukoina? Tuo virheilmoitus tulee, jos yrittää viitata ei-taulukkoon taulukkona.
En mutta muokkasin sen eikä tomi vieläkään
Mitäs kääntäjä valittaa?
int palikkax[Max_Palikka], palikkay[Max_Palikka] = { {1, 2, 3}, {4, 5, 6} };
Tuossa koodi ja tässä valitus
brace-enclosed initializer used to initialize `int'
int palikkax[3] = {1, 2, 3}, palikkay[3] = {4, 5, 6};
Voisit yrittää selvittää nuita ongelmia itsekin, etkä tulla kertomaan jokaisesta ongelmasta tänne.
Juuh ei toimi äh antaa olla, en tee koko collision chekkiä jos se kerta ei ole mahdollista, antaapi mennä kalikoista läpi... :P
-----------------------------------------------------------------
Uutta kysymystä kehiin vaan, mikä on violetin väri koodi transparenttiin? olen kokeillut 256,0,256 mutta ei toimi, mikä hiivatti se olikaan?
Jartsala kirjoitti:
Uutta kysymystä kehiin vaan, mikä on violetin väri koodi transparenttiin? olen kokeillut 256,0,256 mutta ei toimi, mikä hiivatti se olikaan?
Jos vaikka kokeilisit arvoa 255, 0, 255. 256 lienee tietokoneen mielessä sama kuin 0, koska sen 8 alinta bittiä ovat nollia (riippuen tietenkin siitä mihin noita arvoja työnnät).
Ainiin ja mitenkäs SDL:llä piirretään tekstiä, kuulenko valitusta? häh? kyllä minä etin googlella mutta siellä tuli vastaan sellanen missä oli aivan liikaa koodia sellaiset 60 riviä tekstin piirtämiseen, on oltava parempi keino!
SDL_ttf -kirjasto on näppärä. http://www.libsdl.org/projects/SDL_ttf/
while(taphtuma == 1) {
//menussa }
while(tapahtuma == 2) {
//pelissä }
while(tapahtuma == 3) {
//kaupassa
kun nappia painaa tapahtuma = 1
}
Kiitos katson kohta tuon teksti jutskan mutta nyt tuli häikkää jonka ei pitäisi olla ihan omalla aivoilla ajateltuna hm?
Eli katsokaa tuota koodia, menu toimii hyvin sillä pääsee peliin ja kauppaan mutta tuossa kaupassa kun painaa takaisin tapahtuman pitäisi olla 1 eli mennä menuun mutta se menee pimeään ruutuun ja muutaman sekan päästä sammuu peli??
while(); while(); while(); jonon sijasta parempi idea pääloopiksi on seuraavanlainen:
while(peliKaynnissa) { switch(tapahtuma) { case 1: /* tee menujutut */ break; case 2: /* tee pelijutut */ break; case 3: /* tee kauppajutut */ break; } }
Tiedätkös, olen aina miettinyt että mistä ihmeestä se tietää millon se ottaa minkäkin casen käyttöön?? Siis olen aina miettinyt tuota ja olen saanu käsityksen että jos kirjoittaa numeron 1 ni case 1 jne. vai?
Case valitaan sen mukaan, mikä switchille annetun lausekkeen (tässä: tapahtuma) arvo sattuu olemaan.
Jou nyt se on toimimassa, sitten taas seuraava kyssäri
if ( nappi[SDLK_UP] ) { kuvay -= 32; SDL_Delay(100); comdo == 1; } if ( nappi[SDLK_DOWN] ) { kuvay += 32; SDL_Delay(100); comdo == 1; } if ( nappi[SDLK_LEFT] ) { kuvax -= 32; SDL_Delay(100); comdo == 1; } if ( nappi[SDLK_RIGHT] ) { kuvax += 32; SDL_Delay(100); comdo == 1; } if ( nappi[SDLK_ESCAPE] ) { porkan = 0; } while( comdo == 1){ if ( gla1x <= kuvax ) { gla1x += 32; comdo = 0; } if ( gla1x >= kuvax ) { gla1x -= 32; comdo = 0; } if ( gla1y <= kuvay ) { gla1y -= 32; comdo = 0; } if ( gla1y >= kuvay ) { gla1y += 32; comdo = 0; } }
Elkää valittako että noin ei saa tehdä sillä olen täysi noobi ja pähkäilin ja tein sen noin ihan itse... Eli tuo on pelaajan liikuttelu(toimii) ja sen alla vihollisen tekoäly, eli homma toimii niin että kun pelaaja painaa nappia ComDo on 1 ja jos ComDo on 1 gladiaattori katsoo onko pelaajan x pienempi vai isompi JNE, JNE, jostain syystä tuo vastustaja vain kököttää paikoillaan eikä tee mitään vaikka järjen mukaan tuon pitäisi pelittää?
kuvax, pelaajan X
kuvay, pelaajan Y
gla1x, vihun X
gla1y, vihun Y
ja peli piirtää vihun kohtaan gla1x ja gla1y, mikä mättää??
(Mod. Edit. Opettele jo vähitellen käyttämään C-koodissa koodic-tagia. Siistimpi sisennyskään ei olisi pahasta...)
Oisko vika tuolla nappien lukemisessa missä asetetaan comdo, näköjään sinne on lipsahtanut vertailuoperaattori (==) sijoitus operaattorin (=) sijaan.
Sieltähän se vika löytyi, kiitos kaikille auttajille, ei kysyttävää tällä hetkellä...
Ok nyt on kysyttävää tuosta Tekstin piirtämisestä näytölle SDL tilassa, eli kertokaa SDLttf jutusta enemmän koska itse en tajunnut siitä p*s*an vertaa, eli seuraavat haluan tietää että pääsen alkuun
1.Mihin ängen tuon DLL tiedoston jonka latasin sen sivulta?
2.Mitä kirjoitan incluudiin lisää?
3.Mitä kirjoitan että se tulostaa tekstiä?
Olen etsinyt mutta niissä sanotaan vaan että joo ota SDL ttf se on nii hyvä jee jee...
1. Sinne missä on muutkin SDL:n DLL:t.
2. #include <SDL/sdl_ttf.h>
3.
TTF_Init(); //alustetaan TTF_Font *font;//ladataan fontti font=TTF_OpenFont("Arial.ttf", 12);//tässä esimerkissä fontti tiedoston pitää olla ohjelman kansiossa SDL_Color *vari = new SDL_Color;//tekstin väri vari->r=0; vari->b=0; vari->g=0; vari->unused=0; SDL_Surface * teksti;//pinta tekstille teksti = TTF_RenderUTF8_Blended(font, "Hello world!", *vari);//laitetaan teksti pinalla //tässä välissä pinta piirretään ihan normaalisti SDL_FreeSurface(teksti);//muista vapauttaa pinta ennen uutta piirtokertaa //lopuksi delete vari; TTF_CloseFont(font); TTF_Quit();
!Toivottavasti sain tällä kertaa esimerkki koodini oikein.
Perse missä ihmeessä nuo DLL tiedostot sijaitsevat etin tunnin niitä etsiohjelmalla ja selailemalla Dev-C++ kansiota, enkä löytänyt, minua ottaa päähän tollanen neuvonta että sanotaan vaan että "joo laita sinne missä on muutkin" ja sen sellaiset...
Laita se DLL-tiedosto vaikka samaan kansioon ohjelmasi kanssa.
no such file in directory
#include <SDL_ttf.h>
SLD_ttf.h tiedosto on kansiossa jossa pelini...
Arr, kantsisko ton SDL_ttf:n olla siellä, mistä sun kääntäjä ymmärtää hakea sen (\include\)?
Juu laitoin sinne incluudi kansioon ja no such file in directory, aika paska tuo SDL_ttf...
Ja vika ei mitenkään voisi olla käyttäjässä?
Jartsala kirjoitti:
no such file in directory
#include <SDL_ttf.h>SLD_ttf.h tiedosto on kansiossa jossa pelini...
Tuossa tapauksessa pitää käyttää lainausmerkkejä niin kääntäjä ymmärtää etsiä tuota tiedostoa projekti hakemistosta.
#include "SDL_ttf.h"
Nunniin nyt se löytää näemmä tuon SDL_ttf.h tiedoston mutta valittaa vielä seuraavista
[Linker Error] undefined reference to `TTF_Init'
[Linker Error] undefined reference to `TTF_OpenFont'
[Linker Error] undefined reference to `TTF_RenderUTF8_Blended'
[Linker Error] undefined reference to `TTF_CloseFont'
[Linker Error] undefined reference to `TTF_Quit'
Mistäs mää nuo tiedostot löydän...
Olethan laittanut
#pragma comment(lib, "SDL_ttf.lib")
Olen alittanut mutta samaa valittaa silti...?
1) Dev-C++ käyttää (ainakin oletuksena) MinGW-kääntäjää, joka on GCC:n Windows-porttaus. Tästä syystä se muistikuvieni mukaan käyttää Linuxin .a -päätteistä kirjastotiedostomuotoa eikä Windowsin .lib -muotoa.
2) Kuten alkuperäisessä koodissakin kerrotaan, pragma-komennot eivät toimi Dev-C++:n / MingGW:n / GCC:n kanssa:
// #pragma-rivit toimivat VAIN Visual c++:alla! gcc:llä parametri -lSDL ajaa saman asian
Linkkeriparametrit täytyykin lisätä projektin asetuksiin eikä itse koodiin; Jostain sieltä projektin asetuksista pitäisi löytyä linkkeri-välilehti, jossa on tekstilaatikko, johon voi laittaa niitä parametreja. Siellä siis pitäisi olla jotain tyyliin:
-lSDL -lSDLmain -lSDL_ttf
Mutta tämähän sinun pitäisi jo tietääkin, jos kerran olet saanut ohjelman jossain välissä kääntymään SDL:n kanssa...
Kjeh kjeh nyt enää yksi error jäljellä.... cannot find ISDL_ttf RÄÄHÄHÄ!
Olihan minulla nuo lSDL ja lSDLmain mutta ei lSDL ttähvää... Elikäs mitenkäs nyt?
En jaksanut lukea koko threadia, :P mutta viisastelen silti että onko sulla libsdl_ttf.a, .la ja .so? (MinGW:n lib-kansiossa)
Opettele kirjoittamaan. -lSDL_ttf
ja I != l
.
Kirjasto kannattaa asentaa DevPakista, jos se vain suinkin on mahdollista, koska silloin tulevat varmasti oikeat tiedostot mukana.
Jotenkin väärä suunta aloittaa ohjelmointia taas, kun ei saa edes ohjelmaansa kääntymään. Alkeet ensin, ei tuosta noin tule mitään.
Saan kääntymään mutta kun tyrkytätte mulle näita paskoja kirjastoja ja toiseks, opettele kirjottamaan? hä? mitä helvettiä?
ja sitä edellinen viesti... ei ole...
Edit: Nonniin kiitoksia asensin Devpakin ja toimii, en ole kokeillut tekstin piirtämistä mutta ei ainaskaan erroreita pukkaa...
Jartsala kirjoitti:
työ sanoitte että pelin tekeminen on vaikeaa minä sanon että pah helppoa
Jartsala kirjoitti:
tyrkytätte mulle näita paskoja kirjastoja
Hyvä asenne. Alatko uskoa, että se on vaikeaa, ja ongelma ei ole kirjastoissa vaan siinä, ettet jaksa opetella, miten hommat toimii?
Jartsala kirjoitti:
opettele kirjottamaan? hä? mitä helvettiä?
Voitaisiin puhua yleisesti kieliasustasi, mutta tässä tapauksessa tarkoitettiin sitä, että kirjoitit -ISDLttf etkä -lSDLttf.
Arrrh, nykyään näitä uuskoodareita vaan pompsahtelee joka puolelta erilaisilla nimimerkeillä, mutta silti viesti maailmalle on aina sama. "Moi! Alotin koodaa just pari viikkoo sit. Voitteko lähettää mulle jotain pelien lähdekoodeja?"
Joku vois vaan pastea Jartsalalle sen ohjelmoinnin aloittamista käsittelevan oppaan täällä putkassa. :(
Ainakin motivoi auttamaan, kun palaute on tällaista:
SDL-opassarjan 1. osan kommentti by Jartsala kirjoitti:
Paska opas, ei toimi opettel ohjelmoimaa...
Ohjelmointia ei opi hetkessä. Oppiminen on kuitenkin mahdollista, kunhan käyttää hieman aikaa oppaiden lukemiseen ja ei lähde heti liikkeelle hankalista asioista; vaikka tuntuukin tylsältä tehdä niitä tekstipohjaisia "arvaa lukuni"-ohjelmia, on ohjelmoinnin perusteet osattava jossain määrin ennen kuin voi ryhtyä tekemään esimerkiksi graafisia pelejä.
Oppaiden lisäksi apua ongelmiin saa myös mm. näiltä foorumeilta. Muista kuitenkin, että et käsittääkseni maksa kenellekään putkan käyttäjälle siitä, että hän opettaisi sinulle asiat. Ei siis ainakaan minusta ole reilua odottaa asiallisia vastauksia henkilöiltä, joita juuri edellisessä viestissä haukkui ja joiden ohjeita ei kuitenkaan suostu noudattamaan.
Kannattaa lukaista Antin opas Ohjelmoijan ensiaskeleet.
Anteeksi hieman aiheen ohi mennyt avautuminen.
Rupesin opiskelemaan SDL:ää ja eksyin tälle threadille ihmettelemään. Kiitokset kaikille neuvojille, olen oppinut paljon tätä keskustelua seuraillessani. Mutta erityiset kiitokset keskustelun aloittajalle, olen saanut makeat naurut. Jatkan opiskelemista ja harjoittelemista. Pienenä vihjeenä Jartsalalle että parhaiten opit kun tahkot ja yrität ratkaista ongelmaa itse ja kahlaat oppaita ja keskustelupalstoja. Netti on tietoa pullollaan. Tie on kuoppainen ja raskas kulkea, mutta ei aina kannata mennä sieltä missä aita on matalin.
^Olen aivan samaa mieltä. Alkeet ON OSATTAVA ennenkuin käy muuta väkertämään. Tämän topicin viesteistä näkyy selvästi, että kyselijä ei ole koskaan edes alkeita vilkaissutkaan. Lisäksi tuo kirjoitusasu on niin ärsyttävää, että ihmettelen suuresti, että näinkin paljon on apua tullut..
Aihe on jo aika vanha, joten et voi enää vastata siihen.