collision

Za vse novince v izdelovanju iger.

collision

OdgovorNapisal/-a Emigma » Če Mar 01, 2012 10:55 pm

Pri izdelovanju svojega prvega projekta sem obtičal zelo kmalu, žal se obračam na vas., vendar se tudi tokrat moram popvrašati izkušene forumaše:)

Zanima me če je tole ok preverjanje na ta stil:

http://www.gamedev.net/page/resources/_ ... ction-r735
Koda: Izberi vse
// Full object-to-object pixel-level collision detector:
short int Sprite_Collide(sprite_ptr object1, sprite_ptr object2) {

        int left1, left2, over_left;
        int right1, right2, over_right;
        int top1, top2, over_top;
        int bottom1, bottom2, over_bottom;
        int over_width, over_height;
        int i, j;
        unsigned char *pixel1, *pixel2;

        left1 = object1->x;
        left2 = object2->x;
        right1 = object1->x + object1->width;
        right2 = object2->x + object2->width;
        top1 = object1->y;
        top2 = object2->y;
        bottom1 = object1->y + object1->height;
        bottom2 = object2->y + object2->height;


        // Trivial rejections:
        if (bottom1 < top2) return(0);
        if (top1 > bottom2) return(0);
 
        if (right1 < left2) return(0);
        if (left1 > right2) return(0);


        // Ok, compute the rectangle of overlap:
        if (bottom1 > bottom2) over_bottom = bottom2;
        else over_bottom = bottom1;

        if (top1 < top2) over_top = top2;
        else over_top = top1;

        if (right1 > right2) over_right = right2;
        else over_right = right1;

        if (left1 < left2) over_left = left2;
        else over_left = left1;


        // Now compute starting offsets into both objects' bitmaps:
        i = ((over_top - object1\1->y) * object1->width) + over_left;
        pixel1 = object1->frames[object1->curr_frame] + i;

        j = ((over_top - object2->y) * object2->width) + over_left;
        pixel2 = object2->frames[object2->curr_frame] + j;

 
        // Now start scanning the whole rectangle of overlap,
        // checking the corresponding pixel of each object's
        // bitmap to see if they're both non-zero:

        for (i=0; i < over_height; I++) {
                for (j=0; j < over_width; j++) {
                        if (*pixel1 > 0) && (*pixel2 > 0) return(1);
                        pixel1++;
                        pixel2++;
                }
                pixel1 += (object1->width - over_width);
                pixel2 += (object2->width - over_width);
        }


        // Worst case!  We scanned through the whole darn rectangle of overlap
        // and couldn't find a single colliding pixel!

        return(0);

};


Kako sploh izoblikovati pravilno v funkcijah

Želel bi imeti takle collision :

http://shrani.si/f/3X/LC/2ELeOWpm/primer.png

Koda: Izberi vse
  for (int i=0; i<aa.size(); ++i)
                  {
                    double collx =aa[i]->ladx - bb->x;
                    double colly = aa[i]->lady - bb->y;
                    double collr = aa[i]->a + bb->a;

                        if(collx*collx+ colly*colly <= collr*collr)
                          {                               //listasovraznih_ladij[i]->trk=1;
                            bb->trk=1;
                            break; cout<<"trkkk";

                   
                          }
                         else
                          {
                            aa[i]->trk=0;
                            bb->trk=0;
                          }
                  }


Prilimana koda omgoča takle collision:
http://shrani.si/f/44/Hc/2JjBPzSx/primer2.png

Zadeva deluje če se moja ladja nahaja v tem krogu, potem onemogoči premikanje moje ladje, In če je v krogu, se postavi na trk=1 od moje ladje kar pomeni da meni ne dela noben kurzor dokler je stik in potem sem razmišljal da bi ladja naredila neko proceduro umikanja ali pa nekako da ju razžene stran kaj ti misliš.

Naredil pa bi rad tak naidezni kvadrat, nato pa odvisno katere stranice se dotakne potem pa odvisno, kako se obnaša in mogoče s katerim delom stranice se mi dotaknemo v tisto smer zadeva ne sme potekani, ampak vesel bom če mi pomagate narediti cool detektiranje . Hvala !

Lp
Emigma
novinec
novinec
 
Prispevkov: 25
Pridružen: To Jan 10, 2012 10:50 pm

Re: collision

OdgovorNapisal/-a koscak » Pe Mar 02, 2012 5:29 pm

Ekola jaz se tut podpišem pod ta primer, ker tele collisione se sploh ne predstavljam...
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: collision

OdgovorNapisal/-a koscak » Pe Mar 02, 2012 6:03 pm

Je stil taprav programiranja če boš imel kvadrate pri miru, kolikor pa vidim da se ti boasta pravoktonika vrtela okoli sovje osi pa žow to ne pride v poštev ;((
Zato imam tudi jaz problem,..
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: collision

OdgovorNapisal/-a RedReaper132 » So Mar 03, 2012 11:54 am

Za sprogramirati taki collision kot ga hočeš imeti ti, za rotirane pravokotnike v sistemu, je potrebno kar nekaj matematičnega in programerskega znanja. "Lažji" način je nekaj kot je razloženo v artiklu, kjer preverjaš sam collision med spriti oz. njihovimi pixli vendar je ta process kar požrešen za CPU. Da se zadeva rešiti z uporabo OpenGL in stencil bufferjev ampak to so malce bolj kompleksne zadeve.

Ne bi te rad odvrnil od takega collisiona, ampak ti predlagam, da zaenkrat, ker je to tvoj prvi projekt, ostaneš pri normalnem collision-u. Nekako pač potrebno skužiti sistem kako bi to naredil z normalnim načinom.
Moj bla, bla, bla, bljak blog: http://redgamedevblog.blogspot.com/
Uporabniški avatar
RedReaper132
wannabe
wannabe
 
Prispevkov: 116
Pridružen: To Apr 21, 2009 4:32 pm
Kraj: Središče

Re: collision

OdgovorNapisal/-a Blodyavenger » So Mar 03, 2012 12:12 pm

Še en način pa bi bil, da bi iskal presečišča med stranicami obeh pravokotnikov, kar bi v najslabšem primeru zneslo 4x4 = 16 preverjanj.
Poišči enačbo za iskanje presečišč med dvema daljicami in to je to -if ( obstaja presečišče ) collision = true

Tudi to bi znalo bit požrešno malo ampak verjetno vseeno hitrejše od pixel collisiona. Dodaš še malo optimizacije kot npr:
Ne preverjaj collisiona če:
- je razdalja med objektoma večja od X
- sta oba objekta statična (na miru )
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: collision

OdgovorNapisal/-a Emigma » Ne Mar 04, 2012 5:28 pm

Ne razumem jaz tega kako dobit navidezni pravkotnik okoli te moje slike,oz stvari.
imam definirano x,y,r in nič več,
r predstavlja velikost predmeta
x je x kordinata
y je y kordinata
direction smer ki jo računam direction += 90*dt; dt je kot
takole pa premikam objekt :D .. prmeikam :
x += sin(direction*PI/180)*0.2*dt;
y += cos(direction*PI/180)*0.2*dt;
presečišče premic dobimo
Formula je naslednja:
izenačiš vendar to so premice ne kvadrati, zato se prepustim tebi
Presečišče določimo: RAČUNSKO
y = y
– x – 2x = – 3 – 3
– 3x = – 6
x = 2
Izračunamo še y: v prvo ali drugo funkcijo
vstavimo izračunani x.
f(2) = – x + 3
f(2) = – 2 + 3
f(2) = 1
ali
f(2) = 2x – 3
f(2) = 2 . 2 – 3
f(2) = 1
• Premici se sekata pod pravim

Matr mato mam tri po navadi pov procenta do 4 pa enostavno sem preneumen da bi mi ratal tole ugotvit, res pa je da nisem še nikol delu in da je prvi projekt. Prosim če si vzameš neki časa in mi spišeš primer, oz mal oblj podrobno razložiš. Prosim te še da razložiš ker brez tega ne bo šlo, da štekam popolnoma. Se ti zahvaljujem za tvoj trud, ki se ga boš vzel.. ..
In občasno se ladijce vozijo kar ena čez drugo, namesto da bi imele tak da bi se izmakale, pa gredo naravnost ne vem kako je to možno..
Emigma
novinec
novinec
 
Prispevkov: 25
Pridružen: To Jan 10, 2012 10:50 pm

Re: collision

OdgovorNapisal/-a Emigma » Po Mar 05, 2012 8:16 pm

Zanima me še kako naredit neko logiko da bom ugotvil kako je bolje če se umakne ladijca levo ali desno, kaj se ji bolj splača, sedaj mi to ni jasno. Se iskreno opravičujem vendar žal mi je ker morm spet spraševat in nočem novo temo odperat upam da bi čimprej pomagate. Kako se da da bi jaz napisal neko logiko vožnje, najlepša hvala svem Prosiiimmm.
Emigma
novinec
novinec
 
Prispevkov: 25
Pridružen: To Jan 10, 2012 10:50 pm

Re: collision

OdgovorNapisal/-a Blodyavenger » Po Mar 05, 2012 8:40 pm

Vsi imamo svoje projekte, šolo, službo in ostane malo časa še kje drugje razmišljat :)

Marsikaj boš moral sam razmislit in računat, pri tem pa ti pomaga tvoja logika, kajti vse se da logično razmislit.
Predstavlji si prizor realnega sveta in kako bi razmišljal sam v takem primeru in nato poskusi to slikat v logiko igre.

Vzelo ti bo mogoče nekaj časa ampak trud bo poplačan :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: collision

OdgovorNapisal/-a Emigma » Po Mar 05, 2012 9:20 pm

Ja ni panike model, sam še vedno mi ni čist jaso kako si nej predstavljam zaviti v levo ali desno smer :) res mi ni čist jasn..drgač pa mal namigni ne rabte bit do novincev preveč arogantni nisme reku da mi vse sprogrameri, ...Ali je potrebno ugutovit primer

avto1
xxx
xxx avto2
xxxx
xxxx
No in kako nej ugtovi, ali nej gre v levo ali desno samo na način
primer
y=x1+1;
y2=X2+1;

if(y<y2)
{tukaj notr pa je primerjanje ne vem no :D}
Emigma
novinec
novinec
 
Prispevkov: 25
Pridružen: To Jan 10, 2012 10:50 pm

Re: collision

OdgovorNapisal/-a GupeM » To Mar 06, 2012 9:33 am

Emigma napisal/-a:drgač pa mal namigni ne rabte bit do novincev preveč arogantni

To pa je izjava :D poglej si tole temo pa boš videl kako aroganten je blody do novincev :P

Drugače pa en odličen članek o collision detectionu: KLIK. Na slikah lahko objekte premikaš.
Se naenkrat roke dvignejo, vrata se odpro in v zraku vidim deklico, ki na prsih nosi.
Finis Mundi/Konec je sveta.
Uporabniški avatar
GupeM
poznavalec
poznavalec
 
Prispevkov: 177
Pridružen: Po Jun 30, 2003 10:13 am
Kraj: Žiri

Re: collision

OdgovorNapisal/-a koscak » To Mar 06, 2012 4:37 pm

Prosim dečki bloody je pa največji car tega foruma :) Brez njega moj maturitetna naloga nebi bila še tok deleč :) Moram pa rečt da mi je še precej precej precej več pomagu, kot pa samo tistle kar je na forumu ;) Svaka mu čast :) Sem mel čist povsod probleme, moj prvi projekt, preveč nesistematično sem se ga lotu .. Kljub vsem pomočmi je bil moj projekt dokaj profesinalno izpeljan oz vsah zgleda. Naslednjega se bom lotil veliko bolj sistematično. Naučil sem se pa z njegovo pomočjo ogromno.
:C: :C: :C: :C: :C: :C: :C: :C: :C:
:C: :C: :C: :C: :C: :C: :C: :C:
:C: :C: :C: :C: :C: :C: :C:
:C: :C: :C: :C: :C: :C:
:C: :C: :C: :C: :C:
:C: :C: :C: :C:
:C: :C: :C:
:C: :C:
:C:
Hvala bloody :)
(:8:8:) (:8:8:) (:8:8:) (:8:8:)
Pomagli so mi tudi še drugi, vendar bloody največ :) ..
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: collision

OdgovorNapisal/-a koscak » To Mar 06, 2012 9:18 pm

Aja enigma zate tole si preber: http://www.gamedev.net/page/resources/_ ... orks-r1988
Nevronske mreže se meni zdijo cool, če pa ma kdo kako idejo se priporočam ker jaz nisem izkušen v tem preveč ;)-.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron