Tämä on minun "Ball storm". Ensin tutkin, miten tehdään ympyrä sinillä ja cosinilla. tulos näytti ankealta, joten päätin tehdä tämmösen hienon ilmestys efektin. Sitten lisäsin palloa ja asetuksia, niin johan tuli hieno "efekti", vai miksi tätä voisi kutsua.
Olen yrittänyt kommentoida parhaani mukaan, että muutkin ihmiset ymmärtäisivät, mitä tapahtuu. :)
#include <SDL/SDL.h> //headerit #include <math.h> #include <stdlib.h> #include <time.h> #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" //nämä kommentit olen ottanut heikin esimerkistä. lupa on kysytty, ihmisoikeuksia ei rikottu. ;) const int RES_X = 640, RES_Y = 480; //resoluutio. voit muuttaa. pallojen koodrinaatit ovat riippuvaisia näistä muuttujista int Check() // tämä katsoo, painellaanko spacea, enteriä tai esciä. { Uint8* keys; SDL_Event event; while ( SDL_PollEvent(&event) ) { if ( event.type == SDL_QUIT ) return 1; if ( event.type == SDL_KEYDOWN ) { keys = SDL_GetKeyState(NULL); if ( keys[SDLK_ESCAPE] || keys[SDLK_SPACE] || keys[SDLK_RETURN]) return 1; } } return 0; } int main(int argc, char *argv[]) //sitten main { if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0) //tähän nämä SDL:n pakollisen rivit { printf("Error to Init yms.. %s\n", SDL_GetError()); exit(1); } atexit(SDL_Quit); SDL_Surface *screen; screen = SDL_SetVideoMode(RES_X, RES_Y, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); if (screen == NULL) { printf("Unable to set video mode.. sry .. &s\n", SDL_GetError()); exit(1); } SDL_WM_SetCaption("Ball storm", NULL); //tällä eliminoidaan kurja "SDL_app" teksti - eli otsikko double i; // counters int ii; const int balls_max = 8; //pallojen maksimimäärä const int r_max = 50; // pallon halkasija int r; int balls; // pallojen määrä double y,x; //double antaa tarkan paikan, mihin pikseli, pitää sijoittaa int x1, y1; //puskuriin ei voi piirtää double-luvuilla int delay = 15; //kuinka monta millisekuntia odotetaan jokaisen piirretyn ympyrän (ei pallon) jälkeen. int R[balls_max],G[balls_max],B[balls_max]; // pallojen RGB:t int randx[balls_max]; // pallojen koordinaatit int randy[balls_max]; while (1) //suht pitkä looppi { balls= 2 + rand() % balls_max-1; //laitetaan random: värit, koordinaatit ja pallojen määrä for (ii=0;ii<balls_max;ii++) //jokaiselle pallolle omat asetuksensa. { randx[ii] = 60 + rand() % (RES_X-120); // ei toimi ilman sulkuja, koska muuten otetaan tuloksesta 120 pois, randy[ii] = 60 + rand() % (RES_Y-120); // eli randx/y voi olla 60-120 eli -60, jolloin ohjelma sekoaa. R[ii] = 30 + rand() % 225; G[ii] = 30 + rand() % 225; B[ii] = 30 + rand() % 225; } for (r=0;r<r_max;r++) //muodostaa pallon. { for (ii=0;ii<balls;ii++) //piirtää jokaiseen palloon yhden ympyrän for (i=0;i<6.25;i=i+.03) //piirretään ympyrä (ei pallo) voi olla, että joku enemmän ohjelmointut aavistaa, { //miksi käytän näitä forin asetuksia. 360 ja i++ piirtää pikseleitä x=sin(i)*r; //lasketaan piirrettävän päällekkäin. y=cos(i)*r; //pikselin koordinaatit x1 = (int)x; //muutetaan double integeriksi, että voidaan piirtää muuttujalla puskuriin y1 = (int)y; Uint32 *bufp; bufp = (Uint32 *)screen->pixels + (y1+randy[ii])*screen->pitch/4 + (x1+randx[ii]); //koordinaatit *bufp = SDL_MapRGB(screen->format, R[ii], G[ii], B[ii]); //värit } SDL_Delay(delay); //odotetaan, ettei ohjelma tee ympyröitä turhan nopsaa. SDL_Flip(screen); //piirretään jokaisesta pallosta yksi ympyrä if (Check() == 1) return 0; //katsotaampas, painoiko käyttäjä esc, space tai enter. } for (r=r_max;r>0;r--) //poistetaan pallo. en usko, että tarvii kommentoida enempää, kun on samat jutut, { //kun muodostamisessa. for (ii=0;ii<balls;ii++) for (i=0;i<6.25;i=i+.03) { x=sin(i)*r; y=cos(i)*r; x1 = (int)x; y1 = (int)y; Uint32 *bufp; bufp = (Uint32 *)screen->pixels + (y1+randy[ii])*screen->pitch/4 + (x1+randx[ii]); *bufp = SDL_MapRGB(screen->format, 0, 0, 0); } SDL_Delay(delay); SDL_Flip(screen); if (Check() == 1) return 0; } } // tässä "loppuu" while (1).. ei se taida loppuakkaan... return 0; //tähän asti ohjelma ei edes pääse, mutta tämä on "pakollinen" tänne loppuun :) }
Ja kommentteja kiitos. (ylitsepääsemätön tapa)
Tuo voisi näyttää joltain VB härpäkkeeltä.
Tulee paljon siistimpi efekti kun pistää pallojen maksimäärän johonkin tuhanteen ja kasvattaa hieman kokoa :D
Tuosta zip paketista näyttäisi puuttuvan MSVCRTD.dll. (ei siis lähde käyntiin)
rndprogyn kanssa samaa mieltä... :P
lainaus:
Tuosta zip paketista näyttäisi puuttuvan MSVCRTD.dll. (ei siis lähde käyntiin)
Ei sen kyllä kuulukkaan olla siinä. Se vaan puuttuu koneeltasi.
Ympyrä on kyllä vähän tyhmää tehdä sinillä :)
lainaus:
Tuosta zip paketista näyttäisi puuttuvan MSVCRTD.dll. (ei siis lähde käyntiin)
Olen itsekkin välillä ihmetellyt, miksi jotkut "pelini" ovat kavereiden koneilla vaatineet ks. tiedoston. Googlettaminen paljasit syyn. Taitaa olla käännösasetukset vähän väärät julkaisua ajatellen:
jokuihmesivu kirjoitti:
msvcrtd.dll is a module that contains functions needed for the debug version of an application.
Hmm...
Hienoja palloja kai :)
Mikäköhän oli tämän ohjelman syvällinen tarkoitus? :p
Täällä koodivinkeissä ohjelmilla ei ole mielestäni kovin paljoa syvällistä tarkoitusta. Tämän vinkin tarkoitus on näyttää, miten tehdään palloja/ympyröitä sinin ja cosinin avulla.
MSVCRTD.dll on minun koneella aina ollut C:/windows/system32/ -kansiossa.
Ympyrää ei oikein voi tehdä ilman siniä ja cosinia.
Paitsi Pythagoran kaavalla. En ole varma, perustuuko Circle-käsky sinin ja cosinin käyttöön.
lainaus:
Ympyrää ei oikein voi tehdä ilman siniä ja cosinia.
Voi. Ja kannattaakin. Nimittäin Bresenham's Circle -algoritmilla:
http://gamesnow.sourceforge.net/tutorials/
Aihe on jo aika vanha, joten et voi enää vastata siihen.