Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Pieni koodi... Suuret ongelmat

Sivun loppuun

Jorgga [05.10.2006 16:17:51]

#

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

kayttaja-4976 [05.10.2006 16:24:56]

#

Sä luet merkkijonon inttiin. Olisi fiksumpaa tehdä näin:

scanf("%i", &valikko);

ja siitä sitten.

Jorgga [05.10.2006 16:30:27]

#

Kiitti :)

Metabolix [05.10.2006 17:23:27]

#

Ja "grafiikkaoppaana" voi ihmetellä vaikka tuota Oppaat-osiosta löytyvää Heikin SDL-opasta.

Jorgga [05.10.2006 19:21:20]

#

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...

tgunner [05.10.2006 20:04:46]

#

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.

Jorgga [05.10.2006 20:42:29]

#

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."

kayttaja-4976 [05.10.2006 20:48:10]

#

RTFM!!

Siellä lukee kaikki tarvittava alkaen nollasta päättyen ykköseen.

OpenGL <3

sooda [05.10.2006 20:48:29]

#

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 :(

Jorgga [05.10.2006 20:59:15]

#

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

kayttaja-4976 [05.10.2006 21:03:45]

#

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

Jorgga [05.10.2006 21:58:35]

#

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?

sooda [05.10.2006 22:03:25]

#

Viittis, jos viittisit kertoa mikä siinä tarkalleen jäi epäselväksi.

Jorgga [05.10.2006 22:04:40]

#

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?

sooda [05.10.2006 22:09:34]

#

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?

Jorgga [05.10.2006 22:15:37]

#

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);

Heikki [05.10.2006 22:18:05]

#

Laittaisitko koko koodin (jos se ei ole liian pitkä) ja myös kääntäjän antaman virheilmoituksen, niin olisi parempi kertoa missä vika.

Jorgga [05.10.2006 22:25:24]

#

#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;
}

Lahha [05.10.2006 22:45:36]

#

Otas toi kokonaan pois

int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);

Jorgga [05.10.2006 22:49:48]

#

Eip auta

zacura [05.10.2006 23:01:54]

#

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.

Jorgga [05.10.2006 23:06:43]

#

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 :/

Lahha [05.10.2006 23:10:23]

#

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.

Jorgga [05.10.2006 23:17:22]

#

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...

Lahha [05.10.2006 23:19:59]

#

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?

Jorgga [05.10.2006 23:24:28]

#

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);

?

Lahha [05.10.2006 23:28:23]

#

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);

Jorgga [05.10.2006 23:33:16]

#

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...

Lahha [05.10.2006 23:40:14]

#

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/Sudoku.cpp Tossa hiukan keskeneräisen sudoku pelin koodi jossa on käytetty tota SDL_ttf:ää

Metabolix [06.10.2006 05:49:06]

#

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])

Jorgga [06.10.2006 19:55:58]

#

En kyllä tosta SDL_ttf kirjastosta tajunnu mitään :/ Selventäsiskö joku asiaa?

Metabolix [06.10.2006 20:18:42]

#

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.

Lahha [06.10.2006 20:50:21]

#

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.

Metabolix [06.10.2006 21:03:45]

#

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);

Jorgga [06.10.2006 23:02:34]

#

totaa ehkä mä harjottelen viälä vähän yksinkertasempia juttuja :) mutta kiitos paljon avusta kuitenkin


Sivun alkuun

Vastaus

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

Tietoa sivustosta