Volledige versie bekijken : Zoek de muispositie!
Boekie
%Europe/Berlin %962 %2007, 00:05
Hoi,
ik ben op zoek naar een manier om op een niet al te ingewikkelde manier een movieclip vanaf een vaste plek in de richting van de muispositie te laten bewegen. De clip vertrekt van een vaste positie en moet precies op de plek terecht komen waar de muis zich bevind, zolang dat (uiteraard) maar binnen de stage is.
Kan iemand me hiermee helpen? Alvast mijn bijzonder hartelijke dank :-)
groet,
Peter
sander1
%Europe/Berlin %113 %2007, 03:43
Ik zou het zelf ongeveer zo oplossen met behulp van de tween class (http://livedocs.adobe.com/flash/8/main/00001502.html):
import mx.transitions.Tween;
var oMouseListener:Object = new Object();
oMouseListener.onMouseUp = function():Void
{
var twMoveClipX:Tween = new Tween(mcTest, "_x", Standard, mcTest._x, _xmouse, 1.5, true);
var twMoveClipY:Tween = new Tween(mcTest, "_y", Standard, mcTest._y, _ymouse, 1.5, true);
};
Mouse.addListener(oMouseListener);Hier wordt een tween gecreëerd op de x/y coördinaten van de movieclip mcTest. De beginwaarden zijn het huidige x- en y-coördinaat van de movieclip mcTest. Met _xmouse (http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary584.html) en _ymouse haal je de huidige coördinaten van de muiscursor op. Deze waarden worden gebruikt als eindwaarde voor de tween. In dit voorbeeldje wordt de beweging in gang gezet wanneer de muisknop wordt ingedrukt en weer wordt losgelaten.
werkend voorbeeldje (http://img222.imageshack.us/img222/5637/muissq5.swf)
Jan
%Europe/Berlin %117 %2007, 03:49
Hoi,
ik ben op zoek naar een manier om op een niet al te ingewikkelde manier een movieclip vanaf een vaste plek in de richting van de muispositie te laten bewegen. Voorbeeldje gemaakt...
Beware, noob solution coming up: :D
http://users.telenet.be/jansurf/bolnaarmuis/bolnaarmuis.swf
http://users.telenet.be/jansurf/bolnaarmuis/bolnaarmuis.fla
In een loopend mc-tje(kan het nog minder ingewikkeld :) )
muisx.text=xm;
muisy.text=ym;
bolx.text=xb;
boly.text=yb;
//x en y positie bol
xb=Math.floor(_root.bol._x);
yb=Math.floor(_root.bol._y);
//x en y positie muis
xm=Math.floor(_root._xmouse);
ym=Math.floor(_root._ymouse);
if(xb<xm){
_root.bol._x=_root.bol._x+1;}
if (xb>xm){
_root.bol._x=_root.bol._x-1;}
if(yb<ym){
_root.bol._y=_root.bol._y+1;}
if (yb>ym){
_root.bol._y=_root.bol._y-1;}
Groeten,
Jan
Edit: hehe posts gekruist... :D Wel goed/gek dat we de vraag verschillend geïnterpreteerd hebben.
Jan
%Europe/Berlin %546 %2007, 14:07
Ik heb gemerkt met mijn bovenstaande code:
1)Dat de bol van de stage afliep, dus heb ik wat grenzen toegevoegd.
2)Als de afstand die in x moet afgelegd worden kleiner is dan de afstand in y dat hij dan
veel sneler gedaan heeft met de x-verplaatsing en dus het laatste stuk (de y-verplaatsing) als een rechte lijn aflegt. (idem voor het omgekeerde geval)
Dus heb ik de code wat aangepast zodat de snelheden (x-verplaatsing en y-verplaatsing) in verhouding staan tot de afstand die ze moeten afleggen zodat (bij een verschil tussen x en y verplaatsing je die rechte lijn niet meer hebt.
Ik heb ook een mogelijkheid toegevoegd waarmee je de snelheid kan aanpassen maar als je een snelheid groter dan 1 kiest dan komt ie soms in een endless loop terecht. (als je een beetje met de muis speelt krijg je hem wel tot stilstand)
Ik heb al vanalles geprobeerd maar ik krijg er dit niet uit. Zou dit komen doordat ik een loop maak in een mc?'t Lag daar dus niet aan. Lees de edit onderaan.
Online voorbeeld:(Nieuwe voorbeelden onderaan)
http://users.telenet.be/jansurf/bolnaarmuis/bolnaarmuis2.html
http://users.telenet.be/jansurf/bolnaarmuis/bolnaarmuis2.swf
http://users.telenet.be/jansurf/bolnaarmuis/bolnaarmuis2.fla
framerate op 120:
http://users.telenet.be/jansurf/bolnaarmuis/bolnaarmuis3.swf
//dynamische tekstvelden (staan in een mc)
muisx.text=xm;
muisy.text=ym;
bolx.text=xb;
boly.text=yb;
verplaatsingx.text=verplaatsx;
verplaatsingy.text=verplaatsy;
//inputtekstveld voor de snelheid (staat op de stage)
snelheid.text=_root.inputspeed.text;
//variabelen
//bewegingssnelheid
speed=_root.inputspeed.text;
//x en y-positie muis
xm=_root._xmouse;
ym=_root._ymouse;
//x en y-positie bol
xb=Math.floor(_root.bol._x);
yb=Math.floor(_root.bol._y);
//verschil tussen x en y-positie muis en x en y-positie bol
verschilx=Math.abs(xm-xb);
verschily=Math.abs(ym-yb);
//Alleen bewegen als de muispointer binnen deze grenzen staat
if(xm>0 && xm<200 && ym>0 && ym<165){
//relatieve snelheid voor x en y verplaatsing als hij meer x moet afleggen dan y
if (verschilx > verschily){
verplaatsx=(verschilx/verschilx)*speed;
verplaatsy=(verschily/verschilx)*speed;
}
//relatieve snelheid voor x en y verplaatsing als hij meer y moet afleggen dan x
if(verschilx < verschily){
verplaatsx=(verschilx/verschily)*speed;
verplaatsy=(verschily/verschily)*speed;
}
//staat de bol links van de muis->verplaats hem naar rechts(=x toenemen)
if(xb<xm){
_root.bol._x=_root.bol._x+verplaatsx;
}
//staat de bol rechts van de muis->verplaats hem naar links(=x afnemen)
if (xb>xm){
_root.bol._x=_root.bol._x-verplaatsx;
}
//staat de bol hoger de muis->verplaats hem naar onder (=y toenemen)
if(yb<ym){
_root.bol._y=_root.bol._y+verplaatsy;
}
//staat de bol lager dan de muis->verplaats hem naar boven (=y afnemen)
if (yb>ym){
_root.bol._y=_root.bol._y-verplaatsy;
}
//Is er geen verschil (meer) tussen x-positie muis en x-positie bol->zet variabele "verplaatsx" op "0"
if (verschilx==0){
verplaatsx=0;
}
// Is er geen verschil (meer) tussen y-positie muis en y-positie bol-> zet variabele "verplaatsy" op "0"
if (verschily==0){
verplaatsy=0;
}
}
EDIT: fout gevonden. Die snelheid was niet echt een snelheid maar de grootte van elke stap en dat is een afstand en dus geen snelheid. Als je dan als snelheid 5 kiest, kies je eigenlijk stappen van 5(px). Stel dat de x positie van de bol=3 en de x-positie van de muis is 210 dan geraakt hij in stappen van 5 tot aan 208 (3+205(41 stappen van 5)) maar de daarop volgende stap brengt de bol op 213. En dan wil hij terug want hij is te ver maar met een stap van 5 komt hij terug op 208, en dat is te veel terug dus opnieuw een stap verder etc etc. Als het verschil dus geen veelvoud van de stap is dan kom je nooit uit. Ik heb de code aangepast zodat ie de stapgrootte constant zelf aanpast aan de afstand die hij nog moet afleggen en je dus altijd uitkomt. Door constant de snelheid/stappen aan te passen aan het verschil brengt dit wel met zich mee dat er een 'easing out' in terecht is gekomen.
Een ander bijgekomen probleem is dat in sommige gevallen de bol nog een stap moet zetten van minder dan 0,05px en dat kan blijkbaar niet in flash. Dus alle stappen kleiner dan 0,05 heb ik standaard op 0,05 moeten zetten.
Het werkt nu ongeveer zoals het 'hoort':
http://users.telenet.be/jansurf/bolnaarmuis/bolnaarmuis4.html
Was een leuk experimentje maar die tweenclass is misschien toch eerder aan te raden... :)
Laatste code:
muisx.text=xm;
muisy.text=ym;
bolx.text=xb;
boly.text=yb;
verplaatsingx.text=verplaatsx;
verplaatsingy.text=verplaatsy;
snelheid.text=_root.inputspeed.text;
speed=_root.inputspeed.text;
speedd=48/speed;
xm=_root._xmouse;
ym=_root._ymouse;
xb=Math.ceil(_root.bol._x);
yb=Math.ceil(_root.bol._y);
verschilx=Math.abs(xm-xb);
verschily=Math.abs(ym-yb);
if(xm>0 && xm<200 && ym>0 && ym<165){
if (verschilx > verschily){
verplaatsx=(Math.ceil(10*(verschilx/speedd)))/10;
verplaatsy=(Math.ceil(10*(verschily/verschilx)*(verschilx/speedd)))/10;
}
if(verschilx < verschily){
verplaatsy=(Math.ceil(10*(verschily/speedd)))/10;
verplaatsx=(Math.ceil(10*(verschilx/verschily)*(verschily/speedd)))/10;
}
if(xb<xm){
_root.bol._x=_root.bol._x+verplaatsx;
}
if (xb>xm){
_root.bol._x=_root.bol._x-verplaatsx;
}
if(yb<ym){
_root.bol._y=_root.bol._y+verplaatsy;
}
if (yb>ym){
_root.bol._y=_root.bol._y-verplaatsy;
}
}
Groeten,
Jan
Boekie
%Europe/Berlin %881 %2007, 22:09
Hoi,
Ik zat inderdaad met de snelheid van de tween die bij korte afstand veel langzamer is dan bij lange afstand.
Heb het opgelost door eerst de exacte afstand te berekenen, en dan de tijd delen door een constante. Nu loopt het mooi. bedankt!!
(code hieronder, weet niet hoe in actionscript block te zetten)
function shootObject() {
// Bepaal X en Y afstand van object tot muis
var xLen:Number=_xmouse-mcTest._x;
var yLen:Number=_ymouse-mcTest._y;
//Bepaal de snelheid op basis van de exacte afstand in pixels
var speed:Number=Math.abs((yLen / Math.sin( Math.atan( yLen / xLen ) ))/300);
// voer de tween uit met behulp van de speed.
var twMoveClipX:Tween = new Tween(mcTest, "_x", Standard, mcTest._x, _xmouse, speed, true);
var twMoveClipY:Tween = new Tween(mcTest, "_y", Standard, mcTest._y, _ymouse, speed, true);
}
Bedankt voor de tips!!!
BernardV
%Europe/Berlin %925 %2007, 23:12
Fijn dat het zo werkt, alleen:
var speed:Number=Math.abs((yLen / Math.sin( Math.atan( yLen / xLen ) ))/300);
is wel een moeilijke manier voor een wortel ;)
var speed:Number = Math.sqrt(xLen*xLen + yLen*yLen) / 300;
De stelling van pythagoras.. a² + b² = c²
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.