Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 25-07-2006, 10:35   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2005
Beiträge: 90
selbstaufrufende funktion bitte HILFE!

hi,

so jetzt muss ich euch leider mal wieder nerven, braeuchte mal wieder rat:

folgendes: ich hab ein kleines gravity system gebastelt, mit einem ball der in die stage reinhuepfen und ein bischen rumspringen soll. sobald der ball aus der stage herausgehuepft ist, soll, der MC entfernt werdern und ein neuer mit anderen bounce etc. parametern hineinspringen.

hier mal das script bis jetzt:
Code:
_global.gravity = 2 ;	
_global.floor = Stage.height ;
_global.bounce = 0.92 ;
_global.speedx = 3 ;
_global.speedy = 0 ;


function initBall() {
	var i:Number = 0;
	nName = "ball"+i;
	var nName:MovieClip = this.attachMovie("test_mc", nName, i++);
	nName._x = 20;
	nName._y = 20;
}

initBall();

_root.onEnterFrame = function(){
	
	speedy = speedy + gravity ;
	
	this._x += speedx/5 ;
	this._y += speedy/5 ;
	
	if (this._y > floor) {
		this._y = floor ;
		speedy *= -bounce ;
	}

//HIER VIELLEICHT??? MARKER....
}


stop();
gibt es eine moeglichkeit, initBall erneut aufzurufen? wenn ja von wo und wie?? bei der ...marker stelle hab ich schon ein

Code:
if(nName._x > Stage.width){
nName.removeMovieClip();
initBall();
}
probiert, umsonst....

wenn jemand vielleicht einen guten ansatz hat wie ich das bewerkstellige dass die geschichte quasi in ner endlosschleife lauft waer wirklich super! wie geh ich das am besten an?

gruesse
nizon ist offline   Mit Zitat antworten
Alt 25-07-2006, 10:53   #2 (permalink)
Flash it baby!
 
Registriert seit: Feb 2003
Beiträge: 287
Warum bewegst Du mit dem onEnterFrame die Bühne und nicht nur das MC mit dem Ball:

PHP-Code:
_global.gravity ;    
_global.floor Stage.height ;
_global.bounce 0.92 ;
_global.speedx ;
_global.speedy ;


function 
initBall() {
    var 
i:Number 0;
    
nName "ball"+i;
    var 
nName:MovieClip this.attachMovie("test_mc"nNamei++);
    
nName._x 20;
    
nName._y 20;
    
nName.onEnterFrame moveBall;
}


function 
moveBall(){
    
    
speedy speedy gravity ;
    
    
this._x += speedx/;
    
this._y += speedy/;
    
    if (
this._y floor) {
        
this._y floor ;
        
speedy *= -bounce ;
    }
    if (
this._x>Stage.width) {
        
this.removeMovieClip();
        
initBall();
    }

}

initBall();

stop(); 
Ohne Gewähr
Da_Judge ist offline   Mit Zitat antworten
Alt 25-07-2006, 10:58   #3 (permalink)
:Void
 
Benutzerbild von janoshnosh
 
Registriert seit: Jun 2005
Ort: börlin
Beiträge: 931
Zitat:
_root.onEnterFrame = function(){

speedy = speedy + gravity ;

this._x += speedx/5 ;
this._x += ...... lässt du den ball hüpfen oder die bühne ? this bezieht sich doch in diesem block auf _root!

deine funktion ist eigentlich ganz gut - mit dem haken, dass sie nichts wirklich macht . da wird ein movieclip erzeugt, der im folgenden nicht wirklich verwendbar ist. eine funktion mit dem return-type MovieClip wäre angebrachter:
ActionScript:
  1. _global.gravity = 2 ;   
  2. _global.floor = Stage.height ;
  3. _global.i = 0;              //das sollte außerhalb deklariert werden
  4. _global.ball;                     //du brauchst einen BALL!!
  5.  
  6.  
  7. function initBall() :MovieClip {       //soll einen mc zurückgeben
  8.     var name = "ball"+i;                //nName wird später benutzt!
  9.     var nName:MovieClip = this.attachMovie("test_mc", name, i++);
  10.     nName._x = 20;
  11.     nName._y = 20;
  12.     //der MC bekommt ein paar eigenschaften
  13.     nName.bounce = Math.random();      //zufallszahl zwischen 0.000 und 0.999
  14.     nName.speedx = random(10);      //zufallszahl zwischen 0 und 9
  15.     nName.speedy = 0;
  16.     return nName;                  //der ball wird zurückgegeben
  17. }
  18.  
  19. ball = initBall();            //hier weist du deinem ball einen mc zu
  20.  
  21. ball.onEnterFrame = onenterframe;      //der ball soll sich bewegen, nicht _root!
  22.  
  23.  
  24. function onenterframe () :Void {
  25.    
  26.     this.speedy = this.speedy + _global.gravity ;   
  27.     this._x += this.speedx/5 ;
  28.     this._y += this.speedy/5 ;
  29.    
  30.     if (this._y > _global.floor) {
  31.         this._y = _global.floor;
  32.         this.speedy *= -this.bounce ;
  33.     }
  34.    
  35.     if (this._x > Stage.width){
  36.         delete this.onEnterFrame;         //oEF des balls wird entfernt
  37.         this.removeMovieClip();    //ball wird entfernt
  38.         ball = initBall();          //dem Ball wird ein neuer mc zugewiesen
  39.         ball.onEnterFrame = onenterframe;   //und diesem die oEF-schleife mit ^^dieser funktion
  40.     }
  41. }
  42.  
  43.  
  44. stop();
ich würde das auf diese art lösen.

gruß janosch
janoshnosh ist offline   Mit Zitat antworten
Alt 25-07-2006, 11:36   #4 (permalink)
Neuer User
 
Registriert seit: Oct 2005
Beiträge: 90
danke danke fuer alles posts!

@ janoshnosh

sehr genialer ansatz, danke dir! nur muss ich dich jetzt leider noch ein bischen nerven

sagmal woran koennte das liegen dass jetzt der ball nicht unten auf der stage wieder zurueck bounced sondern einfach in die tiefen meines bildschirmes faellt?? wenn ich statt stage.height zb 300 nehm, faellt der ball erst mal bist FAST ganz unten und bounced ziemlich komisch ab, dann erst faellt er auf die stage unten und bounced ganz normal...?

und wieso faengt der 2. ball nicht wieder bei

nName._x = 20;
nName._y = 20;

an sondern viel weiter unten? normalerweise wird dem doch wieder 20/20 mitgegeben oder nicht??

gruesse
nizon ist offline   Mit Zitat antworten
Alt 25-07-2006, 11:45   #5 (permalink)
:Void
 
Benutzerbild von janoshnosh
 
Registriert seit: Jun 2005
Ort: börlin
Beiträge: 931
hm das lässt sich nun aus der ferne schwer sagen. die funktion sollte bewerkstelligen, dass der ball beim ersten erzeugen sowie bei allen weiteren bei 20/20 anfängt - sie kann ja gar nicht anders!

benutze am besten mal den trace() befehl, um alle werte beobachten zu können.

ich habe jetzt aber gerade gesehen, dass es hier ja um as1 geht und ich wieder mal in as2 geantwortet habe ... vielleicht verursacht das ja fehler. welche flash-version benutzt du, bzw. welches actionscript?

den code gibts auch gerne nochmal in as1, aber der von Da_Judge ist auch sehr fein und vor allem as1.

gruß janosch
janoshnosh ist offline   Mit Zitat antworten
Alt 25-07-2006, 11:57   #6 (permalink)
Neuer User
 
Registriert seit: Oct 2005
Beiträge: 90
hmm, komisch, jetzt funktionierts auf einmal, aber das einzige was ich geaendert hab ist der functionsname onenterframe in moveBall, vielleicht mag ers trotz caseSensitive net....

hab vorher auch mit trace gearbeitet, hat den _y auch bis stage.height runtergezaehlt und dann gestoppt, nur ist der ball weitergefallen, total strange!

naja, trotzdem vielen vielen dank fuer deine muehe!!!

gruesse
nizon ist offline   Mit Zitat antworten
Alt 25-07-2006, 12:01   #7 (permalink)
Flash it baby!
 
Registriert seit: Feb 2003
Beiträge: 287
Hab mein Script nochmal überarbeitet, bin nur auf Deine Fragen eingegangen, da sind aber noch ein paar mehr Fehler drinnen. Du veränderst nämlich das globale speedy. So gehts auf jeden Fall in AS 1:

PHP-Code:
_global.gravity 2;
_global.floor Stage.height;
_global.bounce 0.92;
_global.speedx 10;
_global.speedy 0;
_global.0;
function 
initBall() {
    var 
title "ball"+i;
    
nName this.attachMovie("test_mc"titlei++);
    
nName._x 200;
    
nName._y 20;
    
nName.speedy speedy;
    
nName.onEnterFrame moveBall;
}
MovieClip.prototype.moveBall = function() {
    
trace(this);
    var 
tempy this.speedy+gravity;
    
this._x += speedx/5;
    
this._y += tempy/5;
    
this.speedy tempy;
    if (
this._y>floor) {
        
this._y floor;
        
this.speedy *= -bounce;
    }
    if (
this._x>Stage.width) {
        
this.removeMovieClip();
        
initBall();
    }
};
initBall();
stop(); 
Da_Judge 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 06:27 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele