| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Haaajmo Bosno!!! Registriert seit: Aug 2001 Ort: Bihać
Beiträge: 692
| Pool Game Collision Detection is nicht gut genug...
Hallo, die ProblemSWF ist also hier. Es geht darum, dass die Coll. Det. an dem einzelnen Ball links ok ist, wenn mann den Ball mit dem weissen Ball trifft. An der anderen Seite, hat die Col. Det. Probleme mit mehreren Baellen nebeneinander, wie man rechts ausprobieren kann. ActionScript ist: Code: //main loop
function refreshGame(e:Event):void{
checkBallCollisions();
checkWallCollisions();
moveBalls();
}
this.addEventListener(Event.ENTER_FRAME, refreshGame);
function checkBallCollisions(){
//alle bewegenden baelle mit nicht bewegenden auf coll. testen
var i:Number = 0;
var len:Number = movingBalls.length;
for(i = 0; i < len; i++){
var clip:MovieClip = movingBalls[i];
var j:Number = 0;
var lenJ:Number = statBalls.length;
for(j = 0; j < lenJ; j++){
var clip2:MovieClip = statBalls[j];
if(clip && clip2){
checkBall2Ball(clip, clip2);
}
}
}
//alle bewegenden baelle mit bewegenden auf coll. testen
for(i = 0; i < len; i++){
clip = movingBalls[i];
j = 0;
lenJ = len;
for(j = 0; j < lenJ; j++){
clip2 = movingBalls[j];
//if(clip == clip2){
//continue;
//}
if(clip && clip2){
checkBall2Ball(clip, clip2);
}
}
}
}
//das hier ist jobe makars methode aus dem buch...
function checkBall2Ball(c1, c2):void{
//set the speed variables
var xmov1 = c1.xmov;
var ymov1 = c1.ymov;
var xmov2 = c2.xmov;
var ymov2 = c2.ymov;
//set the position variables
var xl1 = c1.x;
var yl1 = c1.y;
var xl2 = c2.x;
var yl2 = c2.y;
//define the constants
var R = (c1.width / 2) + (c2.width / 2);
var a = -2*xmov1*xmov2+xmov1*xmov1+xmov2*xmov2;
var b = -2*xl1*xmov2-2*xl2*xmov1+2*xl1*xmov1+2*xl2*xmov2;
var c = -2*xl1*xl2+xl1*xl1+xl2*xl2;
var d = -2*ymov1*ymov2+ymov1*ymov1+ymov2*ymov2;
var e = -2*yl1*ymov2-2*yl2*ymov1+2*yl1*ymov1+2*yl2*ymov2;
var f = -2*yl1*yl2+yl1*yl1+yl2*yl2;
var g = a+d;
var h = b+e;
var k = c+f-R*R;
//solve the quadratic equation
var sqRoot = Math.sqrt(h*h-4*g*k);
var t1 = (-h+sqRoot)/(2*g);
var t2 = (-h-sqRoot)/(2*g);
if (t1>0 && t1<=1) {
var whatTime = t1;
var ballsCollided = true;
}
if (t2>0 && t2<=1) {
if (whatTime == null || t2<t1) {
whatTime = t2;
ballsCollided = true;
}
}
if (ballsCollided) {
addToMovingPool(c2);
whatTime *= 1000000;
ball2BallReaction(c1, c2, xl1, xl2, yl1, yl2, whatTime);
}
}
function moveBalls():void{
var i:Number = 0;
var len:Number = movingBalls.length;
for(i = 0; i < len; i++){
var clip:MovieClip = movingBalls[i];
clip.xmov *= DECAY;
clip.ymov *= DECAY;
clip.x += clip.xmov;
clip.y += clip.ymov;
}
} Gruss, Mirza Geändert von mirzahat (14-11-2008 um 07:53 Uhr) |
| | |
| | #2 (permalink) |
| Neuer User Registriert seit: Mar 2006
Beiträge: 1.573
|
sieht danach aus, also testest du zwar die kollision für einen zeitpunkt später aber die kugel reagiert noch auf den zustand davor, sprich du musst die kollision erst auflösen, nachdem der zeitpunkt auch der aktuelle ist.
__________________ Currently working on: - --- --- ----------------------------------------------------------------- ActionScript 3.0, C++, Java, Delphi |
| | |
| | #4 (permalink) |
| Neuer User Registriert seit: Mar 2006
Beiträge: 1.573
|
Naja wenn ich die link einzelnde Kugel z.B. anstoße, dann ist zwar eine "saubere" Kollisionslösung vorhanden, aber die weiße Kugel trifft die orangene garnicht und trozdem ist eine Kollision da. Sieht für mich danach aus, und so wie man das aus dem code lesen kann, dass du schon ein paar zeitpunkte vorher prüfst, ob eine Kollision statfinden könnte. Lösen musst du sie aber erst auch zu dem Zeitpunkt wenn die deiden Kugel 1 bzw. 2 schnittpunkte haben. Das Problem mit mehreren Kugeln sollte sich dann eventuell klären.
__________________ Currently working on: - --- --- ----------------------------------------------------------------- ActionScript 3.0, C++, Java, Delphi |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |