| |||||||
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 2006
Beiträge: 24
| Hilfe Dynamische Ballbewegung
hi @ all bin neu hier und hoffe Hilfe zu finden, ich bin auch recht neu in Flash (3Monate) nun zu meinem Problem: da ich kein Fan von Tuts bin und mir doch lieber selbst den Kopf zerbreche komm ich hin und wieder an gewisse Grenzen. Momentan bastel ich an einer art Pingpong oder auch Breakout; Funktionierte auch alles wunderbar, ist alles noch einfach gestrickt aber nun hat sich da ein problem gezeigt; Der Ball klemmt sich immer mal in der Wand und kommt nich los; das ganze ist so aufgebaut das der Ball eine gewisse Rotation hat und je nachdem um welchen Winkel der Ball gedreht ist, bewegt er sich auch da hin; bei der Kollision mit den Wänden wird ganz einfach "Eintritswinkel = Austritzwinkel genutzt", ich hab keinerlei Tut dazu also könnt es sicher sein das sich der ein oder andere über meine Technik wunder könnt mich ja eines besseren belehren;aber hier erstmal der code: Code: onClipEvent (load) {
speed=10;
this._rotation=60;
}
onClipEvent (enterFrame) {
_root.txt.text=this._rotation;
if(this._rotation>=0 && this._rotation<=90){
this._y=this._y-(speed*(90-this._rotation))/100;
this._x=this._x+(speed*this._rotation)/100;
}
//Q2
if(this._rotation<=0 && this._rotation>=-90){
this._y=this._y-(speed*(90+this._rotation))/100;
this._x=this._x+(speed*this._rotation)/100;
}
//Q3
if(this._rotation<=-90 && this._rotation>=-180){
this._y=this._y+(speed*(-90-this._rotation))/100;
this._x=this._x-(speed*(180+this._rotation))/100;
}
//Q4
if(this._rotation>=90 && this._rotation<=180){
this._y=this._y+(speed*(-90+this._rotation))/100;
this._x=this._x+(speed*(180-this._rotation))/100;
}
if (this.hitTest(_root.barup)) {
if(this._rotation<0){
this._rotation=-180-this._rotation;
}else{
this._rotation=180-this._rotation;
}
}
if (this.hitTest(_root.bardown)) {
if(this._rotation<0){
this._rotation=-180-this._rotation;
}else{
this._rotation=180-this._rotation;
}
}
if (this.hitTest(_root.barr)) {
this._rotation=-this._rotation;
}
if (this.hitTest(_root.barl)) {
this._rotation=-this._rotation;
}
if (this.hitTest(_root.player)) {
if (this.hitTest(_root.player.mitte)) {
if(this._rotation<0){
this._rotation=-180-this._rotation-20;
}else{
this._rotation=180-this._rotation-20;
}
}
if (this.hitTest(_root.player.linke)) {
this._rotation=-45;
}
if (this.hitTest(_root.player.rechte)) {
this._rotation=45;
}
}
_root.txt.text=this._rotation;
} der code liegt auf dem ball; und die Bars sind die Wände und der player der Schläger; letztlich lasse ich mir die momentane Rotation anzeigen; immer wenn er verhackt wechselt die Rotation immer hin und her vom positiven ins negative; das lustige ist, ich hab die geschichte auf 2 projekten genutzt und der Fehler zeigt sich auf beiden unterschiedlich, also der Ball verhackt immer an anderer stelle; BSP1 BSP2 beide Bsps haben den gleichen code, jedoch wird beim 2. das problem klar hoffe mir kann einer weiterhelfen gruß marco |
| | |
| | #2 (permalink) |
| Flashbitch Registriert seit: Oct 2003 Ort: Hannover
Beiträge: 279
|
1. würde ich die bewegung mit bewegungsvectoren machen. 2. nicht mit hittest für die ränder sondenr mit positions abfrage (werde ich beim nächsten frame über den ran schauen? wenn ja dann änder ich den bewegungsvector und setzt voher die possition des balels so das ich die wand berühre.
__________________ Fuchtelworld |
| | |
| | #4 (permalink) |
| Flashbitch Registriert seit: Oct 2003 Ort: Hannover
Beiträge: 279
|
frame != frame .. frame == der aktuelle render frame bzw halt in dem fall der näcshte render frame, ich meien du must halt in die zukunt schauen, nicht erst "hoppla der ball ist ja über die bagrenzung hinaus, also änder ich die bewegung" du must schauen ob beim näcshten bewegen des balles er draussen ist ...
__________________ Fuchtelworld |
| | |
| | #5 (permalink) |
| Neuer User Registriert seit: Oct 2006
Beiträge: 24
|
also ist der fehler, dass der ball in die bariere knalt, die richtung ändert, aber weil er noch in der bariere hängt die richtung wieder ändert und somit immer hin und her fliegt; (muss keiner verstehn^^) alles klar soweit verstanden nur wie mache ich das denn mit der "In die Zunkunft schauen" hihi soll ich da eine zweit berechnung machen alla n+1 und wenn der zu erwartende wert die bariere überschreiten solte wird er halt zurück geworfen, oder meinst du das anderst? ich warte noch auf deine antwort dann mache ich mich ran; |
| | |
| | #6 (permalink) |
| Flashbitch Registriert seit: Oct 2003 Ort: Hannover
Beiträge: 279
|
XPosAtNextFrame = _x + (xMoveVector*speed); if (XPosAtNextFrame > seiteRechts){ trace("wenn ich mich das nöäcshte mal bewege dann treffe ich was"); } vereinfacht dargestellt .. aber ich kan dir wohl schlecht alles in den den schoß legen ..
__________________ Fuchtelworld |
| | |
| | #8 (permalink) |
| Neuer User Registriert seit: Mar 2006
Beiträge: 28
| Kollision mit Rändern
Deine Lösung ist super, aber sehr aufwändig. Denn solange Bälle nur von Rändern abprallen sollen, reicht es völlig, an den Seiten den X-Vektor und oben und unten den Y-Vektor umzudrehen, also mit -1 zu multiplizieren. 1. Bewegungsvektoren: Du hängst an die Instanz des MC mit dem Ball einfach zwei Variablen an: vx und vy ball.vx = 0; ball.vy = 0; Diese Vektoren nehmen Werte an. Um diese Werte werden sie in jedem Frame versetzt. ist vx = 1 und vy = 0, fliegt der Ball nach rechts, ist vx -1, dann fliegt er nach links. In beiden Fällen ziemlich langsam. Sind beide 10, fliegt er ziemlich schnell nach rechts unten. 2. Reflektion der Werte an den Rändern: Kommt der Ball an der linken Wand an, dann ist sein _x kleiner als das Minimum, also Rand + Radius. In diesem Fall muß man den x-Vektor vx einfach nur umdrehen. if(ball._x < rand + radius) { ball.vx *= -1; // oder ball.vx = -ball.vx; wie Du willst } Der Ausfallwinkel "dreht" sich durch diese Maßnahme automatisch um 90 Grad. Ebenso, nur eben mit dem Y-Vektor, verfährst Du mit den Rändern oben und unten. 3. Ball steckt im Rand fest: Das passiert, weil der Ball ja erst in den Rand eindringen muß, damit die Kollision erkannt wird. Er sollte also sofort nach der Kollisionserkennung wieder "herausgezogen" werden. if(ball._x < rand + radius) { ball.vx *= -1; ball._x = rand + radius; // UM DIESE ZEILE GEHTS JETZT } Dann kann der Ball auch dann nicht im Rand feststecken, wenn die Geschwindigkeits-Vektoren z.B. durch Reibung oder Prallverluste reduziert werden. Damit es komplett perfekt ist, müßte man jetzt den Geschwindigkeits-Vektoren EINMALIG um den Betrag reduzieren, um den der Ball vom Rand weggezogen wurde. Aber diese Korrekturen sind eher akademisch, falls Du die Präzision einer Simulation brauchst. Ich verzichte darauf in der Regel. 5. Tutorial: Ich habe ein Tutorial auf meiner HP, besser gesagt eine auskommentierte FLA-Datei, in der Bälle mit den Rändern und untereinander Kollidieren. Wenn Du die Kollisionen untereinander wegläßt und nur einen Ball nimmst, dann hast Du ein System wie Du es für ein Breakout brauchst. www.dazine.de (Menüpunkt "Flash"); Bis dann Dirk |
| | |
| | #10 (permalink) |
| Neuer User Registriert seit: Oct 2006
Beiträge: 24
|
so habe mich mal hingesetzt und hoffe es so gemacht zu haben wie ihr es gemeint habt, möchte nur mal eoine bestätigung das ich nicht auf den holzweg fahre ![]() Bild 1: Code: _root.ball.vx=20; _root.ball.vy=-30; _root.ball.vs=10; stop(); Code: onClipEvent (enterFrame) {
Kolision(this.vx,this.vy,this.vs);
Bewegen(this.vx,this.vy,this.vs);
function Kolision(vx,vy,vs){
if (this._y+this.vy*this.vs >= 390) {
this.vy=-this.vy;
}
if (this._y+this.vy*this.vs <= 10) {
this.vy=-this.vy;
}
if (this._x+this.vx*this.vs >= 390) {
this.vx=-this.vx;
}
if (this._x+this.vx*this.vs <= 10) {
this.vx=-this.vx;
}
}
function Bewegen(vx,vy,vs){
this._y=this._y+vy*vs;
this._x=this._x+vx*vs;
}
} ich hoffe! gruß Geändert von triger23 (21-10-2006 um 13:32 Uhr) |
| | |
| | #11 (permalink) |
| Neuer User Registriert seit: Mar 2006
Beiträge: 28
| Sieht ganz gut aus
Hallo, ich verstehe nicht ganz, was .vs tut. Die x- und y-Vektoren werden damit ständig multipliziert, sodaß sich riesige Geschwindigkeiten ergeben, weil .vs ja 10 ist. Wofür brauchst Du .vs? Wenn Du willst, daß .vx und .vy um das zehnfache größer sind, dann definier sie doch gleich so. Sehr elegant, wie Du das Problem mit dem Feststecken in den Wänden umgangen hast. Du rechnest einfach aus, wo der Ball im nächsten Frame wäre. Nett. Einziges Problem: Der Ball kehrt immer schon VOR der Wand um, und zwar im schlimmsten Fall um den Vektor zu früh. Aber bei relativ geringen Tempi macht das nichts aus. So ersparst Du Dir auf jeden Fall, denn Ball wieder herauszuziehen. Noch zur Programmiertechnik: Wenn Du in onEnterFrame die Funktionen Kollision und Bewegen aufrufst, warum schreibst Du die Funktionen dann IN die onEnterFrame-Schleife? So muß das System die Funktion in jedem Frame neu auslesen. Schreib sie doch außerhalb dieser Schleife oder laß sie einfach weg, schreib die Funktionen also einfach in die onEnterFrame-Abfrageschleife. Dazu kommt noch, daß onClipEvent (enterFrame) wirklich ein wenig alst ist. onEnterFrame = function() {} ist wohl moderner. Aber wie gesagt, sieht gut aus. Bis dann Dirk |
| | |
| | #12 (permalink) |
| Neuer User Registriert seit: Oct 2006
Beiträge: 24
|
hi ich hab vor im spiel die geschwindigkeit durch irgendwelche eingesamelten gegenstände auch zu ändern und naja, dazu ist "vs" da; vx und vy sind jettt als startwert 1; ok ich denke den rest werde ich soweit schon hin bekommen; normals vielen dank; gruß Geändert von triger23 (22-10-2006 um 00:25 Uhr) |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |