Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 22-02-2002, 19:42   #1 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
Game „Breakout“ Kollisionen usw.......

Hallo.....

An sich das alte Spielprinzip..... 3 Wände und einen Balken denn man mit Hilfe der Cursor Tasten links rechts bewegt.. und so verhindert das der Ball unter den Balken kommt..
So viel zum Grund Prinzip.
Funktioniert so weit auch.

Mein Gedanke wahr nun „Ich möchte nicht nur gerade Wände haben sondern eine Art Level Generator erstellen.
Damit ich dies jedoch kann, brauch ich Bausteine.. (wie Legosteine) und so verwinkelte Levels bauen zu können....

Ich habe dafür Folgende Elemente (MCs) definiert... und in das MC „Level“ gepackt

Ein Baustein hat die Länge (somit Kollisionsfläche) von 30 Pixel.

- 12 MCs für Links (rot) Ball springt nach rechts weg nach Kollision
- 12 MCs für Rechts (blau) Ball springt nach links weg nach Kollision
- 16 MCs für Oben (grün) Ball springt nach unten nach Kollision
- 6 MCs für Unten (gelb) Ball springt nach oben weg nach Kollision


mit Hilfe dieser Bausteine habe ich eine Level gebaut welches nicht nur gerade Wände hat.

Auf dem Ball liegt Folgender Code:

==================================
PHP-Code:
 // Start Punkt des Balls
onClipEvent (load) {
    
this._x random(150)+165;
    
this._y random(120)+65;
}
// Start Bewegung des Balls
onClipEvent (enterFrame) {
    
this._x += bx_speed;
    
this._y += by_speed;
// Kollision Balken
    
if (this.hitTest(_root.bar.hit)) {
         
by_speed = -by_speed;
    }
// kollision Level
// ----> rechts
    
if (this.hitTest(_root.level.rechts1)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts2)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts3)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts4)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts5)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts6)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts7)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts8)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts9)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts10)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts11)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.rechts12)) {
         
bx_speed = -bx_speed;
    }
 
// ----> links
     
if (this.hitTest(_root.level.links1)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links2)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links3)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links4)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links5)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links6)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links7)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links8)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links9)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links10)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links11)) {
         
bx_speed = -bx_speed;
    }
    if (
this.hitTest(_root.level.links12)) {
         
bx_speed = -bx_speed;
    }
// ----> oben
    
if (this.hitTest(_root.level.oben1)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben2)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben3)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben4)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben5)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben6)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben7)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben8)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben9)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben10)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben11)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben12)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben13)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben14)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben15)) {
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.oben16)) {
         
by_speed = -by_speed;
    }
// ----> unten
    
if (this.hitTest(_root.level.unten1)) { 
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.unten2)) { 
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.unten3)) { 
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.unten4)) { 
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.unten5)) { 
         
by_speed = -by_speed;
    }
    if (
this.hitTest(_root.level.unten6)) { 
         
by_speed = -by_speed;
    }
// ----> Kollision unten (Game Over)
    
if (this._y>360) {
        
gotoAndStop (1);
    }

==================================

Mein Problem ist nun…… das ab und zu der Ball einfach durch die Wand läuft….. Sprich die Kollisions- abfrage nicht greift..... kann es Sein das es einfach zu viele IF Abfragen auf einem Element (dem Ball) sind????

Weiteres muss ich die Aktivflächen (Legobausteine) überlaben.. Sonst bekomme ich einen Ping Pong Effekt.. ist das Normal oder woran liegt das?

Meine abfrage
PHP-Code:
// ----> Kollision unten (Game Over)
    
if (this._y>360) {
    
gotoAndStop (1);
    } 
unten will auch nicht so richtig....
Was mir im Moment nicht ganz k ist....

Bin für Ideen in jede Richtung dankbar....

DANKE!
Angehängte Dateien
Dateityp: zip breakout.zip (6,4 KB, 36x aufgerufen)
Scrawer ist offline   Mit Zitat antworten
Alt 22-02-2002, 19:47   #2 (permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Wiesbaden
Beiträge: 10.945
:d sehr umständlich geproggt.....
sebastian ist offline   Mit Zitat antworten
Alt 22-02-2002, 19:49   #3 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
wie würdest Du es machen????
könnte ja auch sein das ich den ganz Falschen Weg für die lösung gehe..... nur wüsste ich nicht wie sonst...
Scrawer ist offline   Mit Zitat antworten
Alt 22-02-2002, 19:51   #4 (permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Wiesbaden
Beiträge: 10.945
Nee.. Bin nicht vom Lösungsansatz ausgegangen:
Du könntest die Zeilen mit dem hitTest aber ziemlich verkürzen (da würden 3 oder 4 zeilen genügen)

Aber Johannes wird dir helfen könnnen, der ist unser Breakout Experte

Sebastian
sebastian ist offline   Mit Zitat antworten
Alt 22-02-2002, 19:54   #5 (permalink)
auferstanden
 
Benutzerbild von Johannes P.
 
Registriert seit: Sep 2001
Ort: München
Beiträge: 5.247
Hoi

