Aloitin eilen C:n opiskelun ja olen saanut aikaiseksi:
#include <stdio.h> int main(void) { int valikko; system("CLS"); printf (" ______________________________\n"); printf ("| Laskin |\n"); printf ("| |\n"); printf ("| Plus = 1 |\n"); printf ("| Miinus = 2 |\n"); printf ("| Kerto = 3 |\n"); printf ("| Jako = 4 |\n"); printf ("| Lopeta = 5 |\n"); printf ("| Valitse vaihtoehto |\n"); printf ("|______________________________|\n"); gets (valikko); if (valikko == 1) printf("plus."); else if (valikko == 2) printf("miinus."); else if (valikko == 3) printf("kerto."); else if (valikko == 4) printf("jako."); else if (valikko == 5) printf("lopeta."); else printf("Erroor."); return 0; }
mutta hän heittää erroria >.<
Ja sit jos joku tietää missä on C:n grafiikkaopas netissä ni voisko kertoa? 8D
Sä luet merkkijonon inttiin. Olisi fiksumpaa tehdä näin:
scanf("%i", &valikko);
ja siitä sitten.
Kiitti :)
Ja "grafiikkaoppaana" voi ihmetellä vaikka tuota Oppaat-osiosta löytyvää Heikin SDL-opasta.
No muuten hyvä mut ei toimi... SDL.dll tai mikälie puuttuu ja tässä mitään muutakaan mil vois grafiikkaa tehä? jos olis nyt vaik jotai jol vois piirtää: viivan, ympyrän, pisteen ja vaihtaa tekstin värin...
No hanki se SDL.dll. Minusta SDL on paras grafiikkakirjasto C:lle, ja kyllä sillä voi piirrellä viivoja, ympyröitä ja pisteitä. Toinen olis kans Allegro tai sitten vanha kunnon OpenGL.
TGunner: Mitäs teen tolle hemmetin ilmotukselle "SDL.dll puuttuu"? ja mistäs sen Allergon saa??
Edit: Tarkalleen se ilmoitus on: "Sovelluksen käynnistäminen ei onnistu, koska SDL.dll ei löytynyt. Sovelluksen uudelleenasentaminen saattaa korjata ongelman."
Etsi se sdl.dll libsdl:n sivuilta (runtime-library). Viivoja ja kavereita voi piirrellä sdl-gfx-kirjastolla, jonka saa kans sieltä sivuilta kai.
äh, etana :(
lainaus:
Dev-C++:aan asennus
Dev-C++:aan asennus on todella helppoa! Sinun tarvitsee vain ladata SDL:n DevPack ja asentaa se. Asennus hoituu kaksoisnäpäyttämällä lataamaasi pakettia ja painelemalla nextiä.
Kun luot uuden projektin, valitse graphics-välilehden alta SDL-ohjelma, jolloin linkkerille annetaan käännettäessä oikeat asetukset (toinen vaihtoehto on lisätä käsin linkkeriasetuksiin -lSDL ja -lSDLmain
Asennus ilman DevPackia onnistuu myös. Ohjeet tähän Aruviel:in kommentissa alhaalla. Kiitoksia hänelle.
Ton ohjeen mukaan oon asentanu ja ei pelitä...
Edit: Tänks sooda nyt toimii <3
Mut se menee ehkä väärään hakemistoon, tai et oo lisänny linkkerille libbiä tai et oo ehkä ottanu DLL:ää huomioon. SDL:n polku voi pahimmillaan olla SDL/SDL(versionumero)/SDL.h.
EDIT: Onko sulla DevCpp? Siellä on eri ohjeet eri IDE:lle
Joo Dev-Cpp on ja se toimii kyl nyt. Viel kun tosta sais jotakin selvää ku ei tajuu tosta oppaasta >.< Jos joku viittis valaista asiaa?
Viittis, jos viittisit kertoa mikä siinä tarkalleen jäi epäselväksi.
Noo esim. jos nyt vaikka tulostus tohon ruutuu joka on tossa oppaan ekassa osassa? ja sit joku laatikon piirtäminen... (Onkohan taas liian vaikeeta aloittelijalle... ja siis tarkotan itteeni
Edit: Vai onko se niin että riviä:
naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN);
pitää ainakin alkuun muokata niiden parametrien mukaan siinä alhaalla?
Minkä tulostus, tekstin vai? Siihen tarvitsee erillistä kirjastoa, kuten vaikka sdlttf (tai sit tietty ite koodattu setti). Laatikoita voi piirrellä SDL_FillRectillä:
int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
eli esim. 20x20px musta (väri 0) loota, vasen ylänurkka kohdassa 10,10:
SDL_Rect r; r.x = 10; r.y = 10; r.w = 20; r.h = 20; SDL_FillRect(naytto, &r, 0);
Kivempaan piirtelyyn sitten vaikka se sdlgfx.
Mitä tarkoitat tuon rivin muokkaamisella?
en nyt tiiä mitä tein väärin... mut toi herjaa tosta
SDL_FillRect(screen, &r, 0);
rivistä... ja siis ton ylemmän kopioin siihen
int main(int argc, char *argv[]) {
jälkeen ja alempi tohon ennen riviä:
SDL_Delay(5000);
Laittaisitko koko koodin (jos se ei ole liian pitkä) ja myös kääntäjän antaman virheilmoituksen, niin olisi parempi kertoa missä vika.
#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[]) { // nyt meidän tulee alustaa SDL. Tämä onnistuu SDL_Init() funktiolla, jolle annetaan parametrina // tieto siitä, mitkä SDL:n osat alustetaan, tässä tapauksessa vain video-ominaisuudet if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // paluuarvon ollessa pienempi kuin 0, tapahtui virhe { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon return 0; // lopetetaan ohjelma } // SDL on nyt alustettu virheettömästi, seuraavaksi onkin aika vaihtaa resoluutiota // ensin on kuitenkin luotava pinta, joka kattaa näytön sisällön: SDL_Surface * naytto; // SDL_Surface on siis SDL:n oma tyyppi, jota käytetään eri pintoja varten, tästä lisää myöhemmin // sitten resoluution vaihtaminen. SDL_SetVideoMode-funktio vaihtaa resoluution // parametreina sille annetaan uusi resoluutio, värisyvyys (tässä 32-bittinen) ja sitten ohjausliput // tässä tapauksessa ohjausliput tarkoittavat, että pinta luodaan näytönohjaimen muistiin ja // ohjelma asetetaan kokoruututilaan (katso taulukko lopusta) naytto = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN); // peli tähän :D int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); SDL_Rect r; r.x = 10; r.y = 10; r.w = 20; r.h = 20; SDL_FillRect(screen, &r, 0); // ruudulle: // odotetaan 5 sekuntia SDL_Delay(5000); SDL_Quit(); // "suljetaan" SDL return 0; }
Otas toi kokonaan pois
int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
Eip auta
Koska tuplapuskurointi on käytössä puuttuu vielä SDL_Flip(screen);
ennen tuota SDL_Delay(5000);
riviä. SDL_Flip(screen);
siis päivittää puskurin sisällön näytölle.
Jos nyt oikein tajusin niin näin?
#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[]) { int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); // nyt meidän tulee alustaa SDL. Tämä onnistuu SDL_Init() funktiolla, jolle annetaan parametrina // tieto siitä, mitkä SDL:n osat alustetaan, tässä tapauksessa vain video-ominaisuudet if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // paluuarvon ollessa pienempi kuin 0, tapahtui virhe { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon return 0; // lopetetaan ohjelma } // SDL on nyt alustettu virheettömästi, seuraavaksi onkin aika vaihtaa resoluutiota // ensin on kuitenkin luotava pinta, joka kattaa näytön sisällön: SDL_Surface * naytto; // SDL_Surface on siis SDL:n oma tyyppi, jota käytetään eri pintoja varten, tästä lisää myöhemmin // sitten resoluution vaihtaminen. SDL_SetVideoMode-funktio vaihtaa resoluution // parametreina sille annetaan uusi resoluutio, värisyvyys (tässä 32-bittinen) ja sitten ohjausliput // tässä tapauksessa ohjausliput tarkoittavat, että pinta luodaan näytönohjaimen muistiin ja // ohjelma asetetaan kokoruututilaan (katso taulukko lopusta) naytto = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN); // peli tähän :D SDL_Rect r; r.x = 10; r.y = 10; r.w = 20; r.h = 20; SDL_FillRect(screen, &r, 0); SDL_Flip(screen); // ruudulle: // odotetaan 5 sekuntia SDL_Delay(5000); SDL_Quit(); // "suljetaan" SDL return 0; }
Mutta silti ei toimi :/
No nyt sulla on toi minkä käskin ottaa pois tolla mainin alussa. Usko ny ja ota se kokonaan pois vaan. Ja sit vaiha toi naytto pinnan nimeks screen.
Toi:
int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
Ei vaikuta mitenkään...
muutin kohdan:
SDL_Rect r; r.x = 10; r.y = 10; r.w = 20; r.h = 20; SDL_FillRect(screen, &r, 0); SDL_Flip(screen);
Muotoon:
SDL_Rect r; r.x = 10; r.y = 10; r.w = 20; r.h = 20; SDL_FillRect(naytto, &r, 0); SDL_Flip(naytto);
mutta näyttö pysyy mustana...
Nyt ongelma on että piirrät mustaa laatikko mustalle taustalle joten toi FillRectin vikaks parametriks voi laittaa vaikka 255000255 nii tulee valeen sininen.
SDL_FillRect(naytto, &r, 255000255);
Understood?
Haahei okei eli siis jos laitan 000000000 niin musta on valkonen ja niin edelleen? nyt taitaa vihdoin selvitä tämä grafiikka sotku :D mut millä värjään laatikon?
SDL_FillRect(r, &naytto, 255000255);
?
000000000 = musta
255255255 = valkoinen
Toi tossa FillRect:ssa just muuttaa laatikon väriä. Jos haluut muuttaa taustan väriä niin lisää toinen FillRecti enne tota jo olevaa:
SDL_FillRect(naytto, 0, 0);
Huomasin just mut kiitti silti :) entäs tohon kirjottaminen? iiden luulis riittävän tälle päivälle ku kohta pitää mennä varmaan vähitellen nukkumaan ku peruskoulun viimenen vuosi pitää ottaa kunnolla...
Kirjottaminen onnistuu helpoiten SDL_ttf lisä kirjaston avulla.
http://www.libsdl.org/projects/SDL_ttf/
Helpoiten pääset käyntiin ku tutkit tota:
http://jcatki.no-ip.org/SDL_ttf/SDL_ttf_frame.html
ftp://Ohjelmointiputka@62.241.213.3:59990/Peli/
Lahha, mitähän kummaa sinä yrität neuvoa niistä väreistä? Eivät RGB-koodit ihan noin toimi. :/ Että tuosta nyt sattuu tulemaan vaaleansininen, se on ihan hyvää tuuria vain. Heksaluvuilla voi yrittää saada järkeä tuohon hommaan. SDL:n kanssa ehkä kannattaisi ottaa suosiolla ne SDL:n omat värit:
vari = SDL_MapRGB(piirtopinta->format, punainen, vihrea, sininen);
(parametrien arvot väliltä [0, 255])
En kyllä tosta SDL_ttf kirjastosta tajunnu mitään :/ Selventäsiskö joku asiaa?
Otapa nyt ihan askel kerrallaan. Olit alkeita opettelemassa vasta, joten opettele ne alkeet, ennen kuin yrität muuta tehdäkään. Ei tuollaisella meiningillä pitkälle pötkitä, tyvestä puuhun kiivetään.
Samaa mieltä Metabolixin kanssa, mutta yritämpä selventää asiaa silti.
Eka täytyy se alustaa.
if(TTF_Init()==-1) { fprintf(stderr ,"TTF_Init: %s\n", TTF_GetError()); return 2; }
Sitten avataan fontti tiedosto.
TTF_Font *font; //tehää fontille osoitin font=TTF_OpenFont("Fontti tiedoston nimi.ttf", 16); //numero meinaa fontin kokoo if(!font) { printf(stderr ,"TTF_OpenFont: %s\n", TTF_GetError()); return 2; }
Sit tarvitaan pinta jolle teksti piirretään ja SDL_Color juttu johon pistetään tekstin väri . Ja sitten renderöidään teksti pinnalle.
SDL_Surface * teksti; SDL_Color vari={0,0,0}; teksti=TTF_RenderText_Solid(font, "Hello World!", vari);
Ja sit vaan piirretään teksti pinta ihan normaalisti.
ja lopuks suljetaan fontti ja vapautetaan teksti pinta
TTF_CloseFont(font); font=NULL; SDL_FreeSurface(teksti);
Ei tästä kyllä kukaan mitään tajua mutta yritimpä ainakin.
Ja lisäyksenä Lahhan esimerkkiin mainittakoon, että niin fontti kuin tekstipintakin täytyy tuhota lopuksi, ettei ohjelmaan jää muistivuotoa.
TTF_CloseFont(font); SDL_FreeSurface(teksti);
totaa ehkä mä harjottelen viälä vähän yksinkertasempia juttuja :) mutta kiitos paljon avusta kuitenkin
Aihe on jo aika vanha, joten et voi enää vastata siihen.