Gå til innhold

0.1 pixel ikke mulig? (smooth animasjon)


Anbefalte innlegg

Videoannonse
Annonse

Hvis du vil at objektene dine skal bevege seg med f eks 20 piksler per sekund bortover, og ikke 20 per loop, så kan du finne ut hvor mange piksler objektet skal bevege seg per loop, ved å dele på antall ganger loopen kjører på et sekund. Dette kan du finne en god tilnærming av ved å ha to variable. En som inneholder siste loop's tid, og en som inneholder denne loopens tid, så deler du et sekund på denne tiden og du vil få antall loops per sekund. Hvis tegne-loopen og kalkulasjonloopen er den samme, vil dette også være frameraten på animasjonen din. :thumbup:

 

I JS kan dette gjøres med Date-"objektet" slik.

 

var sisteTid = new Date();
var denneTid, n, kalkPerSek;
<loop> // eller den koden som repeterer seg
{
  denneTid = new Date();
  n = denneTid.getTime() - sisteTid.getTime();
  sisteTid = denneTid;
  if (n == 0)
  n = 1;
  kalkPerSek = 1000 / n;
  obj.pos.x += obj.vel.x / kalkPerSek;
  obj.pos.y += obj.vel.y / kalkPerSek;
  objHandle.style.left = parseInt(obj.pos.x) + "px";
  objHandle.style.top = parseInt(obj.pos.y) + "px";
}

 

Evt hvis du har en tidsakselerator (time compression 1x, 2x, 0.5x, 4x f eks), så kan du øke hastigheten på animimasjonen ved å dele kalkPerSek på denne.

 

tidKomp = 0.5;
var sisteTid = new Date();
var denneTid, n, kalkPerSek, kalkPerAniSek;
<loop> // eller den koden som repeterer seg
{
  denneTid = new Date();
  n = denneTid.getTime() - sisteTid.getTime();
  sisteTid = denneTid;
  if (n == 0)
  n = 1;
  kalkPerSek = 1000 / n;
  kalkPerAniSek = kalkPerAniSek / tidKomp;
  obj.pos.x += obj.vel.x / kalkPerAniSek;
  obj.pos.y += obj.vel.y / kalkPerAniSek;
  objHandle.style.left = parseInt(obj.pos.x) + "px";
  objHandle.style.top = parseInt(obj.pos.y) + "px";
}

 

Gudd løkk.

Endret av LostOblivion
Lenke til kommentar

Nå føler jeg meg ganske dum her, men det ble plutselig ganske avansert:P

 

var sisteTid = new Date();
var denneTid, n, kalkPerSek;
<loop> // eller den koden som repeterer seg
{
  denneTid = new Date();
  n = denneTid.getTime() - sisteTid.getTime();
  sisteTid = denneTid;
  if (n == 0)
     n = 1;
  kalkPerSek = 1000 / n;
  obj.pos.x += obj.vel.x / kalkPerSek;
  obj.pos.y += obj.vel.y / kalkPerSek;
  objHandle.style.left = parseInt(obj.pos.x) + "px";
  objHandle.style.top = parseInt(obj.pos.y) + "px";
}

 

Hvis jeg da setter en for loop der nå. Hvordan går jeg fram?

Jeg ser ikke sammenhengen mellom objHandle.style.left = parseInt(obj.pos.x) + "px"; og det jeg skal flytte på.

Er vel egentlig obj, som gjør at jeg ikke skjønner.

 

Takk for all hjelp så langt!

Lenke til kommentar

Du har et instans av et objekt. Kall det obj, ball, dings, whatever. "Objekter" i JS kan lages på denne måten.

 

function Ball(pos, vel, radius)
{
  this.pos = pos;
  this.vel = vel;
  this.radius = radius;
}

function Vector(x, y)
{
  this.x = x;
  this.y = y;
}

...så kan du bruke "objektene" dine med...

obj = new Ball(new Vector(50, 50), new Vector(3, 0.5), 5); // posisjon 50, 50, fart 3, 0.5

 

Men JS er ikke veldig flink med objekter, så du trenger ikke bruke det, du kan bare bruke variabler på "vanlig" måte. F eks.

 

ballPosX = 50;
ballPosY = 50;
ballVelX = 3;
ballVelY = 0.5;
ballRadius = 5;

Lenke til kommentar

Jeg innså akkurat at det du spurte om i starten ikke har noe som helst med "animering" sånn som jeg tenkte på det. Du er ute etter innhold på siden som flyter rundt, ikke animeringer av baller som kolliderer etc? I så fall, kan du glemme alt jeg har sagt om kalkulasjoner per sekund og alt det derre. Haha, for en tosk jeg er, haha. :D

 

Du burde kanskje se litt på nodes, ellers virker det som du har nok info til å gjøre som han fyren du lenket til i første post gjør.

Lenke til kommentar

<script type="text/javascript">
ramme = new Object();
ramme.x = 50;
ramme.y = 20;
ramme.handle;

knapp;

running = 0;

knapp.onClick = function()
{
if (running != 0)
	run();
else
	clearTimeout(running);
}

window.onLoad = function()
{
ramme.handle = document.getElementById("minDiv");
knapp = document.getElementById("startKnapp");
}

function setLoc(node, x, y)
{
node.style.left = parseInt(x) + "px";
node.style.top = parseInt(y) + "px";
}

function run()
{
ramme.x++;
ramme.y++;
setLoc(document.getElementById("minDiv"), ramme.x, ramme.y);
running = setTimeout("run()", 1);
}
</script>

 

Poenget er å kalle run så ofte som mulig. Argh, skulle aldri begynt med JavaScript...

Endret av LostOblivion
Lenke til kommentar

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title>Untitled Document</title>

<link href="css/mincss.css" rel="stylesheet" type="text/css" />

<script type="text/javascript">

ramme = new Object();

ramme.x = 200;

ramme.y = 200;

ramme.handle;

knapp;

running = 0;

knapp.onClick = function(){

if (running != 0)

run();

else

clearTimeout(running);

}

window.onLoad = function(){

ramme.handle = document.getElementById("obj");

knapp = document.getElementById("button1");

}

function setLoc(node, x, y){

node.style.left = parseInt(x) + "px";

node.style.top = parseInt(y) + "px";

}

function run(){

ramme.x++;

ramme.y++;

setLoc(document.getElementById("obj"), ramme.x, ramme.y);

running = setTimeout("run()", 1);

}

</script>

</head>

 

<body>

<div id="obj"></div>

<input id="button1" value="Trykk her" name="Knapp" type="button" />

</body>

</html>

 

 

Hva gjør jeg galt?:p Ingen ting skjer.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...