Ik ben bezig met een collision detection voor een spel wat ik aan 't schrijven ben. Omdat het om sprites gaat is het dus moeilijk bepalen wanneer er nou precies een collision optreed. Daarom bedacht ik eerst de volgende manier: Hij kijkt eerst met een hitTest of 2 objecten colliden, zo ja, dan gaat hij naar het volgende stadium van de detectie.
Detectie 2 gaat als volgt : een sprite is ook nog eens in 4 vlakken ingedeeld genummer 0 t/m 4. De twee objecten kijken in welke vlakken de collision plaatsvind, bv objectA heeft hem in vlak 3, en objectB in vlak 2. Wanneer dit bekeken is springt de functie naar een nog dieper stadium.
Detectie 3 is het zogenaamde advanced deel. Ik had eerst bedacht om langs randen van de sprites kleine vierkantjes te tekenen en opdezelfde manier als detectie 2 te kijken of er weer een collision plaatsvind. Op zich werkte deze methode al behoorlijk aardig; alleen ben ik bang dat er bij meerdere objecten snelheidsproblemen optreden.
Daarom bedacht ik een nieuwe manier, die als volgt gaat:
Elke sprite heeft op zijn hoekpunten een lege MC staan. Wanneer detectie-fase 3 ingaat gaat flash tussen elke punten de zogenaamde lijn-formule noteren (Y = M*X + B, hierbij worden M en B verkregen door de X en Y waardes in te vullen); door de formule Ma*Xa+Ba = Mb*Xb+Bb op te lossen zou er een mogelijke X coordinaat uit moeten rollen waarbij de lijnen van de twee objecten elkaar snijden (en dus een botsing plaatsvind) ... er moet dus nog wel controleert worden deze gevonden X binnen de waardes van de lijnen past.
De code voor het geheel staat hieronder:
een toelichting; de punten staan in de MC van de sprite. Om daarom geldige lijnformules te krijgen moet er gekeken worden of de sprite is geroteerd (en hierop nieuwe lokale X en Y coordinaten berekenen), deze vervolgens omrekenen naar globaal toe door de sprite zijn X en Y erbij op te tellen. Verder zijn er twee arrays welke bepaalde standaard waarden hebben waar vanuit gerekend moet gaan worden.
Helaas werkt dit hele boekwerk nog niet! Weet iemand de oplossing of dit wel ene goede manier van collision detection is, of het beter of anders kan, of het sneller kan etc. Please help!! B-top? Seraph?
Detectie 2 gaat als volgt : een sprite is ook nog eens in 4 vlakken ingedeeld genummer 0 t/m 4. De twee objecten kijken in welke vlakken de collision plaatsvind, bv objectA heeft hem in vlak 3, en objectB in vlak 2. Wanneer dit bekeken is springt de functie naar een nog dieper stadium.
Detectie 3 is het zogenaamde advanced deel. Ik had eerst bedacht om langs randen van de sprites kleine vierkantjes te tekenen en opdezelfde manier als detectie 2 te kijken of er weer een collision plaatsvind. Op zich werkte deze methode al behoorlijk aardig; alleen ben ik bang dat er bij meerdere objecten snelheidsproblemen optreden.
Daarom bedacht ik een nieuwe manier, die als volgt gaat:
Elke sprite heeft op zijn hoekpunten een lege MC staan. Wanneer detectie-fase 3 ingaat gaat flash tussen elke punten de zogenaamde lijn-formule noteren (Y = M*X + B, hierbij worden M en B verkregen door de X en Y waardes in te vullen); door de formule Ma*Xa+Ba = Mb*Xb+Bb op te lossen zou er een mogelijke X coordinaat uit moeten rollen waarbij de lijnen van de twee objecten elkaar snijden (en dus een botsing plaatsvind) ... er moet dus nog wel controleert worden deze gevonden X binnen de waardes van de lijnen past.
De code voor het geheel staat hieronder:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| function collisionDetection (objA, objB, repeater, nrA, nrB) {
output = "";
// stage 1
if ((repeater == 1) && (objA.hitTest(objB))) {
collisionDetection (objA, objB, 2);
}
// stage 2
else if (repeater == 2) {
for (i=0;i<4;i++) {
for (j=0;j<4;j++) {
if (objA["bigHit" + i].hitTest(objB["bigHit" + j]))
collisionDetection (objA, objB, 3, i, j);
}
}
}
// stage 3
else if (repeater == 3) {
hitsA = objA.lines.length / 4; hitsB = objB.lines.length / 4;
minA = Math.floor (hitsA * nrA); maxA = Math.round (hitsA * (nrA + 1));
minB = Math.floor (hitsB * nrB); maxB = Math.round (hitsB * (nrB + 1));
aRadA = ((objA._rotation) * Math.PI) / 180;
aRadB = ((objB._rotation) * Math.PI) / 180;
for (i=minA;i<maxA;i++) {
Ax1 = (objA.lines[i][0] * Math.cos(aRadA) - objA.lines[i][2] * Math.sin(aRadA)) + objA._x
Ax2 = (objA.lines[i][1] * Math.cos(aRadA) - objA.lines[i][3] * Math.sin(aRadA)) + objA._x;
Ay1 = (objA.lines[i][0] * Math.sin(aRadA) + objA.lines[i][2] * Math.cos(aRadA)) + objA._y;
Ay2 = (objA.lines[i][1] * Math.sin(aRadA) + objA.lines[i][3] * Math.cos(aRadA)) + objA._y;
Am = (Ay1 - Ay2) / (Ax1 - Ax2);
Ab = Ay1 - (m * Ax1);
for (j=minB;j<maxB;j++) {
Bx1 = (objB.lines[j][0] * Math.cos(aRadB) - objB.lines[j][2] * Math.sin(aRadB)) + objB._x;
Bx2 = (objB.lines[j][1] * Math.cos(aRadB) - objB.lines[j][3] * Math.sin(aRadB)) + objB._x;
By1 = (objB.lines[j][0] * Math.sin(aRadB) + objB.lines[j][2] * Math.cos(aRadB)) + objB._y;
By2 = (objB.lines[j][1] * Math.sin(aRadB) + objB.lines[j][3] * Math.cos(aRadB)) + objB._y;
Bm = (By1 - By2) / (Bx1 - Bx2);
Bb = By1 - (m * Bx1);
myB = Ab - Bb;
myM = Am - Bm;
X = (-myB) / myM;
if ((Ax1 > Ax2) && (Ax1 > X) && (Ax2 < X)) {
if ((Bx1 > Bx2) && (Bx1 > X) && (Bx2 < X)) {
output="collision";
}
else if ((Bx1 < Bx2) && (Bx1 < X) && (Bx2 > X)) {
output="collision";
}
}
else if ((Ax1 < Ax2) && (Ax1 < X) && (Ax2 > X)) {
if ((Bx1 > Bx2) && (Bx1 > X) && (Bx2 < X)) {
output="collision";
}
else if ((Bx1 < Bx2) && (Bx1 < X) && (Bx2 > X)) {
output="collision";
}
}
}
}
}
} |
een toelichting; de punten staan in de MC van de sprite. Om daarom geldige lijnformules te krijgen moet er gekeken worden of de sprite is geroteerd (en hierop nieuwe lokale X en Y coordinaten berekenen), deze vervolgens omrekenen naar globaal toe door de sprite zijn X en Y erbij op te tellen. Verder zijn er twee arrays welke bepaalde standaard waarden hebben waar vanuit gerekend moet gaan worden.
Helaas werkt dit hele boekwerk nog niet! Weet iemand de oplossing of dit wel ene goede manier van collision detection is, of het beter of anders kan, of het sneller kan etc. Please help!! B-top? Seraph?