[ Parpil @ 27.01.2015. 02:58 ] @
Prvo da objasnim sta mislim pod poklapanjem:

Kad kazem poklapanje mislim na odredjenu figuru napravljenu od pixela koju zelim da iskontrolisem i proverim da li se i jedan pixel te figure poklapa sa nekim pixelom druge figure. Eh sad ja sam to radio samo sa pixelima ali mi problem sad stvara kad sam ja ubacio linije radi lakseg crtanja. Pokusavao sam da primenim istu metodu kao i jos dosta kombinacija koje sam mislio da bi mogle da upale ali nisam uspeo jer ne kapiram bas to kod linija kako ide pa evo vam koda:

Kod za crtanje linija:
Code:

void D3DGraphics::DrawLine( int x1, int y1, int x2, int y2, int r, int g, int bl )
{
    int dx = x2 - x1;
    int dy = y2 - y1;
    if( abs(dy) > abs(dx))
    {
        if( y1 > y2)
        {
            int temp = y2;
            y2 = y1;
            y1 = temp;
            temp = x2;
            x2 = x1;
            x1 = temp;
        }
        float m = (float)dx / (float)dy;
        float b = x1 - m*y1;
        for( int y = y1; y <= y2; y++ )
        {
            int x = m*y + b + 0.5f;
            PutPixel( x,y,r,g,bl );
        }
    }
    else
    {
        if( x1 > x2)
        {
            int temp = y2;
            y2 = y1;
            y1 = temp;
            temp = x2;
            x2 = x1;
            x1 = temp;
        }
        float m = (float)dy / (float)dx;
        float b = y1 - m*x1;
        for( int x = x1; x <= x2; x++ )
        {
            int y = m*x + b + 0.5f;
            PutPixel( x,y,r,g,bl );
        }
    }
}


Kod za crtanje prvog i drugog objetka
Code:

void Game::DrawTank(int xT1, int xY1, int xT2, int xY2)
{
    gfx.DrawLine(910 + xT1, 880 + xY1, 910 + xT2, 800 + xY2, 255, 255, 255);
    gfx.DrawLine(911 + xT1, 880 + xY1, 911 + xT2, 800 + xY2, 255, 255, 255);
    gfx.DrawLine(912 + xT1, 880 + xY1, 912 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(913 + xT1, 880 + xY1, 913 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(914 + xT1, 880 + xY1, 914 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(915 + xT1, 880 + xY1, 915 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(916 + xT1, 880 + xY1, 916 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(917 + xT1, 880 + xY1, 917 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(918 + xT1, 880 + xY1, 918 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(919 + xT1, 880 + xY1, 919 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(920 + xT1, 880 + xY1, 920 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(921 + xT1, 880 + xY1, 921 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(922 + xT1, 880 + xY1, 922 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(923 + xT1, 880 + xY1, 923 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(924 + xT1, 880 + xY1, 924 + xT2, 830 + xY2, 255, 255, 255);

    gfx.DrawLine(909 + xT1, 880 + xY1, 909 + xT2, 800 + xY2, 255, 255, 255);
    gfx.DrawLine(908 + xT1, 880 + xY1, 908 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(907 + xT1, 880 + xY1, 907 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(906 + xT1, 880 + xY1, 906 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(905 + xT1, 880 + xY1, 905 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(904 + xT1, 880 + xY1, 904 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(903 + xT1, 880 + xY1, 903 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(902 + xT1, 880 + xY1, 902 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(901 + xT1, 880 + xY1, 901 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(900 + xT1, 880 + xY1, 900 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(899 + xT1, 880 + xY1, 899 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(898 + xT1, 880 + xY1, 898 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(897 + xT1, 880 + xY1, 897 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(896 + xT1, 880 + xY1, 896 + xT2, 830 + xY2, 255, 255, 255);
}

void Game::DrawSpeedUp(int xSU, int ySU)
{
    gfx.PutPixel(1 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 1 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 2 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 3 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 4 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 5 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 6 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 7 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 8 + ySU, 255, 255, 255);
}


Mesto gde treba da ide provera:
Code:

    if(!PickedSU == true)
    {
        if( ovde treba provera za poklapanje)
        {
            PickedSU = false;
        }
        DrawSpeedUp(150, 500);
    }


Ukoliko neko zna to da mi objasni ali mu trebaju jos neke informacije neka mi napise ovde da mu posaljem cele fajlove sa varijablama za ovo ovde (da vidi gde sam ih definisao)
[ Parpil @ 28.01.2015. 20:56 ] @
Bump
[ Mihajlo Cvetanović @ 29.01.2015. 09:45 ] @
Prvo: Meni nemoj da šalješ nikakave fajlove i projekte. Nemam vremena.

Drugo: U liniji "if (ovde treba provera za poklapanje)" šta imamo na raspolaganju? Pretpostavljam da je output jedan bool koji kaže da li ima poklapanja, ali koji podaci su input?

Treće: Šta misliš o tome da svaki sprajt (objekat na ekranu) za potrebe detekcije kolizije svedeš na jedan ili par pravougaonika? Možda nije baš neophodno da se detekcija sudara gleda za svaki piksel, nego je dovoljno da se sprajtovi "opasno približe" da bi se to proglasilo za sudar. Vrlo je lako detektovati da li dva pravougaonika imaju zajednički deo, što bi predstavljalo sudar.
[ djoka_l @ 29.01.2015. 13:00 ] @
Sviđa mi se tvoj entuzijazam, ali nisi svestan u šta si se upustio.

Recimo, tvoj algoritam za crtanje linije je najprostiji i najgori mogući.
Nema potrebe izmišljati toplu vodu - koristiš Brezenhajmov algoritam: http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
Pogledaj i druge, recimo za crtanje kružnice...

Kako da vidiš da li su se dva geometrijska oblika sudarila/preklopila? Počni od: http://en.wikipedia.org/wiki/Collision_detection
ili http://en.wikipedia.org/wiki/Computational_geometry pa gde te brauzer odvede.

Malo svetla na probleme u kompjuterskoj grafici: https://www.youtube.com/playli...6n4zXuckrPkEUK5iMQrQyvj9Z6WCrm

Ako znaš algebru (naročito rad sa matricama), trigonometriju i geometriju eto lepe zabave!

[Ovu poruku je menjao djoka_l dana 29.01.2015. u 14:10 GMT+1]