ivorysmoker: Klassen methode funktioniert nicht wie gewünscht.

Hallo zusammen

Ich habe mich etwas in die Klassen vertieft um ein kleines objektorentiertes 2D Spiel zu programmieren.

Jetzt bin ich auf einen Fehler gestossen der mir nicht in den Kopf will.

Vorerst ich benutze: http://processingjs.org/reference/

  
levelLayer block1 = new levelLayer(200, 200, 20, 20);  
  
void setup(){  
  block1.blockPlacing();  
}  
  
class levelLayer(int width, int height, int thick){  
	int layerX = width;  
	int layerY = height;  
	int thickE = thick;  
	  
	public void blockPlacing()  
	{  
	Block = loadImage("block.jpg"); 	  
	image(Block, width, height, thick, thick);  
	}  
}  

Konsolenfehler:

SyntaxError: missing ; before statement
public void blockPlacing()

Jetzt bin ich etwas Ratlos da ich fast das selbe schon gemacht habe und dies wunderbar funktioniert.

  
class Player{  
	//Eigenschaften  
	int playerX = 200; //Actuell Player Coords  
	int playerY = 200;  
	int Speed = 0; // Example for Test  
	int leftSpeed = 0; //Keyevent trigger  
	int rightSpeed = 0; //Keyevent trigger  
	int upSpeed = 0;  
	int Life = 100;  
	//Test Methode  
	public void beschleunigung(int beschleunigung)  
	{  
		Speed = Speed + beschleunigung;  
	}  
}  

Ich bedanke mich schon zum voraus für eure Ideen!

  1. Tach!

    SyntaxError: missing ; before statement
    public void blockPlacing()

    Mir sticht jetzt auch kein Fehler ins Auge. Die Ursache für Syntaxfehler muss aber nicht unbedingt an der Stelle zu finden sein, die angemeckert wird. Manchmal liegt sie wo ganz anders. Nimm mal den Block raus, in dem der Fehler gemeldet wird. Wenn es dann kompiliert, ist er wirklich da drin.

    dedlfix.

    1. Tach!

      SyntaxError: missing ; before statement
      public void blockPlacing()

      Mir sticht jetzt auch kein Fehler ins Auge. Die Ursache für Syntaxfehler muss aber nicht unbedingt an der Stelle zu finden sein, die angemeckert wird. Manchmal liegt sie wo ganz anders. Nimm mal den Block raus, in dem der Fehler gemeldet wird. Wenn es dann kompiliert, ist er wirklich da drin.

      dedlfix.

      Jop, ich habe dies sehr gründlich getestet.

      Meine Diagnose:

      Ohne die blockPlacing funktion gibt es keine Fehler!

      Sobald diese geladen wird gibt es diesen syntax fehler :/

      Gruss Ivorysmoker

  2. hi,

    deine Klassendefinition

    class levelLayer(int width, int height, int thick){
    int layerX = width;
    int layerY = height;
    int thickE = thick;

    sollte wohl eher so aussehen:

      
    class levelLayer{  
    	int layerX;  
    	int layerY;  
    	int thickE = 123; // Vorbelegung  
    }  
    
    

    ggf. mit Vorbelegung der Klassenvariablen. Die Klasse selbst kriegt ja nichts übergeben.

    MfG

    1. class levelLayer{
      int layerX;
      int layerY;
      int thickE = 123; // Vorbelegung
      }

      
      >   
      > ggf. mit Vorbelegung der Klassenvariablen. Die Klasse selbst kriegt ja nichts übergeben.  
      >   
      > MfG  
        
      Hi  
        
      Ich habe ein beispiel gesehen wo der Klasse parameter mitgeschickt wurden. Somit fählt der Konstruktor aus. Dies hat meines wissens auch gut funktioniert.  
        
      Einige Fehler konnte ich damit beheben:  
        
      ~~~javascript
        
      levelLayer block1 = new levelLayer();  
      void setup(){  
      block1.blockPlacing(200, 200, 20);  
      }  
      class levelLayer{  
        
      	public static void blockPlacing(int layerX, int layerY, int thickE)  
      	{  
      	Block = loadImage("block.jpg"); 	  
      	println("X Breite: "+layerX);  
      	println("Y Breite: "+layerY);  
      	image(Block, layerX, layerY, thickE, thickE);  
      	}  
      }
      

      Nur leider wird kein Bild geladen :/

      Gruss Ivorysmoker

  3. Hi zusammen

    Natürlich könnte man das ganze auch so handeln.

      
    levelLayer block1 = new levelLayer();  
    void drwa(){  
    image(Block, block1.layerX, block1.layerY, block1.thickE, block1.thickE);  
    }  
    class levelLayer{  
    	int layerX = 50;  
    	int layerY = 100;  
    	int thickE = 25;  
    }  
    
    

    Wichtig ist dass, layerX + layerY verschieden sein müssen. (Was hier jetzt nicht so ist, da es ja fixx definiert ist. Also würde jedes Objekt diese Attribute erhalten was ich aber nicht möchte)
    Daher wollte ich der Klasse diese Parameter mitgeben. Somit sind die Werte immer so wie sie beim Layer erstellt werden!

    Möglicherweise habe ich diesbezüglich noch etwas falsch verstanden.
    Ich hoffe ich konnte schildern was ich erreichen möchte.

    Gruss Ivorysmoker

  4. Neues:

      
    levelLayer block1 = new levelLayer(200, 50, 25);  
    levelLayer block2 = new levelLayer(350, 20, 20);  
    void draw(){  
    image(Block, block1.layerX, block1.layerY, block1.thickE, block1.thickE);  
    }  
    class levelLayer(X, Y, E){  
    	int layerX = X;  
    	int layerY = Y;  
    	int thickE = E;  
    	println(layerX);  
    	println(layerY);	  
    }  
    
    

    Das Klassen Objekt erhält die richtigen Werte!

    Beim Laden leigt noch der Fehler komischerweise kann ich mit block1.layerY nicht auf den Wert zugreifen. Es kommt = undefined. Ist hier möglicherweise etwas mit der Sichtbarkeit nicht in Ordnung? Mit public class habe ich es bereits probiert ohne Erfolg.

    Gruss Ivorysmoker

    1. hi,

      Das Klassen Objekt erhält die richtigen Werte!

      Evntl. können wir uns dahingehend einigen, dass Du damit eine Instanz der Klasse meinst ;)

      Klassenmethode: Eine in der Klasse definierte Methode, die nicht über die Instanz aufgerufen wird, sondern über den Namen der Klasse. Zumindest ist das in Perl so und des Weiteren: Klassenvariablen sind im Scope der Klasse definiert. Es ist möglich (immer noch bei Perl) vor dem Erstellen einer Instanz der Klasse (Objekt) Klassenvariablen mit bestimmten Werten vorzubelegen. Dies kann entweder fest codiert sein oder:

      1. es passiert beim Kompilieren der Klasse, Beispiel in Perl
                use Foo qw(foo bar baz); # ruft automatisch die import()-Klassenmethode
      2. es wird eine Klassenmethode explizit aufgerufen, Beispiel in Perl
                require Foo;                  # kein import
                Foo->import(qw(foo bar baz)); # expliziter Aufruf der import()-Methode

      In Sachen Java bin ich kein Praktiker, vermute jedoch, dass es ähnliche Mechanismen gibt, wobei Schlüsselworte wie public, private usw. eine weiteren Einfluss auf den Scope nehmen.

      Ergo: Nicht weiter rätselraten, sondern einfach mal machen + Nachlesen ;)

      Schöne Grüße.

      --
      Die Erschaffung der Welt in 21 Tagen. Komischer Titel für ein Buch, der Leser soll in 21 Tagen raffen, was da passiert ist!?