PDA

Volledige versie bekijken : Roterend vierkantje langzaam tot stilstand brengen


supremekareem
%Europe/Berlin %447 %2009, 10:43
Het werkt perfect alleen nog een klein dingetje, het vierkantje moet zacht roterend opkomen, tot z'n max. Als ik er weer af ga dan moet hij ook weer zacht roterend stoppen. Alvast heeel erg bedankt aan degene die me hierbij helpt!

Hier mijn class:


package classes {

import flash.display.Sprite;
import flash.events.*;

public class Vierkantje_mc extends Sprite {

private var rotate:Boolean = false;

public function Vierkantje_mc() {
addEventListener(Event.ADDED_TO_STAGE, onStage);
}
private function onStage(evt) {
removeEventListener(Event.ADDED_TO_STAGE, onStage);
addEventListener(Event.REMOVED_FROM_STAGE, onRemove);

addEventListener(MouseEvent.MOUSE_OVER, onOver);
addEventListener(MouseEvent.MOUSE_OUT, onOut);
addEventListener(Event.ENTER_FRAME, onFrame);
}
private function onOver(evt) {
rotate = true;
}
private function onOut(evt) {
rotate = false;
}
private function onFrame(evt) {
if(rotate) {
rotation += 20;
}
}
private function onRemove(evt) {
removeEventListener(Event.REMOVED_FROM_STAGE, onRemove);

removeEventListener(MouseEvent.MOUSE_OVER, onOver);
removeEventListener(MouseEvent.MOUSE_OUT, onOut);
removeEventListener(Event.ENTER_FRAME, onFrame);
}
}
}

B-Mantis
%Europe/Berlin %465 %2009, 11:10
private function onFrame(evt) {
if(rotate) {
rotation += rotationSpeed;
rotationSpeed *= .99; //of : -= .001; etc
}
}


alleen nog ff die variabele aanmaken in je class.

B-Mantis
%Europe/Berlin %476 %2009, 11:25
hier is ie iets completer, ik had je post niet 100% goed gelezen:

package classes {

import flash.display.Sprite;
import flash.events.*;

public class Vierkantje_mc extends Sprite {

private var rotate:Boolean;
private var accelerating:Boolean;
private var rotateSpeed:Number;
public function Vierkantje_mc() {
rotate = false;
accelerating = false;
rotateSpeed = 0.0;
addEventListener(Event.ADDED_TO_STAGE, onStage);
}
private function onStage(evt) {
removeEventListener(Event.ADDED_TO_STAGE, onStage);
addEventListener(Event.REMOVED_FROM_STAGE, onRemove);

addEventListener(MouseEvent.MOUSE_OVER, onOver);
addEventListener(MouseEvent.MOUSE_OUT, onOut);
addEventListener(Event.ENTER_FRAME, onFrame);
}
private function onOver(evt) {
rotate = true;
accelerating = true;
rotateSpeed = 0.0;
}
private function onOut(evt) {
rotate = false;
}
private function onFrame(evt) {
if(rotate) {
rotateSpeed += accelerating ? .5 : -.5;
if (rotateSpeed > 20) {
rotateSpeed = 20;
accelerating = false; //start deaccelerating
}
rotation += rotateSpeed;
}
}
private function onRemove(evt) {
removeEventListener(Event.REMOVED_FROM_STAGE, onRemove);

removeEventListener(MouseEvent.MOUSE_OVER, onOver);
removeEventListener(MouseEvent.MOUSE_OUT, onOut);
removeEventListener(Event.ENTER_FRAME, onFrame);
}
}
}


Ik heb het niet getest, maar je zult het idee begrijpen!

supremekareem
%Europe/Berlin %482 %2009, 11:35
Het werkt alleen nog als ik er af ga dan moet hij doordraaien en langzaam stoppen.

SOIESO AL HEEL ERG BEDANKT!

B-Mantis
%Europe/Berlin %522 %2009, 12:31
Sorry dat ik geen antwoord meer gaf, hier is je oplossing:


package classes {

import flash.display.Sprite;
import flash.events.*;

public class Vierkantje_mc extends Sprite {

private var rotateRight:Boolean;
private var accelerating:Boolean;
private var rotateSpeed:Number;
public function Vierkantje_mc() {
rotateRight = false;
accelerating = false;
rotateSpeed = 0.0;
addEventListener(Event.ADDED_TO_STAGE, onStage);
}
private function onStage(evt) {
removeEventListener(Event.ADDED_TO_STAGE, onStage);
addEventListener(Event.REMOVED_FROM_STAGE, onRemove);

addEventListener(MouseEvent.MOUSE_OVER, onOver);
addEventListener(MouseEvent.MOUSE_OUT, onOut);
addEventListener(Event.ENTER_FRAME, onFrame);
}
private function onOver(evt) {
rotateRight = true;
accelerating = true;
rotateSpeed = 0.0;
}
private function onOut(evt) {
rotateRight = false;
accelerating = false; //start deaccelerating
}
private function onFrame(evt) {
if(rotateRight) {
//rotate right, increasing speed
//accelerating
if (rotateSpeed > 20) {
rotateSpeed = 20;
} else if (rotateSpeed < 20) {
rotateSpeed += .5;
}
} else {
//decrease speed until speed < 0. Then reset speed to 0
//deacelerating
if (rotateSpeed < 0) {
rotateSpeed = 0;
} else if (rotateSpeed > 0) {
rotateSpeed -= .5;
}
}
rotation += rotateSpeed;
}
private function onRemove(evt) {
removeEventListener(Event.REMOVED_FROM_STAGE, onRemove);

removeEventListener(MouseEvent.MOUSE_OVER, onOver);
removeEventListener(MouseEvent.MOUSE_OUT, onOut);
removeEventListener(Event.ENTER_FRAME, onFrame);
}
}
}


Ik hoop dat je hiermee verder komt!

supremekareem
%Europe/Berlin %556 %2009, 13:20
B-Mantis heel erg bedankt, opzich werkt het wel, ik moet nu alleen nog weten hoe ik de class op een bepaald frame kan laten beginnen! met Addchild ofz?

B-Mantis
%Europe/Berlin %594 %2009, 14:15
hoe bedoel je frame? Als je het over een frame hebt als in een Movieclip, dat kan niet. Want je hebt het hier over een sprite. Of bedoel je dat je deze vierkantjes ergens op een bepaalde frame pas wil laten verschijnen? Je kunt in de bovenliggende displayObjectContainer in de enterFrame functie zoiets doen:


if (currentFrame == 5) {
addChild(new Vierkantje_mc());
nextFrame(); //zodat ie dit niet oneindig blijft herhalen
}

supremekareem
%Europe/Berlin %601 %2009, 14:25
nee, de class is gekoppeld aan een fla bestand, bij frame 103 bijv in het fla bestand moet de class pas zijn werk gaan doen.

Ik heb nu heel veel frames die hij afspeelt en dan komen die vierkantjes invliegen van klein naar groot. Ze blijven nu klein maar de class werkt perfect.

Daarom dacht ik als ik die class pas zijn werk laat doen op het moment dat die vierkantjes groot zijn dan is het probleem verholpen?

Of is er nog een andere manier?

B-Mantis
%Europe/Berlin %602 %2009, 14:27
Je kunt ook een classe toewijzen aan je flash bestand, onderaan staat:
document class [ ], daar kun je je classe intypen (inclusief package) welke je 'Main' classe is.

supremekareem
%Europe/Berlin %616 %2009, 14:48
Sorry mijn kennis van AS3 is zo slecht dat ik niet weet waar ik het moet neerzetten

if (currentFrame == 5) {
addChild(new Vierkantje_mc());
nextFrame(); //zodat ie dit niet oneindig blijft herhalen
}

Dit lijkt wel de goede code, currentFrame is toch waar hij momenteel staat?

Hij begint gewoon bij frame1

of moet ik bij nextframe 103 invullen?

Nogmaals mijn dank is groot

B-Mantis
%Europe/Berlin %647 %2009, 15:32
je moet, net zoals je in deze class een enterFrame functie hebt gemaakt, voor de document class ook een enterFrame functie maken. in die class check je of de huidige frame 103 is. (if (currentFrame == 103)), en als dat zo is, voeg je een vierkantje toe, en zet je de huidige frame op nextFrame();, zodat ie het niet blijft herhalen.

Je kunt ook gewoon op frame 103 van de document een instance van het vierkantje neerzetten, dan verschijnt ie ook op het juiste moment.

supremekareem
%Europe/Berlin %676 %2009, 16:13
Hij moet gewoon mijn .fla bestand afspelen tot frame 103 en dan pas moet de class actief worden.

Kan ik dit niet in dezelfde class aanroepen?

B-Mantis
%Europe/Berlin %786 %2009, 18:52
dus: Je wil dat de vierkantjes pas reageren als de bovenliggende class op frame 103 is?

Je kunt dit op twee manieren doen:
1. Makkelijk, niet zo netjes (niet OOP)

if (parent.currentFrame == 103) { .. }


2. Betere manier:
in je Vierkantje_mc klass een Boolean waarde zetten, die aangeeft of de klasse actief is. Die boolean voeg je dan toe aan de enterFrame fucntie, en de parent van de Vierkantje_mc class zet deze boolean op frame 103 op true.