geht auch kürzer, wobei natürlich nicht gerade performanceschonend:
PHP-Code:
// Start Punkt des Balls
onClipEvent (load) {
    
this._x random(150)+165;
    
this._y random(120)+65;
}
// Start Bewegung des Balls
onClipEvent (enterFrame) {
    
this._x += bx_speed;
    
this._y += by_speed;
// Kollision Balken
    
if (this.hitTest(_root.bar.hit)) {
         
by_speed = -by_speed;
    }
// ----> rechts
    
for (i=1i<=12i++) {
        if (
this.hitTest(_root.level["rechts"+i])) {
            
bx_speed = -bx_speed;
        }
    }
// ----> links
    
for (i=1i<=12i++) {
        if (
this.hitTest(_root.level["links"+i])) {
            
bx_speed = -bx_speed;
        }
   }
// ----> oben
    
for (i=1i<=16i++) {
        if (
this.hitTest(_root.level["oben"+i])) {
            
by_speed = -by_speed;
        }
    }
// ----> unten
    
for (i=1i<=6i++) {
        if (
this.hitTest(_root.level["unten"+i])) {
            
by_speed = -by_speed;
        }
    }

__________________

Gruß
Johannes
¬ Homepage
¬ Tutorials und FAQs Forum
¬ Suchen und Finden
Johannes P. ist offline   Mit Zitat antworten
Alt 22-02-2002, 20:00   #6 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
Ok.... das ist mir noch k...... an sich wollte ich mal den sicheren Weg gehen... optimieren der Scripts am Ende... mein Problem ist ja eigentlich das die Kollisions- abfrage nicht immer geht...
Kann sein das es bei 10 Kollisionen 9 mal geht und dann aber auch mal gar nicht......

Wenn ihr die fla mal startet werdet ihr es merken... das der Ball ab und zu einfach durch die Wand läuft
Scrawer ist offline   Mit Zitat antworten
Alt 22-02-2002, 21:30   #7 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
klassisches breakout funktioniert ja so,
dass die steine nacheinander verschwinden.

hittests mit nicht vorhandenen steinen
machen aber nicht viel sinn, oder ?

am einfachsten und am effizientesten
ist es, die steine den hittest machen zu lassen.


mfg r.
bokel ist offline   Mit Zitat antworten
Alt 23-02-2002, 11:19   #8 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
So weit bin ich noch nicht.. im Moment kämpfe ich noch mit den Wänden..... die Steine die dann weggesprengt werden mach ich den hitTest natürlich am Stein selber....
Aber der Gedanke hat was... müsste mal versuchen was ist wenn ich auch auf die Wandelemente (wie oben beschrieben 46 Elemente) den HitTest lege um den Ball abprallen zu lassen... und nicht auf den Ball selber....

Danke!
Scrawer ist offline   Mit Zitat antworten
Alt 23-02-2002, 12:45   #9 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
ausserdem musst du bei erfolgreichem hittest dafuer
sorgen, dass der ball anschliessend wieder im feld und
nicht auf dem stein ist, sonst prallt er nicht ab

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 23-02-2002, 18:01   #10 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
Danke...... habe denn hitTest nun auf die Wand Elemente gelegt.... und das ganze funktioniert nun soweit....
Scrawer ist offline   Mit Zitat antworten
Alt 24-02-2002, 13:53   #11 (permalink)
Animateur
 
Registriert seit: Aug 2001
Ort: Gießen
Beiträge: 72
Hi
Auch wenn es jetzt mit dem Wandhittest funktioniert, wirst du wahrscheinlich ein Problem bekommen, wenn der Ball schneller wird. Dann wird er nämlich auch durch die Wand fliegen, da eine Linie als Kollisionsfläche sehr dünn ist.

Und wenn sich der Ball z.B. 12 px pro frame bewegt, kann es sein daß er in einem Frame vor der Linie ist, und dann im nächsten schon dahinter. Du solltest vielleicht die Kollisionsfläche nach hinten hin größer machen. Dann mußt du allerdings bei einer Kollision den Ball erst wieder vor die Linie setzten und dann die Richtung ändern, sonst fliegt der Ball Zickzack, wenn er zu weit in die Kollisionsfläche hineingekommen ist.

Hoffe ich könnte das einigermaßen verständlich erklären.

Gruß
makemyday
makemyday ist offline   Mit Zitat antworten
Alt 24-02-2002, 15:56   #12 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
...... also das mit dem Strich habe ich schon bemerkt.. daher habe ich auch die Kollisionsfläche größer gemacht.... aber das Zickzack Problem habe ich in der tat ab und zu........
das mit dem wieder rausetzen hört sich logisch an...... das sollte ich mal versuchen....

Danke für den Tipp!
Scrawer ist offline   Mit Zitat antworten
Alt 26-02-2002, 08:23   #13 (permalink)
Animateur
 
Registriert seit: Aug 2001
Ort: Gießen
Beiträge: 72
Hab das Spiel selber mal gebastelt. Zu sehen unter www.medialis.de

Viel Spaß noch damit

makemyday
makemyday 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 14:06 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele