Har försökt att få en acceleration av ett objekt till tvärstopp, men hur jag än försöker så accelererar från den x position jag vill att den ska stanna på
Något liknade som detta är vad jag söker fast tvärt om.
this._x += (100-this._x)/5
//Martyn
6 svar · 1 030 visningar · startad av martyn
Har försökt att få en acceleration av ett objekt till tvärstopp, men hur jag än försöker så accelererar från den x position jag vill att den ska stanna på
Något liknade som detta är vad jag söker fast tvärt om.
this._x += (100-this._x)/5
//Martyn
Jag vet inte om det här hjälper dig men kolla länken för där finns mästaren på sånt. Finns helt grymma ekvationer för easing åt alla möjliga håll och kanter :)
http://www.robertpenner.com/easing/
Kolla demot för att testa och hitta rätt ekvation.
Om du vill så kanske jag kan slänga ihop ett expempel sen?
Lycka till! :bire
Grymmt, men lite hjälp skulle inte skada. En easingQuad är nog vad jag söker?
Jag ska försöka hinna göra ett exempel sen ikväll så skickar jag upp det då :)
Vilken version av flash använder du föressten? Jag har bara flash mx 2004 så det blir actionscript 2.0
Jag kör 5:an än så länge, det behöver bara va något liknade scriptet i det första inlägget, så man kan lägga det på objekt m.m.
//Martin
this._x += (100/(101-this._x))/5
men det behövs if sats så att this._x aldrig blir 101 för då blir det delat med 0 och det funkar inte så bra.
Men annars ger formel famma steg som ditt exempel men åt andra hållet.
1/5 när this._x=1
100/5 när this._x=100
Bättre sent än aldrig som man brukar säga. :r
Roings exempel funkar nog bäst för dig men jag lägger in koden som jag gjort så kanske du eller nån annan får användning för den en vacker dag.
Actionscript 2.0:
moveObj("mc_ball",25,0,200)
function moveObj(objName, duration, start, end){
var t = 0;
this.onEnterFrame = function(){
t++;
if(t <= duration){
this[objName]._x = _root.easeInOutQuad(t, start, end, duration);
}else{
delete this.onEnterFrame;
}
}
}
// t: current time, b: beginning value, c: change in value, d: duration
// Use:
// var start = 0;
// var end = 260;
// var duration = 10;
// var t = 0;
// t++;
// if (t <= duration) trace(easeInOutQuad(t, start, end, duration));
// or
// this._y = easeInOutQuad(t, start, end, duration)
// quadratic easing in/out - acceleration until halfway, then deceleration
function easeInOutQuad (t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t + b;
return -c/2 * ((--t)*(t-2) - 1) + b;
}
// quadratic easing in - deceleration
function easeInQuad (t, b, c, d) {
return c*(t/=d)*t + b;
}
// quadratic easing out - acceleration
function easeOutQuad (t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
}
Vet om om detta sättet är det mest optimala med det funkar iaf.
Ändra easeInOutQuad i koden till någon av dom andra t.ex easeInQuad beroende på vilken resultat du vill få fram. På http://www.robertpenner.com/easing/ så finns det ju miljaxer olika, så det är bara att välja och vraka. Vill du att den ska rör sig från höger till vänster istället för tvärtom så skriver du bara moveObj("mc_ball",25,0,-200)
Bifogar en fla-fil också gjord i Flash MX 2004 som det bara är att köra.
Hoppas jag inte bryter mot någon slags copyright nu när jag har använt Robert Penners ekvationer. Isåfall så ber jag om ursäkt och meddela mig så ska jag ta bort den här posten.