Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 30-01-2006, 18:18   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2006
Beiträge: 93
Für mein Verständnis

Hallo,

Ich habe ein kleines Problem und brauche etwas Hife von einem Flash-Experten. Ich hoffe auch, dass ich meine Applikation nicht "standardmäss" aufbaue.

Ich habe eine Routine geschrieben, welche ein XML-File einliest. Meine Routine braucht 3 Frames dazu.

Mein "Symbol" (ein Tank mit einer Zahl drauf) füge ich im ersten Frame ein. Dieses Objekt (ein Movieclip) enthält eine Zahl, die sich ändern soll und ist mit einer As2-Klasse verbunden (class Tank). Diese enthält die Funktionen getTemperature() und setTemperature(). Im dritten Frame (also wenn die Zahlen geladen sind) mache ich:

Code:
Tank.setTemperature(datavale[1]);
Ein Trace in der Funktion setTemperature() zeigt mir, dass die Temperatur gespeichert wurde.

Wie kann ich nun diese As2-Klasse benutzen um den Text der Temperatur in meinem Movieclip-Symbol zu ändern?

Hat jemand von euch eine Idee? Da gibt es bestimmt Regeln dafür.

Danke!

P.S.:
Mein Movieclip "Tank" muss unbedingt im ersten Frame stehen, weil ich regelässig das XML-File überprüfen muss. Also "Loading XML" oder so was und dann der Clip wäre unzulässig.
kuehner ist offline   Mit Zitat antworten
Alt 31-01-2006, 01:46   #2 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 923
Hier ist mal eine Lösung, bei der ich mit Kanonen auf Spatzen geschossen habe:
Code:
  1. class MainClass{
  2.  
  3.     private static var instance:MainClass;
  4.    
  5.     public static function main( timeline:MovieClip){
  6.         instance = new MainClass( timeline);
  7.     }
  8.    
  9.  
  10.    
  11.     private var controller:ControllerClass;
  12.    
  13.     private function MainClass( timeline:MovieClip){
  14.         initApplication(timeline);
  15.         startApplication();
  16.     }
  17.    
  18.     private function initApplication(timeline:MovieClip){
  19.         var config:ConfigClass = new ConfigClass();
  20.         config.addProperty("TIMELINE", timeline);
  21.         config.addProperty("INTERVAL_MS", 1500);
  22.         config.addProperty("URL", "test.xml");
  23.  
  24.         controller = new ControllerClass();
  25.         controller.setConfig( config);
  26.        
  27.         ControlledUIComponent.setController( controller);
  28.     }
  29.    
  30.     private function startApplication(){
  31.         controller.startApplication();
  32.     }
  33.    
  34.  
  35. }
  36.  
  37.  
  38. class ControllerClass{
  39.    
  40.     private var intervalId:Number = -1;
  41.     private var data:DataClass;
  42.     private var config:ConfigClass;
  43.    
  44.  
  45.     public function ControllerClass( ){
  46.         data = new DataClass();
  47.         data.addEventListener("loadDataError", this);
  48.         data.addEventListener("loadDataComplete", this);
  49.     }
  50.    
  51.     public function startApplication(){
  52.         loadDataAsynch();
  53.     }
  54.    
  55.     private function loadDataAsynch(){
  56.         data.loadDataAsynch( config.getString('URL'));
  57.     }
  58.    
  59.     private function loadDataError( evt:Object){
  60.         trace("Error loading xml: status: " + evt.target.status + " url:" + evt.url);
  61.         waitAsynch();
  62.     }
  63.    
  64.     private function loadDataComplete( evt:Object){
  65.         waitAsynch();
  66.     }
  67.    
  68.     private function waitAsynch(){
  69.         clearInterval( this.intervalId);
  70.         intervalId = setInterval( this, "loadDataAsynch", config.getNumber('INTERVAL_MS'));
  71.     }
  72.    
  73.     private function waitComplete(){
  74.         clearInterval( intervalId);
  75.         intervalId = -1;
  76.         loadDataAsynch();
  77.     }
  78.    
  79.     //wird im onLoad des ControlledUIComponent Clips aufgerufen
  80.     public function registerClip( clip:ControlledUIComponent){
  81.         if( clip instanceof TankClass){
  82.             registerTank( TankClass( clip));
  83.         }
  84.     }
  85.    
  86.     private function registerTank( tank:TankClass):Void{
  87.         var d:DataClass = data;
  88.         d.addEventListener("loadDataComplete", function(){
  89.             tank.setTemperature( d.getTemperature());                                    
  90.         });
  91.     }
  92.    
  93.     public function setConfig( config:ConfigClass){
  94.         this.config = config;
  95.     }
  96.    
  97.     public function getConfig():ConfigClass{
  98.         return config;
  99.     }
  100.    
  101.  
  102.    
  103. }
  104.  
  105. import mx.events.EventDispatcher;
  106.  
  107. class DataClass{
  108.    
  109.     private var x:XML;
  110.    
  111.     public function DataClass(){
  112.         EventDispatcher.initialize( this);
  113.     }
  114.    
  115.     private function dispatchEvent( evt:Object){};
  116.     public function addEventListener( type:String, listener:Object){};
  117.     public function removeEventListener( type:String, listener:Object){};
  118.    
  119.    
  120.    
  121.     public function loadDataAsynch( url:String){
  122.         var x:XML = new XML();
  123.         x.ignoreWhite = true;
  124.        
  125.         var ref:DataClass = this;
  126.         var evt:Object = new Object({target:x, url:url});      
  127.         x.onLoad = function( success:Boolean):Void{
  128.             if( ! success){
  129.                 evt.type = "loadDataError";
  130.                 ref.dispatchEvent(evt);
  131.             } else {
  132.                 ref.x = this;
  133.                 evt.type = "loadDataComplete";
  134.                 ref.dispatchEvent(evt);
  135.             }
  136.         }
  137.         x.load( url);
  138.     }
  139.    
  140.     public function getTemperature():Number{
  141.         var result:Number = parseFloat(
  142.             XMLUtil.getText(
  143.                 XMLUtil.getNodeById( x, 'temperature')));
  144.         return result;
  145.     }
  146. }
  147.  
  148.  
  149. //Der MovieClip, der mit der TankClass verknüpft ist
  150. //enthält ein dynamisches TextFeld namens tfTemperature
  151.  
  152. class TankClass extends ControlledUIComponent {
  153.  
  154.    
  155.     public static var DEFAULT_TEMPERATURE:Number = 0;
  156.  
  157.    
  158.     private var temperature:Number = DEFAULT_TEMPERATURE;
  159.     private var tfTemperature:TextField;
  160.  
  161.    
  162.     private function onLoad(){
  163.         super.onLoad();
  164.         update();
  165.        
  166.     }
  167.    
  168.     private function update(){
  169.         trace("TankClass::update " + [temperature, this]);
  170.         tfTemperature.text = temperature.toString();
  171.     }
  172.    
  173.     public function setTemperature( v:Number){
  174.         if( isNaN( v)) return;
  175.         temperature = v;
  176.         update();
  177.     }
  178.    
  179.     public function  getTemperature():Number{
  180.         return temperature;
  181.     }
  182. }
  183.  
  184.  
  185. class ControlledUIComponent extends MovieClip {
  186.    
  187.     private static var controller:ControllerClass;
  188.    
  189.     public static function setController( c:ControllerClass){
  190.         controller = c;    
  191.     }
  192.    
  193.     private function onLoad():Void{
  194.         controller.registerClip( this);
  195.     }
  196.  
  197. }
  198.  
  199.  
  200. class ConfigClass{
  201.    
  202.     private var data:Object;
  203.  
  204.    
  205.     public function ConfigClass(){
  206.         data = new Object();
  207.     }
  208.    
  209.     public function addProperty( name:String, value:Object){
  210.         data[name] = value;
  211.     }
  212.    
  213.     public function hasProperty( name:String):Boolean{
  214.         return data.hasOwnProperty( name);
  215.     }
  216.    
  217.     public function getProperty( name:String):Object{
  218.         return data[name];
  219.     }
  220.    
  221.     public function getString( name:String):String{
  222.         return data[name];
  223.     }
  224.    
  225.     public function getNumber( name:String):Number{
  226.         return data[name];
  227.     }
  228. }
  229.  
  230.  
  231.  
  232. class XMLUtil {
  233.    
  234.     public static function getNodeById( x:XML, id:String):XMLNode{
  235.         var result:XMLNode;
  236.         if( x.hasOwnProperty('idMap')){
  237.             result = x['idMap'][id];
  238.         } else {
  239.             result = x[id];
  240.         }
  241.         return result;
  242.     }
  243.    
  244.     public static function getText( node:XMLNode):String{
  245.         return node.childNodes.join('');
  246.     }
  247. }
  248.  
  249.  
  250. //test.xml sieht so aus
  251. <data>
  252.      <value id="temperature">123</value>
  253. </data>

Ok, fürs Verständnis nicht unbedingt hilfreich, aber hat trotzdem Spass gemacht.

mfg h
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D

Geändert von hazy fantazy (31-01-2006 um 02:31 Uhr)
hazy fantazy ist offline   Mit Zitat antworten
Alt 31-01-2006, 13:26   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2006
Beiträge: 93
Hallo,

Danke für Deine Hilfe. Deine Bazooka hat meinen Spatz wirklich abgeschossen. Deine Lösung hilft mir auf jeden Fall... vor allem, um etwas ActionScript zu lernen.
kuehner ist offline   Mit Zitat antworten
Alt 31-01-2006, 17:38   #4 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Jau, schönes Beispiel.
Dabei fällt mir ein, dass ich dringend mal eine Übersicht erstellen muss, über die Möglichkeiten andere Klassen oder Objekte zu referenzieren. Die Methode, mit der gemeinsamen Basisklasse ControlledUIComponent ist nicht schlecht.
mfg. r
bokel 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 12:18 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele