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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-08-2009, 08:37   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 11
Kollisionserkennung auf SmartFoxServer Pro

Hi Jungens,
ich hoffe ihr könnt mir helfen.

Folgende Situation:
Ich habe mit hilfe des SmartFoxServer Pro ein Realtime Pong geschrieben. Soweit so gut funktioniert das auch.

Nun würde ich gerne die Kollisionsabfragen usw. vom Server erledigen lassen, sodass die Clients quasi nur noch Visualisieren müssen.
Daraus erhoffe ich mir folgende vorteile:
- Alles was nicht beim Client liegt ist schwerer/nicht Manipulierbar
- Ich spare mir Pakete und somit wertvolle ms

Nun hatte ich zu Testzwecken mir folgenden Code geschrieben beidem ein Quadrat (Ich hab ihn mal als Ball bezeichnet) immer von einer Seite zur anderen Seite fliegt und dort abprallt (Die Bühne für mein Pong soll 640x480 sein).

Code:
// MCs für Bounding erstellen
_root.createEmptyMovieClip("boundL",_root.getNextHighestDepth());
_root.createEmptyMovieClip("boundR",_root.getNextHighestDepth());
// MCs für Bounding platzieren
_root.boundR._x = 640;
// Bounding Boxen reinzeichnen
drawRectangle(_root.boundL,-500,0,500,480,"0xFF00FF");
drawRectangle(_root.boundR,0,0,500,480,"0xFF00FF");

// Ball erstellen
_root.createEmptyMovieClip("ball",_root.getNextHighestDepth());
// MCs für Bounding platzieren
_root.ball._x = 320;
_root.ball._y = 240;
// Bounding Boxen reinzeichnen
drawRectangle(_root.ball,-10,10,20,20,"0x00CCCC");

// Array mit Banden erstellen
boundArr = [];
boundArr.push(_root.boundL);
boundArr.push(_root.boundR);

// Ball Bouncen lassen
var speed = 5;
this.onEnterFrame = function() {
	// Ball bewegen
	_root.ball._x += speed;
	// Auf Kollision prüfen
	for(bound in boundArr) {
		if(_root.ball.hitTest(boundArr[bound])) {
			speed *= -1;
		}
	}
}

function drawRectangle(target:MovieClip, startX:Number, startY:Number, width:Number, height:Number, color:String) {
	with (target) {
		beginFill(color);
		moveTo(startX, startY);
		lineTo(startX + width, startY);
		lineTo(startX + width, startY + height);
		lineTo(startX, startY + height);
		lineTo(startX, startY);
		endFill();
	}
}
Wenn ich jedoch versuche diesen Code in der Extension auf dem Server (AS) umzusetzen bekomme ich das Problem das ich keine MovieClips erzeugen kann.
Denn der Server kennt weder _root noch _level0, und wenn ich createEmptyMovieClip auf this ausführen will sagt er das this diese funktion nicht kennt.

Hat da jemand noch eine Idee oder weiß wie ich mein vorhaben anderweitig umsetzen kann (zZ.B. mit SWFs nachladen?!)?

mfg
Carsten
el_sheepy ist offline   Mit Zitat antworten
Alt 06-08-2009, 08:56   #2 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Den Ball kannst du dir ja einfach als Punkt (X und Y Koordinate) und Radius vorstellen.

Kollisionen kannst du dann mit relativ einfachen if Abfragen feststellen, in denen du die Position des Balls, unter Berücksichtigung des Radiuses mit den Begrenzungen des anderen Objektes vergleichst.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 06-08-2009, 09:16   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 11
Hmm,
das wäre natürlich eine Lösung in diesem Simplen Fall.
Jedoch hätte ich hier schon das Problem das ich den Ball quasi wie ein Quadrat behandel. Also müsste ich entweder per Formel ausrechnen ob ich den Ball "schräg" erwischt habe (Ich darf ja nicht nur auf der X Achse denken) oder ich müsste ein Array speisen welches die Pixel Abstände von der Mitte des Balls aus gespeichert hat.
Zum glück ist mein Schläger nicht abgerundet

Hätte denn sonst noch wer ne Idee wie ich die Kollisionserkennung von Flash behandeln lassen kann?
mfg
Carsten
el_sheepy ist offline   Mit Zitat antworten
Alt 06-08-2009, 10:20   #4 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
So kompliziert ist das nicht, am besten einfach mal die möglichen Fälle aufmalen, ich denke es gibt grundsätzlich nur zwei Fälle, entweder der Ball trifft volle Breitseite, oder er erwischt eine Ecke. Der erste Fall ist simpel, der zweite Fall benötigt etwas Berechnung, müsste aber auch noch sehr machbar sein.

Gibt es denn sowas wie onEnterFrame auf deinem Server? (ist ja eigentlich eine Methode von MovieClip)
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 06-08-2009, 12:14   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 11
Jo,
ich werds mal mit nem Array ausprobieren wo ich mir die 10 fälle aufschreibe wo er ihn halt schief trifft. Man könnts zwar auch ausrechnen, aber das ist ja nur unnötig rechenkapazität die ich da verballer.

Nen onEnterFrame gibts natürlich nicht (Irgendwie gibts da fast nichts). Aber nen SetInterval. Hab das Interval mal auf 33ms gesetzt, das sollten dann gute 30 frames pro sekunde sein.

Ich werde das jetzt mal so ausprobieren, aber ich befürchte das die Synchronisation nicht so pralle sein wird :/

Schoma vielen Dank.

Carsten
el_sheepy ist offline   Mit Zitat antworten
Alt 06-08-2009, 20:09   #6 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Um eine Berechnung kommst du denke ich nicht drum rum, die Varianten, *wie* er dann schief abprallt sind ja unendlich, je nachdem, aus welcher Richtung er eben geflogen kommt.

Als Ansatz würde ich dir mal empfehlen, dir das aufzumalen (Mittelpunkt vom Ball, Kreis drum rum, Punkt auf dem Kreis (die Ecke), und einen Pfeil für die angenommene Bewegungsrichtung des Balls). Denke wenn du dir da dann die Verbindungslinie von Mittelpunkt zu Ecke einmalst, und den Richtungsvektor der Bewegung in eine Komponente in die Richtung dieser Verbindungslinie, und eine Komponenten orthogonal dazu zerlegst, ergibt sich die Lösung von selbst (die Komponente in Richtung der Verbindungslinie muss einfach invertiert werden).
Der Rechenaufwand dafür ist sehr überschaubar, denke es lässt sich mit einem Skalarprodukt und einem (pseudo 2D) Kreuzprodukt machen.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 07-08-2009, 06:41   #7 (permalink)
Neuer User
 
Registriert seit: Oct 2007
Beiträge: 11
Ne das Array deckt alle möglichkeiten ab, da sich sowohl der Schläger wie auch der Ball nur um komplette Pixel bewegen gibt es genau 10 sonderfälle wenn er drauf trifft.

Dann benötige ich bei einer kollision nur die differenz der y werte von dem Schläger und dem Ball wozu ich eine kleine Formel habe die dann die neue y geschwindigkeit des Balls definiert.

Ich will daraus ja keine Wissenschaft machen, es ist nur Pong und dient primär zur Erforschung und Erprobung von Multiplayer spielen.
el_sheepy ist offline   Mit Zitat antworten
Alt 07-08-2009, 10:03   #8 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Das kommt darauf an, ob der Ball "realistisch" abprallen soll (dann muss man die Richtung aus der der Ball kommt berücksichtigen) oder ob nur abhängig vom Punkt an dem er auftrift abprallen soll (dann ist die Ecke aber auch kein Sonderfall)
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp 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:19 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele