| |||||||
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) |
| 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();
}
} 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 |
| | |
| | #2 (permalink) |
| muh 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!) |
| | |
| | #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 |
| | |
| | #4 (permalink) |
| muh 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!) |
| | |
| | #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 |
| | |
| | #6 (permalink) |
| muh 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!) |
| | |
| | #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. |
| | |
| | #8 (permalink) |
| muh 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!) |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |