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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 30-12-2001, 15:45   #1 (permalink)
zeitreisender
 
Benutzerbild von emax
 
Registriert seit: Aug 2001
Ort: Hannover
Beiträge: 1.577
snake game (iso)

aloha
gerade noch rechtzeitig im iso-monat, wenn auch noch nicht fertig, hier mal meine snake variante.

ansehen

(source als anhang)

zur steuerung bitte schnell auf den movie klicken (wie gesagt ist ja noch nicht fertig). alternativ kann mit der maus+gedrückter linker maustaste gesteuert werden.

bitte berichtet mir bugs oder wie man snake noch 'aufmöbeln' kann. wenn die engine dann fertig ist kommt das ganze drumherum wie levles, score, highscore usw.

hier die grundfunktionen:

PHP-Code:
//die bekannt berüchtigte isofeld funktion --------------------------------------------
movieclip.prototype.verteilen = function (mapXmapYmcidwhxPosyPos) {

    for (var 
0x<mapXx++) {
        for (var 
0y<mapYy++) {
            
n++;
            
duplicateMovieClip(mcid, (2*n)+mcidn*2);
            
this[(2*n)+mcid]._x xPos+(x-y)*w/2;
            
this[(2*n)+mcid]._y yPos+(x+y)*h/2;
            
this[(2*n)+mcid].num 2*n;
        }
    }

}

//klitze's schwing-funktion --------------------------------------------------------------
movieclip.prototypeschwing=function(property,x0,amplitude,omega,phase,frictionreset) {
    
    if((!
this[property+"xPP"] && !this[property+"xP"]) or reset)
    {
        
this[property]            = x0+amplitude*Math.sin(phase)
        
this[property+"xP"]    = omega*amplitude*Math.cos(phase)
    }    
    
this[property+"xPP"]      = -omega*omega*(this[property]-x0)
    
this[property+"xP"]        += this[property+"xPP"]-friction*this[property+"xP"]
    
this[property]            +=this[property+"xP"]
    
//schwingungsende an objekt signalisieren
    
if(Math.abs(this[property+"xP"])<0.1) return rst=true;

}

//schwing objekt steuerung --------------------------------------------------------------
movieclip.prototype.obj_controll= function() {

    
//schwing funktion je ja richtung aufrufen
    
if(dir==1schwing("_y"up51Math.PI/20.4)
    else if(
dir==2schwing("_y"down513/2*Math.PI0.5);
    
    
//bei fertiger schwingung funktionsaufruf (schwing) sperren
    
if(rst && dir==2) {
        
dir=0;
        
this._y=down;

        
//fertige quad kopie aus group entfernen 
        
for(var k=0k<_parent.group.lengthk++){
            if((
_parent.group[k]+"quad")==_name) break;
        }
        
_parent.group.splice(k,1)
        
rst=false;
    } else if(
rstdir=0;

    
//richtungs signal für quad schwingung
    
if(signal==1) {
        
this.gotoAndPlay(2);
        
dir=1;
        
rst=false;signal=0;
        
schwing("_y"up51Math.PI/20.4true);
    } else if(
signal==2) {
        
this.gotoAndPlay(6);
        
dir=2;
        
rst=false;signal=0;
        
schwing("_y"down513/2*Math.PI0.5true);
    } 

}

//objekt initialisierung (load event im original isofled 'quad') --------------------------
movieClip.prototype.obj_init= function() {

    
up=this._y-16;
    
down=this._y;

}
//laufzeit Array abfragen und betreffende objekte abarbeiten (enterframe event) -----------
movieclip.prototype.laufzeit = function() {
    for(var 
z=0z<_parent.group.lengthz++){
        
with(_parent[_parent.group[z]+"quad"]){
            
obj_controll();
        }
    }
}

//false wenn ballposition auf einem der aktiven snakefelder -------------------------------
movieclip.prototype.double = function(value) {

    for(var 
i=0i<_root.main.snk.lengthi++){
        if(
_root.main.snk[i]==value) {
            
//trace("double");
            
return chk=false;
        }
    }
    return 
chk=true;

}

//snake frißt ball ? ---------------------------------------------------------------------
movieclip.prototype.gotit = function() {
    
    
//hitdetection
        //trace(_parent.snk[0]+" : "+_parent.bl);
        
if(_parent.snk[0]==_parent.bl) {
            
//snake wächst
            
lng=_parent.snk.length;
            
newpos=_parent.snk[lng-2]-_parent.snk[lng-1];
            
_parent.snk.push(_parent.snk[lng-1]-newpos);
            if(
_parent.snk[lng-1]-newpos>&& _parent.snk[lng-1]-newpos<=_parent.feld*_parent.feld){
            
_parent.group.push(_parent.snk[lng-1]-newpos);}
            
_parent.s_ball.start();
            
//neuen ball generieren
            
chk=false;
            while(!
chk){
                
_parent.bl = (random(_parent.feld*_parent.feld)+1) * ;
                
double(_parent.bl);
            }
            
_parent.ball0.swapDepths(_parent.bl+1);
            
_parent.ball0._x=_parent[_parent.bl+"quad"]._x;
            
_parent.ball0._y=_parent[_parent.bl+"quad"]._y-5;
            
_parent.ball0.gotoAndPlay(2);
        }

}

//snake initialisierung (load event) ------------------------------------------------------
movieclip.prototype.init_snake= function() {

    for(
i=0i<_parent.snk.lengthi++){
        
_parent[_parent.snk[i]+"quad"].signal=1;
    }
    
delay=getTimer();
    
direction=-2

}

//movesnake (enterframe event) ------------------------------------------------------------
movieclip.prototype.movesnake = function() {

    
//snake geschwindigkeit in abhängigkeit von snakelänge
    
if(_parent.snake.length<44delaytime=300-((_parent.snk.length-3)*3);

    
//snake bewegung
    
if(getTimer()-delay>delaytime){
        
delay=getTimer();
        
prt=_parent.snk.pop();
        
nprt=_parent.snk[0]+direction;
        
//game over check oberer/unterer rand
        
if(direction==-2) {
            for(var 
i=0i<_parent.feldi++) {
                if( (
1+_parent.feld*i)*== _parent.snk[0]) {
                    
_parent.snk.push(prt);
                    
_parent.gotoAndPlay(2);
                }
            }
        }
        else if(
direction==2) {
            for(var 
i=1i<=_parent.feldi++) {
                if( 
_parent.feld*i*== _parent.snk[0]) {
                    
_parent.snk.push(prt);
                    
_parent.gotoAndPlay(2);
                }
            }
        }
        
//game over check snake frißt snake
        
for(var i=1i<_parent.snk.lengthi++){
            if(
_parent.snk[0]==_parent.snk[i]){
                
_parent.snk.push(prt);
                
_parent.gotoAndPlay(2);
            }
        }
        
//game over check linker/rechter rand
        
if(nprt<or nprt>(_parent.feld*_parent.feld)*2) {
            
_parent.snk.push(prt);
            
_parent.gotoAndPlay(2);
        } 
        else {
            
_parent.snk.splice(0,0,nprt);
            
_parent.group.push(nprt);
            
_parent.s_snake.start();
            
_parent[_parent.snk[0]+"quad"].signal=1;
            
_parent[prt+"quad"].signal=2;
        }
        
//hittest + snake wachstum
        
gotit();
    }

}
//pfeiltasten steuerung (keydown event) ---------------------------------------------------
movieclip.prototype.ctrl = function() {

    if(
Key.getCode()==39)  {if(direction!=2direction=(-2) }
    else if(
Key.getCode()==37)  {if(direction!=-2direction=}
    else if(
Key.getCode()==40)  {if(direction!=_parent.feld*-2direction=_parent.feld*}
    else if(
Key.getCode()==38)  {if(direction!=_parent.feld*2direction=_parent.feld*-}

}

//initialisierung -------------------------------------------------------------------------

//iso feld erzeugen
feld=16;
verteilen(feldfeld"quad"quad._width-2, (quad._width-2)/20, -190);

//anfangs-snake generieren
snk=new Array(); //snakematrix
group= new Array(); //laufzeit array aktiver quads
st=136;
for(
i=0i<3i++){
    
snk[i]=st*2;
    
group[i]=st*2;
    
st++;
}

//ball generieren
chk=false;
while(!
chk){
    
bl = (random(feld*feld)+1) * ;
    
double(bl);
}
duplicateMovieClip(ball"ball0"bl+1);
ball0._x=this[bl+"quad"]._x;
ball0._y=this[bl+"quad"]._y-5;
ball0.gotoAndPlay(2);

//sound
s_snake=new Sound();
s_snake.attachSound("s1");
s_ball=new Sound();
s_ball.attachSound("s2");
s_die=new Sound();
s_die.attachSound("s3");
s_titel=new Sound();
s_titel.attachSound("s4"); 
Angehängte Dateien
Dateityp: zip snake_src.zip (8,3 KB, 180x aufgerufen)
__________________
Website: www.thomas-vogel.de

Geändert von emax (30-12-2001 um 16:26 Uhr)
emax ist offline   Mit Zitat antworten
Alt 30-12-2001, 15:54   #2 (permalink)
ontheoutsidelookingin
 
Benutzerbild von dassoud
 
Registriert seit: Jun 2001
Ort: Dortmund
Beiträge: 5.897
Thumbs up

aha, das ist also das angkündigte schmankerl!

seeehr cool geworden, die steuerung ist gewöhnungsbedürftig, iso halt. mich hat's direkt rausgeworfen...

schaut auch nach pixelgrafiken aus, cool!

ein restart-button wäre nett!

bin begeistert, dassoud
__________________

33rpm
dassoud ist offline   Mit Zitat antworten
Alt 30-12-2001, 16:01   #3 (permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Wiesbaden
Beiträge: 10.945
Ich schließe mich an, spitze !

es gibt sehr viele umsetzung, diese ist aber wirklich gelungen..einfach genial !


Sebastian
sebastian ist offline   Mit Zitat antworten
Alt 30-12-2001, 16:04   #4 (permalink)
BenutzerID: 436
 
Benutzerbild von Sebastian S.
 
Registriert seit: Jun 2001
Ort: Ruhrgebiet
Beiträge: 2.333
finde es auch echt super, aber die steurung war irgendwie komisch.. hab mir mal die freiheit genommen, das zu berichtigen..

gucken

und häng die fla auch an..

aber ist ech ne super sache, emax..

gruß
sebastian
Angehängte Dateien
Dateityp: zip snake_src.zip (8,8 KB, 82x aufgerufen)
__________________

Geändert von Sebastian S. (30-12-2001 um 16:07 Uhr)
Sebastian S. ist offline   Mit Zitat antworten
Alt 30-12-2001, 16:07   #5 (permalink)
zeitreisender
 
Benutzerbild von emax
 
Registriert seit: Aug 2001
Ort: Hannover
Beiträge: 1.577
thx yo restart etc. kommt ja alles noch ..erst muss engine passen

leider macht mir die schlechte flash performance schwer zu schaffen. ich hatte ursprünglich ein 20*20 isofeld, aber mit 400 objekten kommt flash nicht klar (oder meine cpu) und nun hab ich auf 16*16 abgespeckt.
wie gesagt ist das ein problem der namensgebung der objekte. ist schwierig für 400 objekte 400 unterschiedliche anfangszeichen für die namen zu finden damit flash sie intern schneller findet.
man merkt das am ungleichen tempo der snake, je nach position. bei 20*20 war der effekt noch stärker zu sehen.
wer sich die fla gesaugt hat kann das mal mit größeren felder ausprobieren. einfach die variable 'feld' auf auf 20 oder größer setzen
__________________
Website: www.thomas-vogel.de
emax ist offline   Mit Zitat antworten
Alt 30-12-2001, 16:25   #6 (permalink)
Friend of Ed
 
Registriert seit: Dec 2001
Ort: Chiemsee
Beiträge: 669
absolut spitze!

toller eindruck! echt klasse gemacht! respekt!

schöne grüße
dominic
Dominic H. ist offline   Mit Zitat antworten
Alt 30-12-2001, 20:57   #7 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Sehr guter Ansatz - weiter so !

mfg
Matze K.
Madokan ist offline   Mit Zitat antworten
Alt 04-01-2002, 12:18   #8 (permalink)
FlashPlayerPro
 
Benutzerbild von flashin vedder
 
Registriert seit: Dec 2001
Ort: BERLIN-NEUKÖLLN
Beiträge: 60
für die Numerierung der mc in einem x/y Feld kann Ich empfehlen ne xylevel-funktion zu benutzen, kann meine function grad nich finden sollte aber in etwa so aussehen:

xylevel=xpos+(ypos*maxxpos)

benutzte das um mc's zu benennen und auch um mc auf eigene levels zu platzieren.

konnte im übrigen dein File nich downloaden , krieg nur ne php im download ????
__________________
dubfix
flashin vedder ist offline   Mit Zitat antworten
Alt 04-01-2002, 12:27   #9 (permalink)
zeitreisender
 
Benutzerbild von emax
 
Registriert seit: Aug 2001
Ort: Hannover
Beiträge: 1.577
mh ... bringt das was jedes mc in seinen eigenen level zu packen ?

ich bin mir nicht sicher wie ich die mc mit
duplicateMovieClip(mcid, (2*n)+mcid, n*2);
this[(2*n)+mcid]._x = xPos+(x-y)*w/2;
this[(2*n)+mcid]._y = yPos+(x+y)*h/2;

gleich in verschiedene levels dupliziere ? oder meinst du mit levels die tiefenebene ?

mh ..der download funkt bei mir
ich kanns dir auch zumailen ..pm mich an unbd gib deine email
__________________
Website: www.thomas-vogel.de

Geändert von emax (04-01-2002 um 12:33 Uhr)
emax ist offline   Mit Zitat antworten
Alt 04-01-2002, 12:34   #10 (permalink)
FlashPlayerPro
 
Benutzerbild von flashin vedder
 
Registriert seit: Dec 2001
Ort: BERLIN-NEUKÖLLN
Beiträge: 60
klar meine ich die Tiefenebene , Flash verlangt ja danach beim dupliMc oder attachMc. Is halt praktisch numerierung und Tiefenebene in einem.

konnte deine fla leider nich angucken.
krieg nur n php file beim download ....
__________________
dubfix
flashin vedder ist offline   Mit Zitat antworten
Alt 04-01-2002, 12:38   #11 (permalink)
Sodarianer
 
Benutzerbild von Soda
 
Registriert seit: Jul 2001
Ort: Neumarkt Opf.
Beiträge: 544
Arrow re:

... jojo das gefällt mir !

Soda
Soda ist offline   Mit Zitat antworten
Alt 06-01-2002, 00:48   #12 (permalink)
zeitreisender
 
Benutzerbild von emax
 
Registriert seit: Aug 2001
Ort: Hannover
Beiträge: 1.577
thja ..ich bin jetzt irgendwie ziemlich ratlos. denn ich sehe langsam ein daß es keinen sinn hat derart große felder aus einzelnen objekten zu bauen.

jedes einzelne isofeld ist ja ein objekt. bei den derzeit 16*16 feldern ergibt das 256 objekte.

die snake wird proportional zu ihrer länge einfach immer langsamer und dabei ist mein script schon so ausgelegt, daß nur die objekte die animiert oder aktiv sind gesteuert durch ein laufzeit-array abgearbeitet werden.

..dumm gelaufen ich hoffe das flash6 AS ist etwas perfomanter
__________________
Website: www.thomas-vogel.de
emax ist offline   Mit Zitat antworten
Alt 06-01-2002, 07:59   #13 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Du könntest noch versuchen das ganze zwischen Frames laufen zu lassen anstat auf enterFrame Clipevents.

Auch sehr komisch dadurch wird es schneller.

mfg
Matze K.
Madokan ist offline   Mit Zitat antworten
Alt 06-01-2002, 14:09   #14 (permalink)
zeitreisender
 
Benutzerbild von emax
 
Registriert seit: Aug 2001
Ort: Hannover
Beiträge: 1.577
ich habs jetzt doch noch geschafft daß die snake nicht langsamer wird. ich wollts schon fast aufgeben

wo früher sämtliche objekte die gerade "oben" waren abgearbeitet wurden sind es jetzt nur noch die, die schwingen.
d.h egal wie lang die schlange ist werden jetzt nur ca. 5 objekte pro frame angesprochen. wenigstens bleibt die miese performance jetzt auf einem level

ich hoffe ich kann das game heute fertigstellen
__________________
Website: www.thomas-vogel.de
emax ist offline   Mit Zitat antworten
Alt 07-01-2002, 17:20   #15 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Emax:

Lass dir Zeit - keine Panik

mfg
Matze K.
Madokan 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:44 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele