Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 22-08-2003, 17:23   #1 (permalink)
Foo Fighter
 
Registriert seit: Oct 2002
Ort: Hölle
Beiträge: 270
Arrow Bomberman-Klon

Hallo an alle,

ich bin seit ein paar Wochen dabei das Classic-Game
Bomberman in Flash nachzubauen.
So weit so gut: es gibt einen Spieler, es gibt undurchdringliche
Felder es gibt Bomen und jeeeeede Menge hitTests.
Und die liegen nämlich in einem onClipEvent (enterFrame)
auf dem Spieler-MC.
Der Spieler wird über die Pfeiltasten gesteuert und alles funktioniert(e) so weit auch ganz schick. Nun habe ich von einer problemlos funktionierenden Version des Spiels ausgehend ein paar grafische Veränderungen am Spieler vorgenommen, und sobald man nun die Pfeiltaste 'Oben' drückt stürzt der Flashplayer ab. Es scheint als wäre der Player nun plötzlich überfordert, dennoch finde ich das sehr merkwürdig. Es kann sein, dass es einfach zu viel Script ist... das ürbrigend recht einfach gestrickt ist und vielleicht schon einfach deshalb übertragen viele Seiten lang ist. Aber ob das der Fehler ist?
Ich habe die Flashfile auf einen Server gepackt:
http://members.aol.com/fthemainstrea.../bomberman.zip

Wie gesagt: das Script wurde seit einer funktionierenden Version nicht verändert! Lediglich winzige grafische Veränderungen am Spieler wurden vorgenommen...

Danke und 'viel Spaß' an alle, die sich damit auseinandersetzen
wollen.
__________________
keep on rockin'
NoMainstream ist offline   Mit Zitat antworten
Alt 22-08-2003, 18:03   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Oha, das ist wirklich eine Menge Code
Du solltest dringend das Prinzip einer Schleife lernen. Damit könntest du den Code extrem verkleinern. Als Beispiel habe ich mal die ersten 3 if als Schleife in Funktionen gepackt:

ActionScript:
  1. onClipEvent(load){
  2.                 // teste ob oben einen block berührt
  3.     function hitTestBlocks( start, end){
  4.         for( var i=start; i<=end; i++){
  5.             if( oben.hitTest(_level0["block" + i]){
  6.                 return true;
  7.             }
  8.         }
  9.         return false;
  10.     }
  11.  
  12.                 // teste ob oben oder center eine der bomben berührt
  13.     function hitTestBombe( start, end){
  14.         for( var i=start; i<=end; i++){
  15.             var bombe = _level0["feld" + i].bombe;
  16.             if( oben.hitTest( bombe) && center.hitTest(bombe)){
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
  22.                 // teste ob oben eine der bomben berührt
  23.     function hitTestBombe2( start, end){
  24.         for( var i=start; i<=end; i++){
  25.             var bombe = _level0["feld" + i].bombe;
  26.             if( oben.hitTest( bombe)){
  27.                 return true;
  28.             }
  29.         }
  30.         return false;
  31.     }
  32. }
  33. onClipEvent (enterFrame) {
  34.     // HIT-TEST für OBEN_____
  35.     if (Key.isDown(Key.UP) and not hitTestBlocks(1, 16) and Number(_y) > 25) {
  36.         // HIT-TEST für OBEN - BOMBEN_____
  37.  
  38.         if ( hitTestBombe(1, 65)){
  39.             this._y = Number(_y) - Number(_level0:speed);
  40.             tellTarget ("spieler_ani") {
  41.                 gotoAndStop("oben");
  42.             }
  43.         } else if (not hitTestBombe2(1,65)) {
  44.             this._y = Number(_y) - Number(_level0:speed);
  45.             tellTarget ("spieler_ani") {
  46.                 gotoAndStop("oben");
  47.             }
  48.         }
  49.  
  50. // hier geht es noch endlos weiter ....
  51.  

Die Namen der Funktionen kann man sicher besser waehlen, ich wusste ja nicht genau, was deine Abfragen bezwecken sollen. Du kannst aber schon sehen, dass der Code so viel kürzer und prägnanter wird.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 22-08-2003, 18:59   #3 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Hier ist das Spielerscript von 84K auf 4K geschrumpft:

ActionScript:
  1. onClipEvent (load) {
  2.     function hitTestBlocks(clip) {
  3.         for (var i = 1; i <= 16; i++) {
  4.             if (clip.hitTest(_level0["block" + i])) {
  5.                 return true;
  6.             }
  7.         }
  8.         return false;
  9.     }
  10.     // 
  11.     function hitTestBombe(clips) {
  12.         for (var i = 1; i <= 65; i++) {
  13.             var bombe = _level0["feld" + i].bombe;
  14.             var result = true;
  15.             for (var j = 0; j < arguments.length; j++) {
  16.                 if (!arguments[j].hitTest(bombe)) {
  17.                     result = false;
  18.                     break;
  19.                 }
  20.             }
  21.             if (result) {
  22.                 return true;
  23.             }
  24.         }
  25.         return false;
  26.     }
  27.     //
  28.     function check1(val) {
  29.         if (val > 104 and val < 134) {
  30.             val = 125;
  31.         } else if (val > 204 and val < 234) {
  32.             val = 225;
  33.         } else if (val > 304 and val < 334) {
  34.             val = 325;
  35.         } else if (val > 404 and val < 434) {
  36.             val = 425;
  37.         }
  38.     }
  39.     //
  40.     function check2(val) {
  41.         if (val > 0 and val < 100) {
  42.             val = 25;
  43.         } else if (val > 134 and val < 200) {
  44.             val = 125;
  45.         } else if (val > 234 and val < 320) {
  46.             val = 225;
  47.         } else if (val > 334 and val < 420) {
  48.             val = 325;
  49.         }
  50.     }
  51. }
  52. //
  53. onClipEvent (enterFrame) {
  54.     // HIT-TEST für OBEN____________________________
  55.     if (Key.isDown(Key.UP) and not hitTestBlocks(oben) and _y > 25) {
  56.         // HIT-TEST für OBEN - BOMBEN____________________________
  57.         if (hitTestBombe(center, oben) || not hitTestBombe(oben)) {
  58.             _y -= _level0.speed;
  59.             spieler_ani.gotoAndStop("oben");
  60.         }
  61.         // Hier wird abgefragt ob sich der Spieler an der Ecke eines Steines befindet
  62.         if (hitTestBlocks(ol)) {
  63.             _x = check1(_x);
  64.         } else if (hitTestBlocks(ore)) {
  65.             _x = check2(_x);
  66.         }
  67.         // HIT-TEST für UNTEN____________________________
  68.     } else if (Key.isDown(Key.DOWN) and not hitTestBlocks(unten) and _y < 425) {
  69.         // HIT-TEST für UNTEN - BOMBEN____________________________
  70.         if (hitTestBombe(center, unten) || not hitTestBombe(unten)) {
  71.             _y += _level0.speed;
  72.             spieler_ani.gotoAndStop("unten");
  73.         }
  74.         // Hier wird abgefragt ob sich der Spieler an der Ecke eines Steines befindet
  75.         if (hitTestBlocks(ul)) {
  76.             _x = check1(_x);
  77.         } else if (hitTestBlocks(ur)) {
  78.             _x = check2(_x);
  79.         }
  80.         // HIT-TEST für LINKS____________________________
  81.     } else if (Key.isDown(Key.LEFT) and not hitTestBlocks(links) and _x > 25) {
  82.         // HIT-TEST für LINKS - BOMBEN____________________________
  83.         if (hitTestBombe(center, links) || not hitTestBombe(links)) {
  84.             _x -= _level0.speed;
  85.             spieler_ani.gotoAndStop("links");
  86.         }
  87.         // Hier wird abgefragt ob sich der Spieler an der Ecke eines Steines befindet
  88.         if (hitTestBlocks(lo)) {
  89.             _y = check1(_y);
  90.         } else if (hitTestBlocks(lu)) {
  91.             _y = check2(_y);
  92.         }
  93.         // HIT-TEST für RECHTS_______
  94.     } else if (Key.isDown(Key.RIGHT) and not hitTestBlocks(rechts) and _x < 425) {
  95.         // HIT-TEST für RECHTS - BOMBEN_______
  96.         if (hitTestBombe(center, rechts) || not hitTestBombe(rechts)) {
  97.             _x += _level0.speed;
  98.             spieler_ani.gotoAndStop("rechts");
  99.         }
  100.         // Hier wird abgefragt ob sich der Spieler an der Ecke eines Steines befindet
  101.  
  102.         if (hitTestBlocks(ro)) {
  103.             _y = check1(_y);
  104.         } else if (hitTestBlocks(ru)) {
  105.             _y = check2(_y);
  106.         }
  107.     }
  108.     // HIT-TEST FÜR FEUER________
  109. }

Die Zahlenvariablen auf root solltest du als Zahl und nicht als String schreiben, damit es funktioniert, also speed = 9 anstatt speed = "9".

Viel Spass weiterhin.
mfg r.
bokel ist offline   Mit Zitat antworten
Alt 23-08-2003, 00:22   #4 (permalink)
Foo Fighter
 
Registriert seit: Oct 2002
Ort: Hölle
Beiträge: 270
hey...

hey bokel,

vielen dank für Deine Mühe, ich werde mich damit auf jeden Fall auseinandersetzen!!
__________________
keep on rockin'
NoMainstream ist offline   Mit Zitat antworten
Alt 23-08-2003, 12:04   #5 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Ja, mach mal.
Um es einzubauen, ersetzt du einfach das Script, das auf dem MovieClip spieler liegt, durch das Script von oben.
Anschliessend entfernst du noch in deinem ersten Frame die Hochkommas um die Zahlen.
Dann sollte das klappen.

Nochmal zur Erläuterung:
Die Funktion hitTestBombe testet, ob hitTest der übergebenen MovieClips mit einer der 65 Bomben true ergibt.
Die Funktion hitTestBlocks teset, ob hitTest mit einem der 16 Blocks true ergibt.
Die Funktionen check1 und check2 sind eigentlich genauso wie du den Code vorher hattest, nur als Funktionen geschrieben.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 23-08-2003, 15:23   #6 (permalink)
Foo Fighter
 
Registriert seit: Oct 2002
Ort: Hölle
Beiträge: 270
so weit so gut

ja danke nochmal.
ich könnte zwar dieses script noch nicht so in jedem detail selbst entwerfen, habe aber denke ich das prinzip der funktionen und schleifen verstanden. erstaunlich wieviel zeit und arbeit man sich sparen kann, durch relativ wenige maßnahmen.
Der Klügere spart Zeit....,)
__________________
keep on rockin'
NoMainstream 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 21:35 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele