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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-05-2003, 21:02   #1 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Schönschreibwettbewerb

Inspiriert von den vielen Wettbewerben und hok Konventionen-Thread kommt hier mal ein neuer Wettbewerbsvorschlg, der aber nicht ganz ernst gemeint ist

Wie wäre es denn, wenn man eine Beschreibung meinetwegen einer Klasse inn Klartext gibt, und jeder Wettbewerber soll daraus den am besten lesbaren Code machen, den es gibt?
Oder den, der am meisten auf Design Patterns beruht oder so.

Ich denke, da kann man viel bei lernen, wenn man den anderen beim Coden auf die Finger schaut, wie hok in seinem Thread ja auch Inspirationen in seine Liste hineingenommen hat.

Zum Abschluss müßte man dannnoch einen Poll machen und Ehre dem Gewinner.
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 06-05-2003, 21:21   #2 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
hört sich gut an, es sollte aber nicht zu viel code sein. Und was ist eine klasse im klartext?

Wenn du den 'veranstalter' spielst könnte der bokel auch mal teilnehmen .
secp ist offline   Mit Zitat antworten
Alt 06-05-2003, 23:10   #3 (permalink)
Flash-Wüstling
 
Benutzerbild von pheidrias
 
Registriert seit: Dec 2001
Ort: Halle/Saale
Beiträge: 4.300
können ja verschiedene Wertungen sein : Lesbarkeit, Konventionalität, Performance und Originalität...

,
pheidrias
__________________
Ehrlich währt am LÄNGSTEN !
pheidrias ist offline   Mit Zitat antworten
Alt 07-05-2003, 02:15   #4 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Zitat:
Geschrieben von secp
hört sich gut an, es sollte aber nicht zu viel code sein. Und was ist eine klasse im klartext?

Wenn du den 'veranstalter' spielst könnte der bokel auch mal teilnehmen .
Ich meine, man schreibt so eine Art Spezifikation oder vielleicht auch schon die Klasse selber und dann macht jeder Bewerber ein Refactoring über der Klasse oder so ähnlich, so dass man das mal in live-Action sieht und vorallen Dingen sieht, wie andere damit umgehen.
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 14-05-2003, 14:51   #5 (permalink)
Nett hier ...
 
Benutzerbild von makese
 
Registriert seit: Nov 2002
Ort: Berlin
Beiträge: 643
...

jute gidee ... :-)

wann gehts los ???

makese
__________________
warum sind wir nicht alle ein bisschen wikiwiki
makese ist offline   Mit Zitat antworten
Alt 16-05-2003, 09:54   #6 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
So, ich habe mir ein wenig Gedanken gemacht darüber, was man machen könnte.

Und zwar schwebt mir ein Verschiebe-Puzzle vor! Das kennt bestimmt jeder. Man hat einen Rahmen, in dem quadratische flache Teilchen liegen, die man gegeneinander verschieben kann, weil ein Teilchen fehlt und die in den richtigen Positionen ein Bild ergeben. Gibt ja auch genügend Beispiele im Netz.

Dass ich so etwas auswähle, liegt daran, dass es ja nicht um die Originalität oder Komplexheit des Codes geht, sondern darum, dass man das ganze so strukturiert, dass auch andere Leute mit dem Code was anfangen können.

Dem Coder sind hierbei keine Grenzen gesetzt, nur soviel sollte im vorne herein geklärt werden.

Man sollte das Bild, das aus der Library attachet wird, die Anzahl der Zeilen und Spalten sowie die Rasterweite (also Abmessungen der einzelnen Quadrate) nicht hardcoden, sondern Userseitig ändern können.

Es ist nicht unbedingt erforderlich, eine Methode zu coden, die überprüft, ob man gewonnen hat, oder eine, die sicherstellt, dass so gemischt wird, dass das Puzzle auch lösbar ist. Es geht darum, dass die Technik, wie wird das Puzzle erzeugt und wie kann man ein Teilchen verschieben, dargelegt wird, um die Sache recht einfach zu halten. Allerdings wäre es von Vorteil, dass der Code so angelegt ist, dass man diese Methoden leicht implementieren kann.

Was haltet Ihr davon?
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 19-05-2003, 12:01   #7 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
find ich gut - wo bleibt der klartext?
secp ist offline   Mit Zitat antworten
Alt 19-05-2003, 16:04   #8 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Ohne eine Diskussion über das machbare kommt hier kein Klartext hin.
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 19-05-2003, 17:43   #9 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
Ja, so ein puzzle ist gar nicht so einfach. Letztendlich wird man zu unschönen sachen gezwungen. Wenn man für P4 optimiert kann man sich aber einiges erlauben .

Ich würde ein bmp w*h mal attachen und noch jeweihls eine maske drauflegen. Maus aktionen drauf und fertig.

Lauter einzel bmp's find ich zuviel arbeit, wenn man das bild mal ändern will.

Übergroße puzzles mit culling und scrolling braucht eh keiner, oder?
secp ist offline   Mit Zitat antworten
Alt 19-05-2003, 21:09   #10 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Also, erst mal denke ich, dass die Sache relativ einfach zu halten ist, da es schließlich darum geht, das Prinzip zu zeigen, wie man an die Sache ran geht.

Als einzige Voraussetzungen würde ich aus Gründen der Flexibilität angeben, dass man sich die Anzahl der Zeilen und Spalten sowie die Größe eines einzelnen verschiebbaren Teilchen bei der Initialisierung aussuchen kann, und dass das Bild, was den Teilchen zugrunde liegt, nicht in der Flash-Umgebung zerschnitten wird, sondern durch Action-Script und Masken. Der Einfachheit halben nehmen wir ein attchMovie, da nachladbare Bilder hier nicht unbedingt zum Verständnis beitragen würden.

Das Kriterium, dass ich anlegen würde ist, dass der Code auch ohne Kommentare leicht verständlich ist, deswegen kann er auch ruhig kurz und knackig sein. Außerdem sollen alle möglichen Aufteilungen auf AS-Dateien, die included werden, erlaubt sein, da ich auch das für eine wichtige strukturelle Maßnahme halte.

Weiter mit der Diskussion
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 20-05-2003, 12:24   #11 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
also ich bring mal ein paar fakten

Ist nicht sehr leserlich, aber einfach.


ActionScript:
  1. _global.puzzle = function( target, picture, zeilen, spalten, depth) {
  2.     this.tl = target;
  3.     this.bild = picture;
  4.     this.tiefe = depth;
  5.     this.spalten = spalten;
  6.     this.zeilen = zeilen;
  7. }
  8.  
  9. o = puzzle.prototype;
  10.  
  11. o.init = function() {
  12.     this.tmc = this.tl.createEmptyMovieClip("tiles_mc", this.tiefe);
  13.    
  14.     var m = this.tmc.attachMovie(this.bild, "testPic_mc", 1, {_x:0, _y:0});
  15.  
  16.     this.TileW = m._width/this.spalten;
  17.     this.TileH = m._height/this.zeilen;
  18.  
  19.     this.bounds = m.getBounds(this.tmc);
  20.  
  21.     removeMovieClip(m);
  22.    
  23.     this.tmc._x = -this.bounds.xMin;
  24.     this.tmc._y = -this.bounds.yMin;
  25.    
  26.     this.createTiles();
  27. }
  28.  
  29. o.createTileMask = function(pic, maskX, maskY) {
  30.    
  31.     var m = pic.createEmptyMovieClip("TileMask_mc", 1);
  32.    
  33.     var x = 1;
  34.     var y = 1;
  35.     var w = this.tileW-1;
  36.     var h = this.tileH-1;
  37.    
  38.     m.lineStyle(1,0,100);
  39.     m.beginFill(0,60);
  40.     m.moveTo(x,y);
  41.     m.lineTo(w, y);
  42.     m.lineTo(w,h);
  43.     m.lineTo(x, h);
  44.     m.lineTo(x, y);
  45.    
  46.     m._x = maskX;
  47.     m._y = maskY;
  48.    
  49.     pic.setMask( m );
  50. }
  51.  
  52. o.createTiles = function() {
  53.     var m, t = 0;
  54.    
  55.     for(var i=0; i<this.zeilen; i++) {
  56.         for(var j=0; j<this.spalten; j++) {
  57.            
  58.             m = this.tmc.attachMovie(this.bild, "pic_"+i + "_" + j, ++t);
  59.  
  60.             this.createTileMask(m, this.bounds.xMin+this.TileW*j, this.bounds.yMin+this.TileH*i );
  61.  
  62.         }
  63.     }
  64. }
Den code hab ich nochmal geändert, jetzt muß das bild nicht auf 0,0 liegen und globla ist auch besser.

Müßte nur och eine drag&release routine dazu.

Geändert von secp (20-05-2003 um 14:41 Uhr)
secp ist offline   Mit Zitat antworten
Alt 20-05-2003, 18:43   #12 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Das sieht doch schon mal nicht schlecht aus und auch übersichtlich. Ist aber noch lange nicht fertig

Was auf jeden Fall noch fehlt, ist eine Methode, die das ganze durcheinander wirbelt, also shuffle(). Dann vielleicht noch eine checkWin()-Methode, die überprüft, ob das alles gelöst ist, zusammen mit dem Aufruf der onWin()-Event-Methode, die vom User bereit gestellt wird, etc.

Ich denke, es sollte schon ein komplett funktionierendes Spiel rauskommen, dass dann als Tutorial verwendet werden kann.
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 20-05-2003, 19:04   #13 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Ich komme auch mal mit meinem rüber:

Ist auch noch nicht das leserlichste, aber wir wollen hier ja vielleicht auch einen Prozess aufzeigen.

Voraussetzung, dass das funktioniert ist eine Verknüpfung in der Library auf einem MovieClip, die "Bild" heisst.

ActionScript:
  1. // Namespace Puzzle
  2. if(!Puzzle)
  3. {
  4.     _global.Puzzle = {}
  5.    
  6.     // class Puzzle.Puzzle
  7.     // constructor
  8.     Puzzle.Puzzle = function(lib_mx,x_count,y_count,grid_size,gap_size,shuffle_max)
  9.     {
  10.         this.$lib_mc$ = lib_mc
  11.         this.$x_count$ = x_count
  12.         this.$y_count$ = y_count
  13.         this.$grid_size$ = grid_size
  14.         this.$gap_size$ = gap_size
  15.         this.$shuffle_max$ = shuffle_max
  16.         this.$next_shuffled$ = null
  17.         this.$shuffle_count$ = 0
  18.     }
  19.     // inherit from MovieClip
  20.     Puzzle.Puzzle.prototype.__proto__ = MovieClip.prototype
  21.  
  22.     // shuffle <count> times by swapping two tiles' positions
  23.     Puzzle.Puzzle.prototype.shuffle = function(count)
  24.     {
  25.         var isMov, x, y, ran
  26.  
  27.         this.$shuffle_count$++
  28.         if(this.$shuffle_max$ > this.$shuffle_count$)
  29.         {
  30.             do
  31.             {
  32.                 nextMov = this.getRandomMoveable()
  33.             }
  34.             while(this.Tiles[nextMov.x][nextMov.y]==this.$next_shuffled$)
  35. //      isMov = this.Tiles[nextMov.x][nextMov.y].isMoveable()
  36.             this.move(nextMov.x,nextMov.y)
  37.         }
  38.     }
  39.    
  40.     // move one tile to specified x,y position (x,y are not pixels but 2dimensional coordinates in the tiles raster)
  41.     Puzzle.Puzzle.prototype.move = function(x,y)
  42.     {
  43.         var temp_x, temp_y, temp
  44.        
  45.         temp_x = this.empty.x
  46.         temp_y = this.empty.y
  47.        
  48.         this.Tiles[x][y].$curr_x = temp_x
  49.         this.Tiles[x][y].$curr_y = temp_y
  50.  
  51.         this.empty.x = x
  52.         this.empty.y = y
  53.  
  54.         this.$next_shuffled$ = this.Tiles[x][y]
  55.         this.Tiles[x][y].dx = temp_x * (this.$grid_size$ + this.$gap_size$)
  56.         this.Tiles[x][y].dy = temp_y * (this.$grid_size$ + this.$gap_size$)
  57.         // defines, how the movement should take place (in this case through modified madokan wabber)
  58.         this.Tiles[x][y].onEnterFrame = function ()
  59.             {
  60.                 this.xpos = this._x
  61.                 this._x = this.wabber("xpos",this.dx,.2,.3,0,5)
  62.                 this.ypos = this._y
  63.                 this._y = this.wabber("ypos",this.dy,.2,.3,0,5)
  64.                 if(Math.abs(this._x - this.dx) < 1 && Math.abs(this._y - this.dy) < 1 )
  65.                 {
  66.                     this.onEnterFrame = null
  67.                     this._x = this.dx
  68.                     this._y = this.dy
  69.                     this._parent.shuffle()
  70.                 }
  71.             }
  72.        
  73.         temp = this.Tiles[temp_x][temp_y]
  74.         this.Tiles[temp_x][temp_y] = this.Tiles[x][y]
  75.         this.Tiles[x][y] = temp
  76.     }
  77.     //
  78.     Puzzle.Puzzle.prototype.getRandomMoveable = function()
  79.     {
  80.             ran = Math.round(Math.random()) // (0 or 1) used for randomely choosing x or y diretion
  81.             switch(ran)
  82.             {
  83.             case 0: // move horizontally
  84.                 if(this.empty.x == 0)
  85.                 {
  86.                     x = 1
  87.                 }
  88.                 else
  89.                 if(this.empty.x == this.$x_count$ -1)
  90.                 {
  91.                     x = this.$x_count$ - 2
  92.                 }
  93.                 else
  94.                 {
  95.                     x = this.empty.x + Math.randomPosNeg()
  96.                 }
  97.                 y = this.empty.y
  98.                 break;
  99.             case 1: // move vertically
  100.                 if(this.empty.y == 0)
  101.                 {
  102.                     y = 1
  103.                 }
  104.                 else
  105.                 if(this.empty.y == this.$y_count$ -1)
  106.                 {
  107.                     y = this.$y_count$ - 2
  108.                 }
  109.                 else
  110.                 {
  111.                     y = this.empty.y + Math.randomPosNeg()
  112.                 }
  113.                 x = this.empty.x
  114.                 break;
  115.             }
  116.             return {x:x,y:y}
  117.     }
  118.  
  119.     Puzzle.Puzzle.prototype.createTile = function(lib_mc,start_x,start_y,grid_size,gap_size)
  120.     {
  121.         var temp,depth
  122.         depth = getNextDepth()
  123.         temp = this.createEmptyMovieClip("Tile" + depth,depth)
  124.         temp.stop()
  125.         temp.__proto__ = new Puzzle.Tile(lib_mc,start_x,start_y,grid_size,gap_size)
  126.         temp.isMoving = false
  127.         temp.attachMovie(lib_mc,"Picture",1)
  128.         temp.Picture._x = -start_x * grid_size + Math.round(Math.random() * 20) -10
  129.         temp.Picture._y = -start_y * grid_size + Math.round(Math.random() * 20) -10
  130.         temp._x = start_x * (grid_size+gap_size)
  131.         temp._y = start_y * (grid_size+gap_size)
  132.         temp.createEmptyMovieClip("Mask",2)
  133.         temp.Mask.stop()
  134.         with(temp.Mask)
  135.         {
  136.             beginFill(0x000000,100)
  137.             drawRect(0,0, grid_size , grid_size)
  138.             endFill()
  139.         }
  140.         temp.setMask(temp.Mask)
  141.         return temp
  142.     }
  143.     // /class Puzzle.Puzzle
  144.  
  145.     // class Puzzle.Tile
  146.     // constructor
  147.     Puzzle.Tile = function(lib_mc,start_x,start_y,grid_size,gap_size)
  148.     {
  149.         this.$lib_mc$ = lib_mc
  150.         this.$curr_x$ = this.$start_x$ = start_x
  151.         this.$curr_y$ = this.$start_y$ = start_y
  152.         this.$grid_size$ = grid_size
  153.     }
  154.  
  155.     // inherit fromMovieClip
  156.     Puzzle.Tile.prototype.__proto__ = MovieClip.prototype
  157.  
  158.     Puzzle.Tile.prototype.isMoveable = function()
  159.     {
  160. //    trace("isMoveable: " add this.$curr_x$ add " <==> " add this._parent.empty.x add " ||| " add this.$curr_y$ add " <==> " add this._parent.empty.y)
  161.         return (Math.abs(this._parent.empty.x - this.$curr_x$) == 1 && this._parent.empty.y == this.$curr_y$) || (Math.abs(this._parent.empty.y - this.$curr_y$) == 1 && this._parent.empty.x == this.$curr_x$)  
  162.     }
  163.  
  164.     // /class Puzzle.Tile
  165.  
  166.     Puzzle.createPuzzle = function(target_mc,lib_mc,x_count,y_count,grid_size,gap_size,shuffle_max)
  167.     {
  168.         if(typeof target_mc != "movieclip")
  169.             return false
  170.         var depth, temp, i, j
  171.         depth = getNextDepth()
  172.         temp = target_mc.createEmptyMovieClip("Puzzle" + depth,depth)
  173.         temp.__proto__ = new Puzzle.Puzzle(lib_mc,x_count,y_count,grid_size,gap_size,shuffle_max)
  174.  
  175.         temp.empty = {x: x_count-1,y: y_count-1}
  176.         temp.tiles = []
  177.  
  178.         for( i=0; i < x_count;i++)
  179.         {
  180.             temp.tiles[i] = []
  181.             for( j=0; j < y_count;j++)
  182.             {
  183.                 temp.tiles[i][j] = temp.createTile(lib_mc,i,j,grid_size,gap_size)
  184.             }
  185.             temp.tiles[x_count -1][y_count-1]._visible = false
  186.         }
  187.         return temp
  188.     }
  189. }
  190. else
  191. {
  192.     debug("_global.Puzzle existiert schon");
  193. }
  194. // / Namespace Puzzle
  195.  
  196. // create one Puzzle with 4x4 Tiles into mc: _root, take Library-link "bild" as image template, each 20 pixels wide with 1 pixel gap between them. and shuffle 500 times
  197. myPuzzle = Puzzle.createPuzzle(_root.dummy,"bild",4,4,20,1,500)
  198. myPuzzle.shuffle()
  199. stop()
  200.  
  201. // Hilfsmethoden
  202. _global.getNextDepth = function(){return ++_global.$$nextDepth}
  203.  
  204. MovieClip.prototype.wabber=function(cp,ce,cv,cs,cc){
  205.     cc = cc ? cc : Infinity
  206.     return this[cp] += this["_d" add cp]= Math.max(-cc, Math.min(cc, this["_d" add cp] * cs + (ce - this[cp]) * cv))
  207. };
  208.  
  209. MovieClip.prototype.drawRect = function(x,y,width,height)
  210. {
  211.     with(this)
  212.     {
  213.         moveTo(x,y)
  214.         lineTo(x+width,y)
  215.         lineTo(x+width,y+height)
  216.         lineTo(x,y+height)
  217.         lineTo(x,y)
  218.     }
  219. };
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 20-05-2003, 21:25   #14 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
@k7c4 ... und ein MovieClip auf root namens dummy.

@secp .. bei dir muss es auch ein Symbol und einen mc
geben und ein Beispielcode wäre auch nicht schlecht,
so was wie

ActionScript:
  1. p = new puzzle( dummy, "BildSymbol", 2, 2, 1);
  2. p.init();


mfg r.
bokel ist offline   Mit Zitat antworten
Alt 20-05-2003, 21:46   #15 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Edit: Ich meinte natürlich den Code von k7c4
ohne mir das jetzt wirklich angeschaut zu haben, würde ich behaupten wollen, das der ganze temp Kram in die Tile-Klasse gehört, da passieren mir zu viele Dinge die IMHO nicht in die Puzzle Klasse gehören, da sollte nicht mehr als ein new Tile(Param1...ParamX) stehen.
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand

Geändert von e2e4 (21-05-2003 um 09:11 Uhr)
e2e4 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 15:43 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele