Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 01-12-2003, 23:15   #1 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
kollisionserkennung über hittest zu langsam ?

hi, hab ein wenig mit
kollision etc. rumgespielt und als basis
teile eines scriptes hier aus dem forum
benutzt. läuft auch , aber irgendwie scheint
hittest nicht so recht zuverlässig zu sein.
mitunter tanzt der ball an den abzufragenden
objekten, als solle es so sein .
dem ist aber nicht so. manchmal "schlägt"
er sogar durch den unteren balken durch,
womit das spiel vergeigt ist. ein anders
mal rattert das teil unter dem balken durch,
so daß der delete.onenterframe befehl (game over)
wenigstens 10 mal ausgelöst werden müßte...ich
hab keine ahnung, woran das liegen mag.

ActionScript:
  1. an.onPress=function()
  2. {
  3.     balken1.removeMovieClip()
  4.     losgehts()
  5. }
  6.  
  7. function losgehts() {   
  8.     an._visible=0
  9.     balken._y = feld._y+feld._height-20;
  10.     balken.swapDepths(5);
  11.     balken._xscale = 20;
  12.     hits = 0;
  13.     txt.text=""
  14.     punkte.text = "";
  15.     speed1 = 5;
  16.     count = 6;
  17.     MovieClip.prototype.los = function(nam) {
  18.         with (nam) {
  19.             speed = speed1;
  20.             filmbreite = _root.feld._width;
  21.             filmhoehe = _root.feld._height;
  22.             radius_x = _width/2;
  23.             radius_y = _height/2;
  24.             _x = _root.feld._x+random(filmbreite-160)+80;
  25.             _y = _root.feld._y+80;
  26.             grenzelinks = _root.feld._x+radius_x;
  27.             grenzerechts = _root.feld._x+filmbreite-radius_x;
  28.             grenzeoben = _root.feld._y+radius_y;
  29.             grenzeunten = _root.feld._y+filmhoehe;
  30.             speedx = speed;
  31.             speedy = speed;
  32.         }
  33.         eval(nam).onEnterFrame = function() {
  34.             balken._x = _root._xmouse;
  35.             with (this) {
  36.                 _x += speedx;
  37.                 _y += speedy;
  38.                 if (_x<grenzelinks || _x>grenzerechts) {
  39.                     speedx = -speedx;
  40.                 }
  41.                 if (_y<grenzeoben) {
  42.                     speedy = -speedy;
  43.                 }
  44.                 if (this.hitTest(_root.feld.unten)) {
  45.                     delete this.onEnterFrame
  46.                     count -= 1;
  47.                     _root['leben'+count].removeMovieClip();
  48.                     if (_root.balken._xscale<100) {
  49.                         _root.txt.text="klick den ball"
  50.                         this.onPress = function() {
  51.                             _root.balken._xscale += 20;
  52.                             _root.balken1._xscale += 20;
  53.                             _root.balken1.move();
  54.                             _root.speed1 += 1;
  55.                             _root.los(this);
  56.                             _root.txt.text=""
  57.                         };
  58.                     } else {
  59.                         balken1.removeMovieClip()
  60.                         delete this.onEnterFrame;
  61.                         delete this.onPress;
  62.                         _root.txt.text=" neues spiel"
  63.                         _root.an._visible=1
  64.                     }
  65.                 }
  66.                 if (this.hitTest(_root.balken)) {
  67.                     speedy = -speedy-0.05;
  68.                     hits++;
  69.                     _root.punkte.text = hits;
  70.                 }
  71.                 if (this.hitTest(_root.balken1)) {
  72.                     speedy = -speedy-0.05;
  73.                 }
  74.             }
  75.         };
  76.     };
  77.     for (var i = 1; i<6; i++) {
  78.         _root.attachMovie('leben', 'leben'+i, i+100, {_x:150+(i*10), _y : punkte._y});
  79.     }
  80.     _root.attachMovie('ball', 'ball', 1, {_xscale:50, _yscale:50});
  81.     _root.attachMovie('balken', 'balken1', 2, {_xscale:20, _y:_root.feld._y+100, _x:_root.feld._y+50});
  82.     _root.balken1.swapDepths(8);
  83.     _root.balken1.move();
  84.     los(_root.ball);
  85. }
  86. MovieClip.prototype.move = function() {
  87.     zcount = 0;
  88.     this.zielr = _root.feld._x+_root.feld._width-(this._width/2);
  89.     this.ziell = _root.feld._x+(this._width/2);
  90.     this.onEnterFrame = function() {
  91.         if (zcount == 0) {
  92.             this._x<this.zielr ? this._x += speed1 : zcount=1;
  93.         } else {
  94.             this._x>this.ziell ? this._x -= speed1 : zcount=0;
  95.         }
  96.     };
  97. };
  98. losgehts();


mal probieren


hat jemand ähnliche erfahrungen ?
warrantmaster ist offline   Mit Zitat antworten
Alt 02-12-2003, 08:33   #2 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
hab's mir jetzt nicht genauer angesehen ... (bisserl lang am morgen) ... aber wir haben auch mal so eine stosssimulation gebastelt und sind mit 'hittest' nirgendwo hingekommen ...
... ging alles über berechnung des ballmittelpunktes. dabei haben wir aber schon immer im voraus berechnet, ob er im nächsten frame das ziel schneidet. war das der fall, haben wir dann auch den ort nach dem stoss berechnet und ihn dort hin gesetzt (v ändern!) ...

jo soweit ...
__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 02-12-2003, 08:46   #3 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
@pius

in die richtung hab ich auch schon überlegt, ist allerdings
eine umständliche sache.
irgendwie ist das mit der verzögerung allerdings bei genauem nachdenken nicht ganz unlogisch, da der hittest ja das
signal zum negativieren der richtung erst geben muß,
sodaß die umsetzung ja erst im nächsten frame passieren kann.
(denke ich mal )
muß man also wahrscheinlich doch irgendwie anders herangehen,
indem man die noch abzuarbeitende wegstrecke mit einbezieht, wie du es im prinzip andeutest. (mühsal, und sicher für olle rechner nicht so einfach )

grz
warrantmaster ist offline   Mit Zitat antworten
Alt 02-12-2003, 09:01   #4 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
im gegenteil...
die verzögerung entsteht ja nur einmal beim ersten schritt ... danach rechnet er einfach voraus und angezeigt wird es verzögert ...

wir haben damals eine brownsche molekularbewegung mit physikalischem stoss berechnet ... und performancemäßig war das das beste ...


einer meiner studenten hat's ausgeführt:

http://www.stud.tu-muenchen.de/~pius...r_andreas.html


... ja, da sind auch noch kleinere bugs aber der kurs war schon zu ende und der schein schon vergeben ...
__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 02-12-2003, 09:33   #5 (permalink)
Level up
 
Benutzerbild von Alois
 
Registriert seit: Jun 2001
Ort: Bocholt
Beiträge: 4.155
hähä, schönes Beispiel pius... besonders weil es auch in Deinem Beispiel genau zu dem Problem kommt, daß warrantmaster eigentlich behoben haben wollte
Zitat:
....mitunter tanzt der ball an den abzufragenden Objekten....
so und jetzt Erklärungen hier erstmal ein scriptteil:
ActionScript:
  1. ...
  2. if (this.hitTest(_root.balken)) {
  3.                                         speedy = -speedy-0.05;
  4.                                         hits++;
  5.                                         _root.punkte.text = hits;
  6.                                 }
  7. ...
...mal abgessehen davon, daß diese '-0.05' nicht sehr viel bringen ist dieser scriptteil für das 'Zittern' verantwotlich, warum:
- der Balken trifft die Kugel von der Seite (in der senkrechen Richtung ca. mittig von der Kugel) => hit => die Richtung wird gewechselt nächster Frame
- der Balken liegt immer noch in der Kugel =>hit => die Richtung wird wieder gewechselt => Zittern
....abfangen könntest Du das mit einer zusätzlichen Variable die halt angibt ob es im vorherigen frame bereits zum hit gekommen ist, der Richtungswechsel muss dann halt verhindert werden...

...dann das nächste, die Kugel fliegt 'durch' den Balken:
naja der hitTest wird halt in jedem Frame gemacht, wenn die Kugel im vorherigen frame vor dem Balken liegt und im nachfolgenden dahinter, dann gibts auch kein hit, mögliche workarounds:
- Geschwindigkeit der Kugel halbieren, framerate verdoppeln
- ein hitTest, der nicht die Kugel sondern eine virtuelle Linie zwischen vorheriger und aktueller Kugelposition auf 'hit' testet
- der mathematische Lösungsansatz von Pius

Gruß

Alois
__________________
-Spuckt mir auf den Stuhl, ich will im Grünen sitzen-
Alois ist offline   Mit Zitat antworten
Alt 02-12-2003, 10:10   #6 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
@alois

wie gesagt ... bugs sind noch da ... wobei wir das problem auch als solches erkannt haben ... nur eben nicht mehr umgesetzt ...
__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 02-12-2003, 10:18   #7 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060


@alois

speedy = -speedy-0.05;


nun, die 0.05 bringen zumindest soviel, daß man nicht
vor dem screen sitzt und sich der ball immer wieder
genau auf die selben punkte zubewegt.


das mit der zusätzlichen variablen scheint mir eine
simple wie gute idee zu sein, ich werd das heute abend mal antesten. wenn hit, hittest für x-time deaktivieren.
könnte allerdings bei "ball an seite und auf balken"
zu probs führen.

na mal schauen
warrantmaster ist offline   Mit Zitat antworten
Alt 02-12-2003, 10:32   #8 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
naja, og davor gerade ein hit stattfand reicht nicht aus ... wenn er in eine ecke springt und zb erst unten und gleich danach links berührt ...
mann muss bei hit==true nachsehen, ob man sich von dem objekt wegbewegt und dann den hit unterdrücken ...

@Alois ... im Link sind wir dazu aber leider nicht mehr gekommen ...
__________________
one out of many
pius 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:43 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele