Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 14-11-2008, 07:52   #1 (permalink)
Haaajmo Bosno!!!
 
Benutzerbild von mirzahat
 
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;
	}
	
}
Bin mir nicht sicher was ich machen kann, um die Coll. ein wenig praezier zu machen...

Gruss,
Mirza

Geändert von mirzahat (14-11-2008 um 07:53 Uhr)
mirzahat ist offline   Mit Zitat antworten
Alt 14-11-2008, 09:22   #2 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
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
_crypto_ ist offline   Mit Zitat antworten
Alt 14-11-2008, 09:26   #3 (permalink)
Haaajmo Bosno!!!
 
Benutzerbild von mirzahat
 
Registriert seit: Aug 2001
Ort: Bihać
Beiträge: 692
_crypto_ danke fuer die Antwort.

Wie sieht das in der Wirklichkeit aus, was soll ich da konkret am Code aendern?

Gruss,
Mirza
mirzahat ist offline   Mit Zitat antworten
Alt 14-11-2008, 09:31   #4 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
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
_crypto_ ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele