Onko liaan vaikeaa opettaa tällaiselle aloittelijalle kuten minä, ohjelman tekoa joka avautuisi ikkunaan jossa on jokin kuva. Eli ohjelmaa suorittaessa se ei avaudu komentorivillä vaan tekee näytölle erikseen ikkunan jonka voi sulkea x - merkkiä painamalla hiirellä tai jollain näppäimellä näppäimistältä. Ja tuossa ikkunassa on jokin ohjelmaan laitettu valokuva tai pantilla piirretty kuva. Voisiko joku neuvoa, kun en löytäny asiasta mitään opasta.
Tähän tarkoitukseen voi käyttää esim. SDL:ää.
En nyt ihan käsittänyt tätä SDL:ää. Latasin koneelle tuon Dev-Cpp:n SDL.dll tiedoston. No kun kävin katsomassa Dev-cpp kansiotani siellä oli kansio jossa oli tämä SDL.dll. Mutta miten sitä koodia alan väsätä että saisin yllämainitun asian onnistuneesti tehtyä. Kokeilen kääntää tämän oppaan koodia, mutta ei onnistunut vaan valitti virheistä.
https://www.ohjelmointiputka.net/oppaat/opas.
Kysyn, miksi kukaan ei ole laittanut Azure:lle kommentoituna standardi Windows-raamia, jossa olisi valmiina erillinen Windows-kontrolli, omat yksinkertaiset grafiikkafunktiot. Sellainen viimeisen päälle selkeä runko, joka sitten piirtäisi vaikka fraktaalin siihen ikkunaan.
Kysyn, onko se teiltä ystävät hyvät liikaa vaadittu?
Älä huoli Azure, kiire pukkaa päälle, mutta ainakin minä sitten jaksan sen rungon tehdä, jos näistä kukaan muu ei viitsi.
Kysyn, älkää aina tarjotko sitä SDL:ää joka paikkaan, kun pelkällä Windows raamilla saa paljon yksinkertaisemman ja opettavaisemman raamin.
Kysyn, miksi hemmetti ne Windows oppaat tekivät siitä salatiedettä. Ketä todella kiinnostaa, miten sen hemmetin windows-raami piti tehdä, kun se on sdandardi, joka pitää koodata sinne koodin alimmaiseksi, ja sitten semmoinen SDL:n kaltainen maini, josta kaikki lähtee.
Kysyn, viitsikö joku nyt teistä herroista tämän tehdä?
Jos ei herroja kiinnosta, yritän joutaa tehdä sen raamin sitten huomenna.
JoinTuanJanohon kirjoitti:
Kysyn, älkää aina tarjotko sitä SDL:ää joka paikkaan, kun pelkällä Windows raamilla saa paljon yksinkertaisemman ja opettavaisemman raamin.
WinApi on kauheaa moskaa ja lisäksi SDL porttautuu ;)
Tässä pohja jota itse käytän:
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <SDL/SDL.h> #include <math.h> // Load object files: // Dev-Cpp\Lib\libSDL.a int leveys = 640; int korkeus = 480; void putpixel(SDL_Surface *screen, int x, int y, Uint32 color); Uint32 getpixel(SDL_Surface *screen, int x, int y); void draw_kuva(SDL_Surface *screen, SDL_Surface *pohja, int x, int y, Uint32 trans = 0x0000FF); void imageline(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color); void imagerect(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color); void imagefilledrect(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color); void imagecircle(SDL_Surface *screen, int x, int y, int r, Uint32 color); Uint32 rgb(int r, int g, int b); #include <imagetext.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow){ if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0){ printf("Unable to init SDL: %s\n", SDL_GetError()); exit(1); } SDL_WM_SetCaption("SDL-ohjelma", NULL); atexit(SDL_Quit); SDL_Surface *screen; SDL_Event event; screen = SDL_SetVideoMode(leveys, korkeus, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); // SDL_NOFRAME / SDL_FULLSCREEN / SDL_HWSURFACE|SDL_DOUBLEBUF if(screen == NULL){ printf("Unable to set video mode: %s\n", SDL_GetError()); exit(1); } int done = 0; Uint8* nappi; int mouse; int mx, my; // SDL_GetTicks(); // srand(time(NULL)); // SDL_ShowCursor(1); // SDL_WarpMouse(250,249); // SDL_Surface *pohja = SDL_LoadBMP("pohja.bmp"); // int lev = pohja->w; // int kor = pohja->h; //rgb = (r << 16) | (g << 8) | b; //r = rgb >> 16; //g = (rgb >> 8) & 255; //b = rgb & 255; while(done == 0){ while(SDL_PollEvent(&event)){ if(event.type == SDL_QUIT) done = 1; if(event.type == SDL_KEYDOWN) if(event.key.keysym.sym == SDLK_ESCAPE) done = 1; } SDL_FillRect(screen, NULL, 0); mouse = SDL_GetMouseState(&mx, &my); // if(mouse & SDL_BUTTON(1)) vasen hiiren nappi nappi = SDL_GetKeyState(NULL); // if(nappi[SDLK_LEFT]) vasen nuolinäppäin ////////////////// // KOODIT TÄHÄN // ////////////////// SDL_Delay(5); SDL_Flip(screen); } return 0; } Uint32 rgb(int r, int g, int b){ return (r << 16) | (g << 8) | b; } void putpixel(SDL_Surface *screen, int x, int y, Uint32 color){ bool draw = 1; if(x > leveys-1) draw = 0; else if(y > korkeus-1) draw = 0; else if(x < 0) draw = 0; else if(y < 0) draw = 0; if(draw){ Uint8 *p = (Uint8 *)screen->pixels; *(Uint32 *)(p + y * screen->pitch + (x << 2)) = color; } } Uint32 getpixel(SDL_Surface *screen, int x, int y){ bool getp = 1; if(x > leveys-1) getp = 0; else if(y > korkeus-1) getp = 0; else if(x < 0) getp = 0; else if(y < 0) getp = 0; if(getp){ Uint8 *p = (Uint8 *)screen->pixels + y * screen->pitch + x * screen->format->BytesPerPixel; return p[0] | p[1] << 8 | p[2] << 16; } } void draw_kuva(SDL_Surface *screen, SDL_Surface *pohja, int x, int y, Uint32 trans = 0x0000FF){ int lev = pohja->w; int kor = pohja->h; int xx, yy; Uint32 vari; for(yy = 0; yy < kor; yy++){ for(xx = 0; xx < lev; xx++){ vari = getpixel(pohja, xx, yy); if(vari != trans){ putpixel(screen, x+xx, y+yy, getpixel(pohja, xx, yy)); } } } // Draw_kuva() by T.M. www.HC-Codes.net } void imageline(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color){ float x, y; float kx, ky; int lev, kor; int len; int u; int r, g, b; if(x1 == x2 && y1 == y2){ putpixel(screen, x1, y1, color); }else{ lev = abs(x2-x1); kor = abs(y2-y1); if(lev > kor){ kx = 1; ky = (float)kor/(float)lev; len = lev+1; }else{ kx = (float)lev/(float)kor; ky = 1; len = kor+1; } if(x2 < x1) kx = -kx; if(y2 < y1) ky = -ky; x = x1; y = y1; for(u = 0; u < len; u++){ putpixel(screen, (int)(x+0.5), (int)(y+0.5), color); x += kx; y += ky; } } // Imageline() by T.M. www.HC-Codes.net } void imagerect(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color){ int tx, ty; int u; if(x2 < x1){ tx = x2; x2 = x1; x1 = tx; } if(y2 < y1){ ty = y2; y2 = y1; y1 = ty; } for(u = x1; u <= x2; u++){ putpixel(screen, u, y1, color); putpixel(screen, u, y2, color); } for(u = y1; u <= y2; u++){ putpixel(screen, x1, u, color); putpixel(screen, x2, u, color); } // Imagerect() by T.M. www.HC-Codes.net } void imagefilledrect(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color){ int x, y, tx, ty; if(x2 < x1){ tx = x2; x2 = x1; x1 = tx; } if(y2 < y1){ ty = y2; y2 = y1; y1 = ty; } for(y = y1; y <= y2; y++){ for(x = x1; x <= x2; x++){ putpixel(screen, x, y, color); } } // Imagefilledrect() by T.M. www.HC-Codes.net } void imagecircle(SDL_Surface *screen, int x, int y, int r, Uint32 color){ int x1, y1, pe; if(r == 0){ putpixel(screen, x, y, color); }else{ x1 = 0; y1 = r; pe = 3-2*r; while(x1 < y1){ putpixel(screen, x+x1, y-y1, color); putpixel(screen, x+y1, y-x1, color); putpixel(screen, x+y1, y+x1, color); putpixel(screen, x+x1, y+y1, color); putpixel(screen, x-x1, y+y1, color); putpixel(screen, x-y1, y+x1, color); putpixel(screen, x-y1, y-x1, color); putpixel(screen, x-x1, y-y1, color); if(pe < 0){ pe += 3*x1+6; }else{ pe += 3*(x1-y1)+10; y1--; } x1++; } if(x1 == y1){ putpixel(screen, x+x1, y-y1, color); putpixel(screen, x+y1, y-x1, color); putpixel(screen, x+y1, y+x1, color); putpixel(screen, x+x1, y+y1, color); putpixel(screen, x-x1, y+y1, color); putpixel(screen, x-y1, y+x1, color); putpixel(screen, x-y1, y-x1, color); putpixel(screen, x-x1, y-y1, color); } } }
Tekstin piirto: http://koti.mbnet.fi/winuus/imagetext.h
Koodi on paskaa, mutta se toimii, mukavia koodaushetkiä :)
Millä perusteella windowspinta olisi parempi kuin sdl.. JoinTuanJanohan. Minusta tuntuu, että on viisaampaa neuvoa aloittelijalle helpompi vaihtoehto, varsinkin jos se on yhtä "hyvä" kuin toinen.
Minäkin olen ehdottomasti sitä mieltä, että jos henkilö ei itse löydä ja omaksu WinAPIn alkeita, ei välttämättä ole tarkoituksenmukaista yrittää niitä selittää, kun ne eivät kuitenkaan ole niitä helpoimpia. Ei mitenkään loukkaukseksi tarkoitettu, mutta oppimisen kannalta parasta on tehdä jotakin helpompaa, kunnes on valmis oppimaan hankalammat asiat. SDL:llä on silloin parempi aloittaa, niin voi saada jotakin aikaankin. WinAPIa voi sitten opetella, kun kokee siihen tarvetta.
Älkää tulko perustelemaan WinAPIn käyttöä sillä, että silloin tietää, kuinka asiat SDL:n alla toimivat. Yhtä hyvin voisi sanoa, että rakenna oma prosessori ja tee sille käyttöjärjestelmä, että tiedät, kuinka asiat siinä toimivat. Aina on vielä se alempi taso, jonka voi yrittää ymmärtää, eikä ole mitään perustetta, miksi juuri WinAPI olisi se alin, joka tarvitsee osata.
Vielä mainittakoon, että itse en edes SDL:ää käytä oikeissa projekteissa (vaan ihan WinAPIa ja Linuxissa XLibiä), joten näkemyksessä ei tosiaan ole mitään puolueellista omien tapojen suuntaan.
Jos WinAPI kuitenkin kiinnostaa, niin ensiksi kannattaa aloittaa Dev-C++:lla uusi Win32-projekti ja yrittää ymmärtää siihen ilmestyvät asiat. Koodivinkkien lueskelukaan ei ole pahaksi.
SDL:n asennukseen Dev-C++:aan DevPak: http://devpaks.org/details.php?devpak=12
Kääntäjä pukkas tällaisia virheitä kun yritin kääntää T.M:n ohjetta:
In function `void draw_kuva(SDL_Surface*, SDL_Surface*, int, int, Wint32)´:
Rivillä 112: default argument given for parameter 5 of `void draw_kuva(SDL_Surface*, SDL_Surface*, int, int, Wint32)´
Rivillä 18: after previous specification in `void draw_kuva(SDL_Surface*, SDL_Surface*, int, int, Wint32)´
Voisko joku korjata mulle nuo jutut että pääsis aloittaa tämän ja pääsisin näistä tyhmistä kysymyksistä eroon?
En ymmärtänyt keskustelun kulkua, ehkä ei tarvinnutkaan. Nainen, siinä kuin mieskin osaa ajaa autoa, kun on ajanut sen ajokortin.
Miksi olisi tarkoituksenmukaista tietää, miten nykyaikainen vähäsaasteeton turbodiesel on rakennettu tahi mitä se on syönyt.
Sillä ei ole merkitystä, merkitystä on mobiilin sisätilojen hallintalaitteilla. Paina nappia a, niin tuulilasiin ilmestyy teksti, "painoit nappia a, mitä oikein meinaat". Tai sitten kun painaa nappia b arvolla 200, ja nappia c arvolla 600, niin ikkunan pisteeseen (300,300) syttyy pikseli.
Näinhän se Windows pohjimmiltaan toimii, SDL, SDL ja SDL. Mitä sitten, vaikka se porttautuisi televisioon, jos käytössäsi on WinApi nyt, aina ja iankaikkesisesti.
PS. T.M:n pohja hyvä, mutta toivoisin enemmän kompaktisuutta, ja pyhän kolminaisuuden, jossa on a) Windows-pa..ka, b) grafiikkarutiinit ja c) peruskontrollit API:in, jossa olisi ainakin hiiri-, ja näppäimen painallus kontrolli.
Ehkä lisukkeeksi vielä näppäinpuskuri, sille kbhit, ja mahdollisuus kaiuttaa painettu kirjain näytön koordinaatteihin (x, y).
Onko liikaa vaadittu? Minulla on ihan totta kiirettä, mutta kun lupasin, niin voin kyllä sen tehdä, mutta eikö teillä nyt herranjumala jollakulla ole tuota runkoa, tai vaikka ei olisi, niin onko se nyt niin ylivoimaista koodata muutama tunti. Sitämän me kaiketi harrastamme, kysyy em.
Voi herran tähden, juuri tuo, mitä minäkin yritin sitä SDL pas..a saada toimimaan omassa mööpelissäni, niin se ei herran jumala toimi, porttautuu se sitten teidän linuxeillenne tai ei?
nimimerkkillä: sama
Voisko joku kuitenki korjata nuo virheet? :E
Virhe ei välttämättä ole tuolla kyseisellä rivillä, vaikka kääntäjä niin väittäisikin... Laita hiukan enemmän koodia näkyviin niin saa paremman yleiskuvan, kun ei noista kääntäjän virheistä saa kuin vatsahaavan.
Kuten sanottu, kyseessä oli tuo T.M.:n esimerkkikoodi.
Otat kyseiseltä riviltä (112) pois alkuarvon määrittelyn, koska se on määritelty jo aiemmin, funktion esittelyssä.
void draw_kuva(SDL_Surface *screen, SDL_Surface *pohja, int x, int y, Uint32 trans = 0x0000FF){
=>
void draw_kuva(SDL_Surface *screen, SDL_Surface *pohja, int x, int y, Uint32 trans){
T.M. voisi tuon itsekin korjata :)
Ja JounTuanJanohon ei millään, siis millään oikealla perustelulla pysty näköjään kantaansa perustelemaan. Varsinkin kun taas uuden Windows-version tullessa voi hyvin käydä niin, että puolet WinAPI-funktioista menee uusiksi jo koodarinkin näkökulmasta katsottuna (ja parissa viikossa SDL pelittää taas kuten ennenkin). Mutta ei, mielipiteitä vain tulee. Edelliseen esimerkkiin vastauksena, että kannattaako se nainen opettaa ajamaan autoa ennen kuin on ollenkaan odotettavissa, että hän kyseistä taitoa saattaisi lainkaan tarvita? Vielä kun autolla ajaminen on todennäköisesti enemmän käytetty taito kuin WinAPI-ohjelmointi...
Ja jos et SDL:ää osaa laittaa pystyyn, niin siitä on turha sitä syyttää. en tosiaan ymmärrä, mikä siinä kaikilla tökkii, kun itselläni ovat kaikki tarvitsemani lisäkirjastot toimineet ongelmitta ilman sen kummempaa säätöä.
Nyt kääntäjä valitti kun korjasin tuon edellisen virheen että, rivillä 24 on tällainenn ongelma:
imagetext.h: No such file or directory
Miten tuo sitten korjataan? Minusta se meinaa jotain "ei tiedostoa tai arkistoa" ( jotain sinne päin, eli siitä puuttuu jotain koodia yms).
Koodissa on #include <imagetext.h>
, mutta tiedostoa imagetext.h ei löydy. T.M.:n viestissä lukee, mistä sen saa.
JoinTuanJanohon kirjoitti:
Kysyn, miksi kukaan ei ole laittanut Azure:lle kommentoituna standardi Windows-raamia
Miksi ihmeessä neuvoisin käyttöjärjestelmästä riippuvaa tapaa, kun Azure ei missään vaiheessa kertonut, mikä järjestelmä hänellä on?
Windows?
Azure kirjoitti:
Windows?
No kyllä minä sen nyt jo ymmärsin, mutta et puhunut siitä mitään ensimmäisessä viestissäsi. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.