2009-08-26 11 views
0

Ich habe diesen Code:Kein Zugriff auf Actionscript 3 Sprite.graphics.x Methoden

package graphics { 
    import flash.display.Sprite; 
    import flash.events.*; 

    public class Ball extends Sprite { 
     public function Ball(_stage){ 
      _stage.addChild(this); 
      drawBall(); 
     } 
     private function drawBall(){ 
      graphics.beginFill(0x0000CC); 
      graphics.lineStyle(2,0x000000,1); 
      graphics.drawCircle(0,0,10); 
      graphics.endFill(); 
     } 
    } 
} 

ZUSÄTZLICH:
und die Klasse, die ich passieren
mxmlc:

package { 
    import flash.display.Sprite; 
    import graphics.*; 

    [SWF(width='1024', height='768', backgroundColor='#FFFFFF', frameRate='30')] 

    public class Application extends Sprite { 
     public function Application(){ 
      var ball:Ball = new Ball(this); 
     } 
    } 
} 

Abgesehen davon, dass, wenn Ich kompiliere, ich bekomme den folgenden Fehler:

ball.as(11): col: 14 Error: Call to a possibly undefined method beginFill. 

      graphics.beginFill(0x0000CC); 
        ^

Zusammen mit den anderen drei graphics.x() -Aufrufen.

Ich mache hier wahrscheinlich etwas falsch, aber ich weiß nicht was. Machst du?

+0

sehen meine udpated Antwort - das Problem ist, die Paketnamen Grafiken ist die gleiche wie die Klasseneigenschaftsnamen Grafiken. –

Antwort

1

Ich fürchte, das Problem muss an anderer Stelle in Ihrem Code sein. Wenn ich Ihre Klasse zu nehmen und reinigen, so stellt es etwa so:

package 
{ 
import flash.display.Sprite; 

public class Ball extends Sprite 
{ 
    public function Ball() 
    { 
     drawBall(); 
    } 

    private function drawBall():void 
    { 
     graphics.beginFill(0x0000CC); 
     graphics.lineStyle(2,0x000000,1); 
     graphics.drawCircle(0,0,10); 
     graphics.endFill(); 
    } 
} 
} 

 
    $ mxmlc Ball.as 
    Loading configuration file [...]/flex-config.xml 
    /private/tmp/actionscript/Ball.swf (666 bytes) 

Es zieht eine blaue Kugel in der linken oberen Ecke des Bildschirms. Ihr Problem mit graphics muss also mit Code in Zusammenhang stehen, den Sie hier nicht gezeigt haben.


Edit: Basierend auf den neuen Informationen:

Ihr Namespace graphics für die Klasse Ball Konflikte mit den Eigenschaftsnamen Grafiken. Sie müssen das Paket und das Verzeichnis, in dem es sich befindet, umbenennen.

+0

Sorry, ich hätte nicht gedacht, dass das das Problem wäre. Ich habe meine Frage mit dem Rest des Codes aktualisiert. –

+0

Oh, dumm mich. Du würdest nicht glauben, wie oft ich etwas nenne, was schon vergeben ist ... Danke für die Hilfe! –

0

Ihre Klasse kann sich nicht zur Bühne hinzufügen. Es hat keinen Bezug auf die Bühne, bis sie der Anzeigeliste hinzugefügt wurde. Ihre Anwendungsklasse muss sowohl den Ball erstellen als auch zur Bühne hinzufügen. Auch ist es nur Bühne, nicht _stage.

+0

Nun - in seiner Anwendungsklasse gibt er einen Verweis auf die Bühne (var ball: Ball = neuer Ball (this);) in den Konstruktor von Ball. Nicht schön oder empfohlen, aber es ist ein gültiger Code, der das tut, was Sie erwarten würden. –

+0

Ah ja, ich habe versucht, dies auf meinem iPhone zu beantworten und konnte den Code nicht den ganzen Weg dort lesen. Du hast Recht. Zu diesem Zeitpunkt existiert möglicherweise noch keine Bühne (ich bin nicht sicher, wann in der Flex-Bootstrap-Stufe verfügbar wird). –

2

Verwenden Sie einfach this.graphics.method, um Verwechslungen durch Ihren Paketnamen zu vermeiden.

Edit - after comment.

Nach einigen Herumspielen, so scheint es, dass, obwohl this.graphics Spuren als korrekt Graphics-Objekt, wie erwartet, die this.graphics.method in der Ball-Klasse angesehen wird. Ich weiß nicht, was das so vermasselt, aber es kann mit einem einfachen Casting gelöst werden.

package graphics { 
    import flash.display.Graphics; 
     import flash.display.Sprite; 
     import flash.events.*; 

     public class Ball extends Sprite { 
       public function Ball(_stage) { 
         _stage.addChild(this); 
         drawBall(); 
       } 
       private function drawBall() { 
       var g:Graphics = this.graphics as Graphics; 
         g.beginFill(0x0000CC); 
         g.lineStyle(2,0x000000,1); 
         g.drawCircle(0,0,10); 
         g.endFill(); 
       } 
     } 
} 

Viel Glück

+0

Dies ist ein gutes Beispiel, warum viele sagen, dass den Klassenmitgliedern immer das Schlüsselwort "this" vorangestellt werden sollte, selbst wenn der Code ausführlicher erscheint. – Virusescu

+0

Die Kompilierung schlägt mit den gleichen Fehlern fehl. –

+0

Es tut mir leid. Es verwirrt den Compiler wirklich. Überprüfen Sie meine andere Antwort auf etwas, das funktioniert, ohne dass die Pakete geändert werden müssen. – Virusescu