Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Ympyröiden piirtoa sinillä ja kosinilla

Sivun loppuun

Touho [30.09.2004 12:31:28]

#

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 :)
}

Touho [30.09.2004 12:32:55]

#

Ja kommentteja kiitos. (ylitsepääsemätön tapa)

rndprogy [30.09.2004 12:39:06]

#

Tuo voisi näyttää joltain VB härpäkkeeltä.

Heikki [30.09.2004 13:31:55]

#

Tulee paljon siistimpi efekti kun pistää pallojen maksimäärän johonkin tuhanteen ja kasvattaa hieman kokoa :D

tuomas [02.10.2004 15:36:18]

#

Tuosta zip paketista näyttäisi puuttuvan MSVCRTD.dll. (ei siis lähde käyntiin)

sooda [02.10.2004 16:11:39]

#

rndprogyn kanssa samaa mieltä... :P

rndprogy [02.10.2004 16:20:58]

#

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.

tejeez [02.10.2004 17:12:31]

#

Ympyrä on kyllä vähän tyhmää tehdä sinillä :)

Heikki [02.10.2004 22:43:36]

#

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.

BlueByte [02.10.2004 23:32:46]

#

Hmm...

Hienoja palloja kai :)

Mikäköhän oli tämän ohjelman syvällinen tarkoitus? :p

Touho [03.10.2004 19:29:42]

#

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.

water flea [05.10.2004 16:57:01]

#

Ympyrää ei oikein voi tehdä ilman siniä ja cosinia.

setä [06.10.2004 09:42:10]

#

Paitsi Pythagoran kaavalla. En ole varma, perustuuko Circle-käsky sinin ja cosinin käyttöön.

Arppa [27.10.2004 00:09:01]

#

lainaus:

Ympyrää ei oikein voi tehdä ilman siniä ja cosinia.

Voi. Ja kannattaakin. Nimittäin Bresenham's Circle -algoritmilla:
http://gamesnow.sourceforge.net/tutorials/algoritmhs/bresenham/bres.txt


Sivun alkuun

Vastaus

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

Tietoa sivustosta