1

pytanie z matematyki, ktore dotyczy detekcji kolizji

czy jest mozliwosc stwierdzenia matematycznie ze dany punkt o wspolrzednych X,Y nalezy do jakiegos obszaru ograniczonego 4-ma punktami (prostokat lub kwadrat)

czyli chodziloby mi o cos szybszego anizeli porownywanie wspolrzednych, normalnie musielibysmy dokonac 4-ech porownan (2 dla wsp X i 2 dla wsp Y)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

2

Jeśli pytanie to dotyczy pośrednio Atari, to może by tak postawić "na żądanym kwadracie" odpowiednio rozciągniętego sprajta (jednego lub więcej), koloru ekranu lub może nie, zależy o co dokładnie chodzi, no i wtedy można by sprawdzać kolizję z tym obszarem. Przynajmniej ja bym tak zrobił gdydym bym koderem.

Jeśli chodzi natomiast o coś innego (lub warunki na to nie pozwalają), to przykro bardzo...

I Ty zostaniesz big endianem...

3

chodzi o detekcje kolizji w spritach programowych, bez uzywania sprzetowych

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

4

jesli obszar ten jest cztero pixelowy x1,x2;y1,y2 to
x/2 ma sie rownac x2/2
y/2 ma sie rownac y2/2
aby punkt nalezal do tego wyznaczonego pola...

czyli musisz przechowywac tablice x2>>1 i y2>>1
co to daje? miast 4 porownan masz dwa asr (x/2, y/2) i dwa porownania,
albo jesli bez tablicy masz 4x asr i dwa porownania...

na trzezwo pisze, moglem cos pomylic...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

5

Pełną odpowiedź na swoje pytanie, w postaci uogólnionej (dowolny wielokąt a nie kwadrat czy prostokąt) masz w źródłach B2L2. Miłego czytania.

P.S. Polecam wersję w C++ :)

Aby odpackować teksty trzeba najpierw odpackować  program do ich odpackowywania - Energy #1

6

a ja bym zawezil pytanie do: skad wiem ze moj dynamiczny sprajt wszedl na dany obszar?

wezmy ostatni przyklad (+tablice) z http://atariarea.krap.pl/forum/viewtopi … 20&p=2

        ldy #7
petla ldx nakladany,y
        lda znak,y

; ---
; detekcja kolizji

        and nakladany_tab_kolizji,x
        cmp nakladany_tab_uczulony,x
        beq kolizja
        lda znak,y
; ---

        and tab_maska,x
        ora nakladany,y
        sta znak,y
        dey
        bpl petla
       
szybsze od sprawania wspolrzednych.

w ten sposób wykryjemy, ze sprjt doznal kolizji z danym kolorem, w zaleznosci od tego na ile kolorow ma być wyczulony tyle porownan dla jakiegokolwiek koloru nie trzeba zadnego porownania.
po co te tablice? a po to, ze sprajt może mieć hotspota definiowanego w tablicy nakladany_tab_uczulony, albo można zrobic dowolny ksztalt (nie koniecznie ksztalt sprite) który będzie odpowiedzialny za kolizje.

moglem sie machnac bo siedze w pracy o glodnym zoladku.

http://atari.pl/hsc/ad.php?i=1.

7

mi pierwsze do glowy przyszlo
(x1-x)(x2-x)<0
(y1-y)(y2-y)<0
czyli krotko mowiac roznice odpowiednich wspolrzednych wierzcholka i punktu sa przeciwnych znakow, co jest uproszczeniem tego, ze wektory miedzy sprawdzanym punktem a wierzcholkami sa skierowane do srodka prostokata....blablabla...

no, ale to raczej nie bedzie szybsze niz porownanie

8

i oto słowo ciałem się stało http://g2f.atari8.info/softsprt_gfx.zip

gotowy silnik spritow programowych na grafice bitmapowej z detekcja kolizji, do wykorzystania w grze ze statycznym ekranem w stylu np. Bubble Booble, Mario Bros

wymagana jest najnowsza wersja Mads'a 1.6.4, zalaczona do w/w pliku ZIP

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

9 Ostatnio edytowany przez tebe (2005-08-30 20:31:17)

wpadłem na pomysł innego sposobu wykrywania kolizji, pomysł opiera się na wpisaniu w nasz czworokąt okręgu

dobrze by było gdyby nasze testowane czworokąty były kwadratami (wszystkie krawędzie tej samej długości), wtedy środek kwadratu jest też środkiem okręgu wpisanego w ten kwadrat

rozmiar kwadratu znamy bo jest stały, więc znamy również promień okręgu wpisanego w ten kwadrat

teraz wystarczy obliczyć odległość od środka naszego okręgu (środka naszego kwadratu) do środka drugiego testowanego okręgu, jeśli odlegość jest mniejsza od podwójnej długości promienia okręgu (średnicy) wówczas mamy kolizję

odległość od dwóch punktów obliczmy z Twierdzenia Pitagorasa (a^2 + b^2 = c^2)

DX = abs(x2-x1)
DY = abs(y2-y1)

teraz aby było to ultra szybkie tworzymy tablice z wartością 1 gdy wystąpiła kolizja, a 0 gdy nie było kolizji


Przykładowy program do wyliczenie tablicy:


minimalna_odleglosc = 6

for y = 0 to 127
  for x = 0 to 255

   d = sqrt(x*x + y*y)

   if d < minimalna_odlegosc then
    tablica[x+y*256] = 1
   else
    tablica[x+y*256] = 0

  next x
next y


zamiast zapisywać tablice bajtami można zapisać ją bitami, wtedy zamiast 32768 bajtów będziemy mieli tylko 32768/8 = 4096 bajtów


tylko po co to wszystko, przeciez już na podstawie DX i DY jesteśmy w stanie ocenić czy kwadraty nakładają się :) sprawdzamy tylko czy DX i DY zawiera się w z góry określonym zakresie :)

i tak oto nie potrzeba nam już żadnych tablic, a test kolizji niezależnie od wielkości ducha przebiega z tą samą szybkością

śmiem twierdzić, że jest to najszybsza metoda wyznaczenia kolizji dla proporcjonalnych czworokątów, szybsza niż zastosowana w Dynablaster, tam były testowane kolizje przy użyciu bufora, jak w "Engine #3"

przykładem zastosowania w/w metody jest "Engine #4", teraz możecie już pisać nowe gry :) http://g2f.atari8.info/softsprt_gfx_4.zip


możnaby zastosować taką detekcję kolizji w jakimś mordobiciu, dzielimy postać na kwadraciki, czyli wyznaczamy obszary trafień i testujemy je z obszarami uderzeń przeciwnika, w ten sposób moglibyśmy określić trafienia w konkretną część ciała :D

obszary trafień i uderzeń należałoby określić dla każdej klatki animacji postaci

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C