Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-01-2008, 19:11   #1 (permalink)
Neuer User
 
Benutzerbild von schnabelmax
 
Registriert seit: Oct 2003
Ort: im garten frankreichs
Beiträge: 76
von Bühne zur Klasse - Pfad/Vars Angaben ?

Bin neu in AS3, es handelt sich hier also um Basisfragen
Offenbar habe ich noch gehörige Schwierigkeiten mich in OOP und AS3 hinneinzudenken.

Ich möchte wissen welchen Ansatz ich hier verwenden soll
Es geht um eine Isometresche map, deren Tiles beim einbinden auf der Bühne, initialisiert werden sollen.

Bühne
ActionScript:
  1. var mapW:int = map1[0].length;
  2. var mapH:int = map1.length;
  3. var tileW:int = 50;
  4. var tileH:int = 12.5;
  5. var i:int;
  6. var j:int;
  7. // Container für die Tiles
  8. var ebene_boeden:Sprite = new Sprite();
  9. this.addChild(ebene_boeden);
  10.  
  11. function buildMap():void
  12. {
  13.     // i = Height loop || j = Width loop
  14.     for ( i=0; i<mapH; i++ )
  15.     {
  16.         for ( j=0; j<mapW; j++ )
  17.         {
  18.             var tile:Tile = new Tile();
  19.             if (i % 2 == 0)
  20.             { // gerade
  21.                 ebene_boeden.addChild(tile);
  22.                 tile.setPosition(j*tileW, i*tileH);
  23.                 tile.setFrame(map1[i][j]);
  24.             } else
  25.             { // ungerade
  26.                 ebene_boeden.addChild(tile);
  27.                 tile.x = (j*tileW)+tileW/2;
  28.                 tile.y = i*tileH;
  29.                 tile.gotoAndStop(map1[i][j]);
  30.             }
  31.             tile.addEventListener(MouseEvent.CLICK, doKlick);         
  32.         }
  33.     }
  34. }
  35.  
  36. function doKlick(event:Event):void
  37. {
  38.     trace("klick");
  39. }
  40.  
  41. buildMap();

Klasse Tile
ActionScript:
  1. package
  2. {
  3.     import flash.display.MovieClip;
  4.    
  5.     public class Tile extends MovieClip
  6.     {
  7.         public function Tile()
  8.         {
  9.             this.stop();
  10.         }
  11.        
  12.         public function setPosition(xPos:int, yPos:int)
  13.         {
  14.             this.x = xPos;
  15.             this.y = yPos;
  16.         }
  17.        
  18.         public function getPosition():Number
  19.         {
  20.             return this.x;
  21.         }
  22.     }
  23. }

In AS1 Konnte ich so etwas sagen wie:
ActionScript:
  1. initMovie(j*tileW, i*tileH, map1[i][j])
und demendsprechend hatte ich den Konstruktor in der Klasse Tile:
ActionScript:
  1. function Tile(xPos, yPos, pFrame) {
  2. this.x = xPos;
  3. this.y = yPos;
  4. this.gotoAndStop(pFrame);
  5. }
Alles in einem.
Jetzt brauche ich eine extra Funktion in der Klasse die die Positionierung Regelt denke ich da richtig ?
Wenn ja, welcher Weg ist hier zu bevorzugen,
Initialisiere ich, wie in der ungerade Schleife, x/y beim durchlaufen der Schleife oder übergebe ich, wie in der gerade Schleife, die Parameter an die Funktionen in der Klasse, so wie ich es eigendlich gern hätte, sonst verstehe ich den Sinn einer Klasse nicht, denn im ersten Fall brauche ich keine Klasse mehr !?

Auch der eventListener und die doKlick Funktion sollten doch besser in der Klasse der sein oder? Und wenn ja, wie sieht das dann aus?

Wäre Dankbar für jeden Lichtblick
__________________
gruß schnabelmax
schnabelmax ist offline   Mit Zitat antworten
Alt 27-01-2008, 12:09   #2 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
du brauchst in dem sinne keien "klasse" da deine Tile klasse vom
MovieClip erbt und deswegen schon viele eigenschaften einfach so bestitz,

bei den eventListener kommt es drauf an wofür du ihn benutzen willst
manchmal brauch ihn nur die klasse manchmal brauch das programm oder
jmd anderes ein event und gewisse sachen zu überprüfen.
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 27-01-2008, 12:29   #3 (permalink)
Neuer User
 
Benutzerbild von schnabelmax
 
Registriert seit: Oct 2003
Ort: im garten frankreichs
Beiträge: 76
Ok danke,
aber welchen Weg würdest Du empfehlen, bzw. welcher der obigen Wege erscheint Dir richtig.

Kann im allgemeinen die 'setPosition Funktion' in die 'public function Tile()' der Tile Klasse integriert werden?
Irgentwie so:
ActionScript:
  1. var pX:int = j*tileW;
  2. var pY:int = i*tileH;
  3. ebene_boeden.addChild(tile( j*tileW,  i*tileH));

Beim eventListener möchte ich zunächst schon das die Tiles auf die Maus reagieren. Wo gehört er in dem Fall hin ?
__________________
gruß schnabelmax
schnabelmax ist offline   Mit Zitat antworten
Alt 27-01-2008, 13:33   #4 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
der listener gehört dann außerhalb, weil doch das programm nur die info
braucht aber selber verwalten will

die funktioen setPosition sind eh unnötig, da du vom MovieClip
erbst und somit x und y als public vars hast. da eig im kontruktor
initialisiert werden soll ist es am besten sowas in der art zu machen:
ActionScript:
  1. public function Tile( x : Number = 0, y : Number = 0 )
  2. {
  3.     this.x = x;
  4.     this.y = y:
  5. }
  6.  
  7. var tile : Tile new Tile( i * tileW, j * tileH );
  8. addChild( tile );
so ist es egal ob du nun parameter übergibst, oder es erst später machst.
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 27-01-2008, 15:23   #5 (permalink)
Neuer User
 
Benutzerbild von schnabelmax
 
Registriert seit: Oct 2003
Ort: im garten frankreichs
Beiträge: 76
Aaaah, das ist ja genau was ich sehen wollte.
Ich schnalle immer noch nicht ganz welchen Objekten ich welche Eigenschaften und Methoden zuweise, aber das kommt wohl hoffentlich mit der Zeit.
Zunächst ertsmal vielen Dank
__________________
gruß schnabelmax
schnabelmax ist offline   Mit Zitat antworten
Alt 28-01-2008, 16:11   #6 (permalink)
Neuer User
 
Benutzerbild von schnabelmax
 
Registriert seit: Oct 2003
Ort: im garten frankreichs
Beiträge: 76
so, die Probleme gehen weiter. Ich bekomme die simpelsten Dinge nicht hin.

Ich möchte nun in meiner Item Klasse, über einen Event, ein tile ansprechen. Wie sieht der Pfad aus? Habe schon so manchen Weg ist aber alles Unsinn.

Bühne
ActionScript:
  1. var container:Sprite = new Sprite();
  2. this.addChild(container);
  3.  
  4. function buildMap():void
  5. {
  6.     for ( i=0; i<mapH; i++ ) {
  7.         for ( j=0; j<mapW; j++ ) {
  8.             var tile:Tile = new Tile( xPos, yPos, map1[i][j] );
  9.             yPos = i * tileH;
  10.             if (i % 2 == 0) { // gerade
  11.                 xPos = j * tileW;
  12.                 container.addChild(tile);
  13.             } else { // ungerade
  14.                 xPos = (j*tileW)+tileW/2;
  15.                 container.addChild(tile);
  16.             }         
  17.         }
  18.     }
  19. }
Tile Klasse
ActionScript:
  1. package
  2. {
  3.     import flash.display.MovieClip;
  4.    
  5.     public class Tile extends MovieClip
  6.     {
  7.         public function Tile(x:Number = 0, y:Number = 0) { ...
  8.         public function tileIsDoing(param1:Number = 0, param2:Number = 0):void
  9.         {
  10.             this.var1 += param1;
  11.             this.var2 += param2;
  12.             setColor(var1, var2); // auffruf einer Klasseneigenen Funktion
  13.         }
  14.     }
  15. }
Item Klasse - wie lautet die Pfadangabe zum tile
ActionScript:
  1. package
  2. {
  3.     import flash.display.*;
  4.     import flash.events.MouseEvent;
  5.    
  6.     public class Item extends MovieClip
  7.     {      
  8.         public function Item(x:Number = 0, y:Number = 0)
  9.         {
  10.             this.x = x;
  11.             this.y = y;
  12.             addEventListener(MouseEvent.CLICK, tileDo);
  13.         }
  14.        
  15.         private function tileDo(event:MouseEvent):void
  16.         { // und hier das Große ? Wie spreche ich 'container' und die tiles an. Folgendes geht nämlich nicht
  17.             var container:DisplayObjectContainer;
  18.             var child:DisplayObject;
  19.             child = container.getChildAt(5);
  20.             child.tileIsDoing (0.1, 0.1);
  21.         }
  22.     }
  23. }
Eigentlich will ich sogar ein bestimmtes tile ansprechen. Nämlich das über dem sich das Item gerade befindet. Muß ich den tiles dann auch einen Mouse.CLICK Event zuweisen? Dann hätte ich schon zwei Events um einen Satz Variablen von Object zu Object zu tragen. Das kann doch nicht richtig sein.
Anders gefragt, wie bekomme beim klicken von item1 auf/über tile5 meine variablen von item1 zu tile5.
Mein Gott, was für eine Frage. Ich hoffe ich ernte hier keine "bleib lieber bei AS1" Antworten.
__________________
gruß schnabelmax
schnabelmax ist offline   Mit Zitat antworten
Alt 28-01-2008, 20:36   #7 (permalink)
new user
 
Benutzerbild von PinkDragon
 
Registriert seit: Oct 2005
Beiträge: 140
Da der erste Code auf der Bühne liegt (Zeitleiste) kannst du von überall mit _root.container darauf zugreifen.
Allerdings kommst du hier schon wieder zu AS1
(Kann dir nicht mal versprechen, dass das bei AS3 überhaupt noch geht, benütze selber nur AS2.7 )

Eine genauso unschöne Methode wäre auch gleich eine globale Variable zu verwenden (_global.). Aber wie gesagt, sehr unschön.

Die imho schönste Variante ist die einer Steuerungsklasse, die den container als eine member Variable hält. Dann kannste immer mit allen Funktionen (in dieser Klasse) darauf zugreifen und somit sollte das Problem gelöst sein.

Jetzt noch das erschütternde zum Schluss: Hab selber noch nicht AS3 Programmiert, kann deshalb sein, dass ich sachen sage, die gar nicht funktionieren. Der letzte Lösungsansatz sollte aber klappen, da dieser ganz allgemeine OOP ist und somit auch mit AS3 umsetzbar sein sollte.

Liebe Grüße
PD
__________________
Die Summe aller menschlichen Intelligenz ist eine Konstante.
Das Problem ist das Bevölkerungswachtum...

Gratiswebserver mit MySQL-Datenbank und vieles mehr dank www.lima-city.de!
PinkDragon 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 19:06 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele