Spil Opdatering

Fra Holstebro HTX Wiki
Skift til: navigering, søgning

Eksemplerne her diskuterer millis()[1] og frameRate()[2], med både fordele og ulemper.

Løsning med frameRate

I nogle spil med en langsom flytning af objekter, set i forhold til frameRaten, der er det uhensigtsmæssigt at sætte frameRaten så langt ned som som flytnings-takten kræver, da det vil give langsommere reaktion på keyboard og museklik.

Det kan her være en fordel at holde fast i en frameRate på 60, og så tælle sig frem med timeCount til hvornår objektet skal flyttes. Her er det variablen timeStep der bestemmer hvor mange frames der skal gå før før objektet flyttes. Her bliver det 3 gange i sekundet ud fra frameRate på 60 delt med timeStep på 20.

Hvis man ønsker at objektet skal flyttes hurtigere, så kan variablen timeStep sættes ned.

int posY = 0;
int stepY = 20;
int timeCount = 0;
int timeStep = 20;

void setup() {
  size(200, 400);
  frameRate(60);
}

void draw() {
  background(255);
  fill(180);
  rect(90, posY, 20, 20);
  if (timeCount == timeStep) {
    timeCount = 0;
    posY += stepY;
    if (posY > height - 20) {
      posY = 0;
    }
  }
  timeCount++;
}

Løsning med millis()

Hvis man ønsker at opdateringen skal være uafhængig af om skærmen får opdateret, så kan man anvende millis() til ar styre timingen.

Funktionen millis() returnerer antal millisekunder siden programmets start, og der bruges en variabel lastTime til at angive tiden for den sidste opdatering i millisekunder. Når millis() - lastTime bliver større end interval (333 ms for 3 opdateringer i sekundet), så flyttes brikken, og der lægges interval til lastTime, så der går 333 millisekunder til næste opdatering.

Igen kan man så rette på opdateringshastigheden ved at ændre interval.

int posY = 0;
int stepY = 20;
int interval = 333;
int lastTime = 0;

void setup() {
  size(200, 400);
  frameRate(60);
}

void draw() {
  background(255);
  fill(180);
  rect(90, posY, 20, 20);
  if ((millis() - lastTime) > interval) {
    lastTime += interval;
    posY += stepY;
    if (posY > height - 20) {
      posY = 0;
    }
  }
}

Referencer

  1. millis() på Processing.org
  2. frameRate() på Processing.org