Antworten auf deine Fragen:
Neues Thema erstellen

Animation beschleunigen

tutto

Nicht mehr ganz neu hier

Hallo,
als blutiger Anfänger mit AS3 versuche ich mich an einem Avoider-Game.
Ich habe einen »enemy« der von oben nach unten läuft. Bei Position Y425 wird der Kerl erneut auf Position -25 eingesetzt. Soweit so gut. Ich möchte nun dass bei jedem neuen Durchlauf (Pos Y-25) die
Geschwindigkeit etwas erhöht wird. Ich hatte mir vorgestellt dass ich in der Anweisung dann einfach enemy.y inkrementiere. Ich schaff's nicht. Was läuft verkehrt?


function aniVertical(event:Event)
{
enemy.y +=5;

if (enemy.y > 425)

{
enemy.y = -25;
// ich müsste doch hier die Y-Bewegung einfach inkrementieren können
}
}
 

ssandner

Nicht mehr Newbie

Wie wäre es, wenn du Deine "5" in einer Variablen ablegst (var a:uint = 5) und dann in Deiner if-bedingung a hochzählst:

Code:
var a:uint = 5;
function aniVertical(event:Event)
{
enemy.y = y+ a;

if (enemy.y > 425)
{
a++;
enemy.y = -25;
}
}
 

keul3

3dsMax | 3D-Contest

@ssandner
ich hoffe es stört dich nicht, dass ich deinen Code etwas umgeschrieben habe...
Code:
const SPEED_ORIGIN:Number = 5; //Anfangsgeschwindigkeit
const DELTA_SPEED:Number = 1.5; //Die Geschwindigkeit die bei jedem Durchlauf auf s hinzuaddiert wird
var s:Number = SPEED_ORIGIN;

function aniVertical(event:Event):void //auch wenn die Funktion nix zurückgibt, diese deklarieren, macht es einfacher den Code zu lesen
{
    enemy.y += s;

    if (enemy.y > 425)
    {
        s += DELTA_SPEED;
        enemy.y = -25;
    }
}
 

ssandner

Nicht mehr Newbie

@keul3
Natürlich nicht ;-)
Ich hatte den Codevorschlag auch nur so runtergeschrieben ohne ihn zutesten.
Außerdem bin ich immer neugierig auf andere Vorschläge.
Ich hoffe der TO kann mit unseren Vorschlägen etwas anfangen.

@tutto
Wäre es nicht eleganter, wenn der enemy nicht wieder nach oben springt, sondern seine Richtung ändert?
 

tutto

Nicht mehr ganz neu hier

@ssandner
Du bist mir einen Schritt voraus! Genau dazu habe ich das nächste Problem.

Ich generiere für meine 4 möglichen X- Positionen eine random-Zahl von eins bis vier.
Das funktioniert (mit trace ausgelesen). Dann Positioniere ich mit der function xPos.
Das funktioniert auch aber nur beim Start!???

Code:
// Vertikal animieren

enemy.addEventListener(Event.ENTER_FRAME, aniVertical);
enemy.addEventListener(Event.ENTER_FRAME, xPos);

//Variable Geschwindigkeit
var speed:Number = 5;
// Zufallszahl erstellen zwischen 1 und 4
var randNum:Number = 1+Math.floor(Math.random() * (4-1+1));

function xPos(event:Event):void
{
    enemy.x = randNum * 50 -25
}

// Versetzt »enemy« in Y-Richtung um den Wert speed.
/*if Schleife: wenn »enemy« y425 erreicht hat dann ist die
neue Position y -25. Es ist nur ein Objekt »enemy« im Spiel.*/
function aniVertical(event:Event):void
{
    enemy.y = enemy.y+speed;

    if (enemy.y > 425)
    {
        enemy.y = -25;
        // wenn y 425 ist wird mit ++ die Geschwindigkeit um den Wert 1 erhöht
        speed++;
    }
}

trace (randNum)
 

tutto

Nicht mehr ganz neu hier

@keul3

ich kann Deinen Vorschlag zwar lesen, mich schockt aber soviel Code. Ist wahrscheinlich universeller. Ich hab's mal so probiert. Schien mir einfacher.

Da die Beschleunigung endlos weiter läuft, kann es da zu technischen Problemen kommen?

Code:
var speed:Number = 5;

function aniVertical(event:Event):void
{
    enemy.y = enemy.y+speed;

    if (enemy.y > 425)
    {
        enemy.y = -25;
        // wenn y 425 ist wird mit ++ die Geschwindigkeit um den Wert 1 erhöht
        speed++;
    }
}
 

keul3

3dsMax | 3D-Contest

Ich generiere für meine 4 möglichen X- Positionen eine random-Zahl von eins bis vier.
Das funktioniert (mit trace ausgelesen). Dann Positioniere ich mit der function xPos.
Das funktioniert auch aber nur beim Start!?
soll die x-Position ständig geändert werden oder nur einmal pro Durchlauf?
Ich nehme mal letzteres an, dann ist der EnterFrameListener falsch und es reicht, einfach die Funktion in der if-Bedingung aufzurufen.
habs mal umgeschrieben, diesmal nur ganz wenig;)
Code:
// Vertikal animieren
enemy.addEventListener(Event.ENTER_FRAME, aniVertical);
xPos(); //einmal vor dem Start ausführen

//Variable Geschwindigkeit
var speed:Number = 5;


function xPos():void
{
    // Zufallszahl erstellen zwischen 1 und 4
    var randNum:Number = 1 + Math.floor(Math.random() * 4);
    enemy.x = randNum * 50 -25
}
// Versetzt »enemy« in Y-Richtung um den Wert speed.
/*if Bedingung: wenn »enemy« y425 erreicht hat dann ist die
neue Position y -25. Es ist nur ein Objekt »enemy« im Spiel.*/
function aniVertical(event:Event):void
{
    enemy.y = enemy.y+speed;
    if (enemy.y > 425)
    {
        enemy.y = -25;
        // wenn y 425 ist wird mit ++ die Geschwindigkeit um den Wert 1 erhöht
        speed++;
        xPos();
    }
}
trace (randNum)

ich kann Deinen Vorschlag zwar lesen, mich schockt aber soviel Code.
zuviel?! :D
sind nur 2 Konstanten mehr, der Rest sind Comments;)

Ist wahrscheinlich universeller.
ist es, du addierst jetzt immer genau 1 hinzu, wenn das passt gut, aber gerade solche Dinge würde ich flexibel gestalten

Da die Beschleunigung endlos weiter läuft, kann es da zu technischen Problemen kommen?
je nach dem was passieren soll, folgt später bspw. eine Kollisionsabfrage?
 

tutto

Nicht mehr ganz neu hier

@keul3

Du hast erraten was ich erreichen wollte und es funktioniert!!! Deine Korrekturen sind für mich sehr hilfreich.

Aber die Begrifflichkeiten mit dem Code?? So richtig blicke ich es noch nicht. Du sprichst von zwei Konstanten. Wenn ich in der Adobe-Hilfe nachsehe dann wird dort die Konstante mit »const« begonnen. Ich weiß eigentlich nicht »wer« gemeint ist.

Diesen Teil habe ich aus dem Praxisbuch AS3 abgeleitet.
Code:
var randNum:Number = 1+Math.floor(Math.random() * (4-1+1));

Du hast diesen Teil in die function gesetzt. Ich bin davon ausgegangen das Variablen immer am Anfang deklariert werden müssen.

Beim Event-Listener habe ich gedacht, dass die beiden Schreibweisen eigentlich das gleiche tun. Oder fehlt nur die Klammer?

Code:
enemy.addEventListener(Event.ENTER_FRAME, aniVertical);
enemy.addEventListener(Event.ENTER_FRAME, xPos);

enemy.addEventListener(Event.ENTER_FRAME, aniVertical); xPos();

Das mit der Kollisionsabfrage versuche ich jetzt mal.

Mit der unendlichen Beschleunigung meinte ich ob das den Rechner zum Absturz bringen kann wie eine Endlosschleife?
 

keul3

3dsMax | 3D-Contest

Aber die Begrifflichkeiten mit dem Code?? So richtig blicke ich es noch nicht. Du sprichst von zwei Konstanten. Wenn ich in der Adobe-Hilfe nachsehe dann wird dort die Konstante mit »const« begonnen. Ich weiß eigentlich nicht »wer« gemeint ist.
hab doch oben const benutzt;)
Code:
const SPEED_ORIGIN:Number = 5;
const DELTA_SPEED:Number = 1.5;
Man kann auch Variablen benutzen, aber da die Werte im Verlauf des Programm sich nicht ändern, also KONSTANT bleiben, ist es ratsam Konstanten zu deklarieren. Ist 1. übersichtlicher beim lesen des Codes und 2. weiß der Compiler gleich was Sache ist und Flash spart entsprechend Ressourcen. Es ist einfach ein besserer CodingStil, immer nur soviel wie nötig;)

Du hast diesen Teil in die function gesetzt. Ich bin davon ausgegangen das Variablen immer am Anfang deklariert werden müssen.
Variablen sollten am besten immer dort deklariert werden wo sie benötigt werden, Stichworte: Global und Lokal. Deine randNum wird nur in der xPos-Funktion benötigt, deshalb sollte diese auch dort deklariert werden (local). Würdest du diese Variable z.B. noch in anderen Funktionen benötigen sollte diese außerhalb der Funktionen gesetzt werden (Global).

Beim Event-Listener habe ich gedacht, dass die beiden Schreibweisen eigentlich das gleiche tun. Oder fehlt nur die Klammer?
xPos ist nur eine einfache Funktion, und kein EventHandler. Der EnterFrameListener ruft die entsprechende Funktion bei jedem Framewechsel auf, also quasi ständig abhängig von der FrameRate. xPos soll aber nur bei gewissen Bedingen aufgerufen werden;)

Mit der unendlichen Beschleunigung meinte ich ob das den Rechner zum Absturz bringen kann wie eine Endlosschleife?
Mit Flash gleich den kompletten Rechner aufzuhängen wird recht schwer. Aber dein Spiel wird evtl. iwann Dinge machen, die du nicht möchtest, aber dazu müsste die Geschwindigkeit schon seeehr groß werden.
 

tutto

Nicht mehr ganz neu hier

@keul3
Ich hab da noch eine generelle Frage wie der Code geordnet sein sollte. Ich habe die beiden Teile hero (Tastatursteuerung) und enemy (Animation) zunächst getrennt getestet und jetzt erst in eine Datei gepackt. Kann ich die beiden Blöcke weil übersichtlicher hintereinander stehen lassen oder müssen alle Eventlistener und Deklarationen nach oben.
 

tutto

Nicht mehr ganz neu hier

@keul3

jetzt ist noch ein blödes Problem aufgetreten. Ich habe die Funktion mit hitTestObjekt Klasse geschrieben. Es funktioniert, aber die Reaktion kommt schon bei der Berührung und nicht bei der Überlappung.

Ich habe pixelgenaue Quadrate wenn die nebeneinander stehen wird HIT ausgelöst. Die Quadrate möchte ich ungern verkleinern das sieht blöd aus. Gibt es denn eine einfache Lösung für das Problem?
 

keul3

3dsMax | 3D-Contest

Ich hab da noch eine generelle Frage wie der Code geordnet sein sollte.
Generell Variablen/Konstanten oben, Funktionen unten, ist aber eigentlich egal.
Und am Besten alles objektorientiert schreiben, sprich Klassen benutzen, z.B. eine Hero-Klasse, Enemy-Klasse, Steuerung-Klasse usw.

Kann ich die beiden Blöcke weil übersichtlicher hintereinander stehen lassen oder müssen alle Eventlistener und Deklarationen nach oben.
kannst so lassen

Ich habe die Funktion mit hitTestObjekt Klasse geschrieben.
Eins vorweg, hitTestObject() ist keine Klasse sondern eine Methode der DisplayObject-Klasse. Bin mir gerad nicht sicher, aber ich meine hitTestObject arbeitet nur mit den BoundingBoxes der jeweiligen Objekte, sprich wenn deine Objekte nicht gerad komplett rechteckig sind, kann das ungewollte Ergebnisse bringen. Arbeite lieber mit hitTestPoint().
Alternativ wäre auch die hitTest()-Methode möglich, wenn du ein BitmapData-Object hast.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Statistik des Forums

Themen
118.621
Beiträge
1.538.378
Mitglieder
67.545
Neuestes Mitglied
helenkitina
Oben