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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20-10-2006, 12:35   #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 erste teil ist die quatrantenunterscheidung im 2. die Kolisionen;
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
triger23 ist offline   Mit Zitat antworten
Alt 20-10-2006, 12:51   #2 (permalink)
Flashbitch
 
Benutzerbild von X-Tender
 
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
X-Tender ist offline   Mit Zitat antworten
Alt 20-10-2006, 12:56   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2006
Beiträge: 24
ok ich werde erstmal schauen was es mit den bewegungsvectoren auf sich hat und frames hab ich nur 1, also nur ein Bild wenn ich das richtig interpretiert habe
triger23 ist offline   Mit Zitat antworten
Alt 20-10-2006, 13:23   #4 (permalink)
Flashbitch
 
Benutzerbild von X-Tender
 
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
X-Tender ist offline   Mit Zitat antworten
Alt 20-10-2006, 13:42   #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;
triger23 ist offline   Mit Zitat antworten
Alt 20-10-2006, 14:43   #6 (permalink)
Flashbitch
 
Benutzerbild von X-Tender
 
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
X-Tender ist offline   Mit Zitat antworten
Alt 20-10-2006, 15:14   #7 (permalink)
Neuer User
 
Registriert seit: Oct 2006
Beiträge: 24
nein nein ist schon ok so, hab das prinzip aufjedenfall verstanden;

da danke ich dir ersteinmal für deine schnelle und kompetente hilfe

gruß marco
triger23 ist offline   Mit Zitat antworten
Alt 20-10-2006, 18:08   #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
double-stroke ist offline   Mit Zitat antworten
Alt 20-10-2006, 22:40   #9 (permalink)
Neuer User
 
Registriert seit: Oct 2006
Beiträge: 24
wow auch dir ein fetten dank, ich werde mich erstmal mit den vectoren beschäftigen, diese methode is mir neu und verstehen will ich sie ja auch;

also nochmals danke und bis die tage;

gruß
triger23 ist offline   Mit Zitat antworten
Alt 21-10-2006, 13:24   #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();
Ball:
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;
		}
}
es fehlen noch die feinheiten, aber hab ichs jetzt so wie ihr es meint?
ich hoffe!

gruß

Geändert von triger23 (21-10-2006 um 13:32 Uhr)
triger23 ist offline   Mit Zitat antworten
Alt 21-10-2006, 21:20   #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
double-stroke ist offline   Mit Zitat antworten
Alt 22-10-2006, 00:22   #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)
triger23 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:17 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele