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.