Announcement

Collapse
No announcement yet.

Problem mit If-Abfrage in Action Script

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit If-Abfrage in Action Script

    Hi, ich hab ein Problem in Action Script 2.0 mit if-abfragen.
    Ich möchte folgendes realisieren.:
    Auf dem Feld sind zwei bewegbare Figuren und eine Tonne. Für meine Tests steht Figur (Holger) links und Figur (Mario) rechts. In der mitte der beiden ist die Tonne.
    Beide Figuren sollen in der Lage sein die Tonne anzustoßen bzw in Bewegung zu bringen. (bis hierhin funktioniert auch alles)
    Jetzt kommt der Punkt, wo ich leider verzweifel, sobald die Tonne angestoßen wurde und in Bewegung ist, soll die Tonne nicht mehr erneut angestoßen werden können (bis sie halt anhält irgendwann), im Gegenteil, die Tonne soll die Figur wegstoßen können, nur leider tut der code nicht das was ich mir vorgestellt hab.
    Mein Ansatz war es erstmal die Bewegung der Figuren zu speichern, sprich wenn die Figur sich nicht bewegt =0 und wenn sie sich bewegt =6. Gleiches gilt für die Tonne, nur dass ihre Bewegung höher ist durch den Stoß.
    Im Anschluss soll eine If Abfrage mittels der Bewegung entscheiden, ob die Tonne nun anstoßbar ist oder eben selbst stößt.
    hier ist meine Problemstelle
    Code:
    if(this.hitTest(_root.holger)){
    trace("Holger berührt die Tonne"); 
        if(_this.s>_root.holger.bewegung)
     
        {_root.holger._x=30;
        trace("Holger wird geschmissen");
     
     
        }
        else
        {this.s=30;
        trace("Holger schmeißt Tonne");}
         
    trace("Holger berührt die Tonne nicht mehr");     
    }
    trace("speed mario "+ _root.mario.bewegung );
    trace("speed tonne "+ this.s );
    if(this.hitTest(_root.mario)){
    trace("Mario berührt die Tonne");
    trace("speed mario "+ _root.mario.bewegung );
    trace("speed tonne "+ this.s );
        if(_this.s<_root.mario.bewegung)
        {_root.mario._x+=30;
        trace("Mario wird geschmissen");}
        else
        {this.s=30; 
        trace("Mario schmeißt Tonne");}
         
    trace("Mario berührt die Tonne nicht mehr");         
    }
    _x += s
    trace("speed holger "+ _root.holger.bewegung );
    trace("speed mario "+ _root.mario.bewegung );
    Bei den Tests laufe ich mit Figur Holger gegen die Tonne und diese fliegt auf Figur Mario
    allerdings kommt der Code nie in den bereich, wo steht "Mario wird geschmissen"
    Hier einmal die gekürzte Version vom trace:
    Code:
    speed mario 0
    speed tonne 0
    speed holger 6
    speed mario 0
    start
    speed mario 0
    speed tonne 0
    speed holger 6
    speed mario 0
    start
    Holger berührt die Tonne
    Holger schmeißt Tonne
    Holger berührt die Tonne nicht mehr
    speed mario 0
    speed tonne 30
    speed holger 6
    speed mario 0
    start
    speed mario 0
    speed tonne 30
    speed holger 6
    speed mario 0
    start
    speed mario 0
    start
    speed mario 0
    speed tonne 30
    speed holger 0
    speed mario 0
    start
    speed mario 0
    speed tonne 30
    speed holger 0
    speed mario 0
    start
    speed mario 0
    speed tonne 30
    Mario berührt die Tonne
    speed mario 0
    speed tonne 30
    Mario schmeißt Tonne
    Mario berührt die Tonne nicht mehr
    speed holger 0
    speed mario 0
    Mario hat Speed 0 und die Tonne 30, sprich Marios Bewegung ist höher als die der Tonne, trotzdem wird dieser Block nie ausgeführt
    Code:
        if(_this.s<_root.mario.bewegung)
        {_root.mario._x+=30;
        trace("Mario wird geschmissen");}
    Ich würde mich über eure Antworten, Hinweise und Vorschläge freuen
    Anhang:
    hier nochmal der gesamte Code (ich bin ein Laie, daher verzeiht mir den Codesalat)


    Spoiler:

    Figur Holger:
    Code:
    onClipEvent (load) {
    var ground:MovieClip = _root.ground;
    var grav:Number = 0;
    var gravity:Number = 2;
    var speed:Number = 6;
    var maxJump:Number = -15;
    var touchingGround:Boolean = false;
    scale = _xscale;
    zustand=0;
    sustand=0;
    bewegung=0;
    }
    onClipEvent (enterFrame) {
    _y += grav;
    grav += gravity;
    while (ground.hitTest(_x, _y, true)) {
    _y -= gravity;
    grav = 0;
    }
    if (ground.hitTest(_x, _y+5, true)) {
    touchingGround = true;
    } else {
    touchingGround = false;
    }
    if (Key.isDown(68)) {
            play();
            _x += speed;
            _xscale = scale;
            sustand=6;
            }
    else {sustand=0;}     
    if (Key.isDown(65)) {
            play();
            _x -= speed;
            _xscale = -scale;
            zustand=6;
         
            }
            else {zustand=0;}
         
    if (Key.isDown(Key.UP) ) {
    if(this.hitTest(_root.lila)){
            _root.gotoAndPlay(1331);
            }
    }
    if (Key.isDown(Key.SPACE)&& touchingGround) {
                grav = maxJump;
            }
    if (ground.hitTest(_x+(_width/2), _y-(_height/2), true)) {
    _x -= speed;
    }
    if (ground.hitTest(_x-(_width/2), _y-(_height/2), true)) {
    _x += speed;
    }
    if (ground.hitTest(_x, _y-(height), true)) {
    grav = 3;
    }
    }
    onClipEvent (load) {
    s=0;
    f=0;
    }
    onClipEvent (enterFrame) {
     
     
     
    if(this.hitTest(_root.mario)){
        if ( this._x > _root.mario._x)
        {s=-50;}
        else
        {s=50;}
            f=30;
        }
     
    _x += s;
    _y -= f;
    _root.mario._x += s;
    root.mario._y -= f;
    if(this.hitTest(_root.ground))
    {
     
        s=0;
        f=0;
     
     
         
     
    }
    _x += s
    _y -= s
    bewegung=zustand+sustand;
    }
    Figur Mario
    Code:
    onClipEvent (load) {
    var ground:MovieClip = _root.ground;
    var grav:Number = 0;
    var gravity:Number = 2;
    var speed:Number = 6;
    var maxJump:Number = -15;
    var touchingGround:Boolean = false;
    scale = _xscale;
    zustand=0;
    sustand=0;
    bewegung=0;
    }
    onClipEvent (enterFrame) {
    _y += grav;
    grav += gravity;
    while (ground.hitTest(_x, _y, true)) {
    _y -= gravity;
    grav = 0;
    }
    if (ground.hitTest(_x, _y+5, true)) {
    touchingGround = true;
    } else {
    touchingGround = false;
    }
    if (Key.isDown(Key.RIGHT)) {
            play();
            _x += speed;
            _xscale = scale;
            sustand=6;
            }
            else{sustand=0;}
    if (Key.isDown(Key.LEFT)) {
            play();
            _x -= speed;
            _xscale = -scale;
            zustand=6;
            }
            else{zustand=0;}
    if (Key.isDown(Key.UP) ) {
    if(this.hitTest(_root.lila)){
            _root.gotoAndPlay(1331);
            }
    }
    if (Key.isDown(13)&& touchingGround) {
                grav = maxJump;
            }
    if (ground.hitTest(_x+(_width/2), _y-(_height/2), true)) {
    _x -= speed;
    }
    if (ground.hitTest(_x-(_width/2), _y-(_height/2), true)) {
    _x += speed;
    }
    if (ground.hitTest(_x, _y-(height), true)) {
    grav = 3;
    }
    }
    onClipEvent (load) {
    s=0
    }
    onClipEvent (enterFrame) {
    if(this.hitTest(_root.ground))
    {
     
        s=0;
        f=0;
     
     
         
    }
    bewegung= zustand+sustand;
    }
    Tonne
    Code:
    onClipEvent (load) {
    s=0
    }
    onClipEvent (enterFrame) {
     
    trace("start");
     
     
    if(this.hitTest(_root.holger)){
    trace("Holger berührt die Tonne"); 
        if(_this.s>_root.holger.bewegung)
     
        {_root.holger._x=30;
        trace("Holger wird geschmissen");
     
     
        }
        else
        {this.s=30;
        trace("Holger schmeißt Tonne");}
         
    trace("Holger berührt die Tonne nicht mehr");     
    }
    trace("speed mario "+ _root.mario.bewegung );
    trace("speed tonne "+ this.s );
    if(this.hitTest(_root.mario)){
    trace("Mario berührt die Tonne");
    trace("speed mario "+ _root.mario.bewegung );
    trace("speed tonne "+ this.s );
        if(_this.s<_root.mario.bewegung)
        {_root.mario._x+=30;
        trace("Mario wird geschmissen");}
        else
        {this.s=30; 
        trace("Mario schmeißt Tonne");}
         
    trace("Mario berührt die Tonne nicht mehr");         
    }
    _x += s
    trace("speed holger "+ _root.holger.bewegung );
    trace("speed mario "+ _root.mario.bewegung );
    }

  • #2
    Wenn es dieser Code ist und

    "Mario hat Speed 0 und die Tonne 30"

    gilt, dann


    if(_this.s<_root.mario.bewegung)

    if(30<0)

    und somit korrekt, das der Code nicht ausgeführt wird
    Christian

    Comment


    • #3
      oh, danke für den Hinweis, der Fehler hier im Code entstand aber durchs viele Probieren, also ich hab die Klammern sowohl in die eine als auch in die andere Richtung gewendet, es hat dennoch nicht geklappt, sprich folgender Code funktioniert auch nicht.

      Code:
          if(_this.s>_root.mario.bewegung)
          {_root.mario._x+=30;
          trace("Mario wird geschmissen");}
      Durch den Klammerwechsel hat sich im Trace nichts verändert, der If Block wird immer ausgelassen und nur der Else Block berücksichtigt. Wenn ich den Else-Block weg lasse, passiert logischerweise nichts mehr. Laut Ausgabe ist die Bedingung erfüllt oder hab ich etwas übersehen? Ich kam auch schon irgendwie auf die Idee, dass es evtl mit der Reihenfolge in Kombination mit der hitTest zutun haben könnte, aber so wirklich kann ich es mir nicht erklären.

      Code:
      start
      speed mario 0
      speed tonne 30
      Mario berührt die Tonne
      speed mario 0
      speed tonne 30
      Mario schmeißt Tonne
      Mario berührt die Tonne nicht mehr
      speed holger 0
      speed mario 0

      Comment


      • #4
        Dann liegt es ev. an vorigen Bedingungen, die nicht erfüllt sind und somit diese Programmstelle genrell nicht erreicht wird. Sofern möglich solltest du das debuggen
        Christian

        Comment


        • #5
          Danke, also ich glaube ich habs jetzt gelöst, der Vollständigkeithalber poste ich die Lösung nochmal.

          Die Problemstelle war wie schon anfangs angegeben

          Code:
          if(this.hitTest(_root.holger)){
          trace("Holger berührt die Tonne"); 
              if(_this.s>_root.holger.bewegung)
           
              {_root.holger._x=30;
              trace("Holger wird geschmissen");
           
           
              }
              else
              {this.s=30;
              trace("Holger schmeißt Tonne");}
               
          trace("Holger berührt die Tonne nicht mehr");
          und nochmal der gleiche Code mit Mario, ich hab diesen Code ersetzt durch folgenden:

          Code:
          	if(s>_root.holger.bewegung && this.hitTest(_root.holger) )
          			
          
          	{
          	trace("Holger wird geschmissen");}
          
          	if(s<_root.holger.bewegung && this.hitTest(_root.holger) )
          	{
          	trace("Holger schmeißt");
          	this.s=30;}
          ich hab die verschachtelten If-Abfragen nacheinander abspielen lassen, nun funktioniert es wie es soll. Scheinbar hat die Verschachtelung den Fehler ausgelöst

          Comment

          Working...
          X