Objekt Placering

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

Eksemplet her tager udgangspunkt i Coordinatsystem og Objekter[1].

Helt enkelt vil de fleste objekter, der optræder i et spil, have en placering på skærmen.

I nogle spil vil objekterne ikke direkte have denne placering direkte i objektet, men i stedet regner sig frem ud fra data-modellen, som det er illustreret i spilleplade.

En anden mulighed vil være at objekterne direkte har placeringen på skærmen, som fx. bolden i et PONG-spil vil kunne udtrykkes med en xPos og en yPox, mens battene i PONG spillet kun har brug for deres y-position.

I andre spil som fx. Mario, og civilization[2] så er spille-verdenen større end det der vises på skærmen, og objekter vil også kunne befinde sig uden for skærmen. Dette kræver at man har styr på hvilket område skærmen skal vise, og ud fra det regner ud hvilke objekter der skal vises.

Eksempel baseret på framerate

Programmets visning af objektplacering

Det viste eksempel arbejder med en cirkel, som placeres direkte på X- og Y-positionen.

For at bevæge objektet er der en step-værdi både i X- og Y-retningen, som flytter objektet for hver frame.

Der vises værdierne for X- og Y-positionen på skærmen.

int posX = 10;
int posY = 10;
int stepX = 3;
int stepY = 5;

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

void draw() {
  background(0);
  fill(255);
  text("X : " + posX, 320, 30);
  text("Y : " + posY, 320, 60);
  ellipse(posX, posY, 20, 20);
  posX += stepX;
  if (posX < 10 || posX > width - 10) {
    stepX *= -1;
  }
  posY += stepY;
  if (posY < 10 || posY > height - 10) {
    stepY *= -1;
  }
}

Eksempel ud fra en data-model

Programmets visning af objektplacering

I det viste eksempel arbejdes med en datamodel, som er et 2-dimensionelt Array, der indeholder alle de brikker der er faldet ned over skærmen. I setup() stilles alle værdier til 0, der angiver at der ikke er brikker i arrayet.

Der er et objekt som ikke har den grafiske position på skærmen, men som har en position der passer til datamodellen. Det er stadig en xPos og en yPos, men xPos startes med en tilfældig værdi fra 0 til 9, og y-værdien starter på 0. Det er stadig draw() som flytter objektet for hver frame, men her er det blot ved at tælle yPos en op.

I draw() vises hele indholdet af data-modellen ud fra konstanterne i starten af programmet, der angiver bane-størrelsen på data-modellen og den grafiske størrelse af brikkerne. Den aktuelle brik tegnes på samme måde og, der vises værdierne for X- og Y-positionen på skærmen.

Når brikken er rykket, så tjekkes om bunden af banen er nået, hvor brikken markeres med 1 i data-modellen, og der tjekkes derefter om der ligger en brik på næste plads, hvor der også markeres med 1 i datamodellen at der ligger en brik "oven på". I begge tilfælde laves en ny brik i toppen af banen (yPos = 0) og på en tilfældig xPos.

int xWidth = 10;
int yHeight = 20;
int xSize = 15;
int ySize = 15;
int xPos = int(random(xWidth));
int yPos = 0;
int [][] bane = new int [xWidth][yHeight];
void setup() {
  for (int n = 0; n < xWidth; n++) {
    for (int i = 0; i < yHeight; i++) {
      bane[n][i] = 0;
    }
  }
  size(220, 420);
  strokeWeight(2);
  frameRate(10);
  textSize(20);
}

void draw() {
  background(255);
  for (int n = 0; n < xWidth; n++) {
    for (int i = 0; i < yHeight; i++) {
      if (bane[n][i] == 1) {
        fill(180);
        rect(n*(xSize + 5) + 10, i*(ySize + 5) + 10, xSize, ySize);
      }
    }
  }
  fill(180);
  rect(xPos*(xSize + 5) + 10, yPos*(ySize + 5) + 10, xSize, ySize);
  fill(0);
  text("X : " + xPos, 160, 30);
  text("Y : " + yPos, 160, 60);
  yPos++;
  if (yPos == yHeight - 1) {
    bane[xPos][yPos] = 1;
    newObject();
  } else if (bane[xPos][yPos+1] == 1) {  
    bane[xPos][yPos] = 1;
    newObject();
  }
}

void newObject() {
  yPos = 0;
  xPos = int(random(xWidth));
  if (bane[xPos][yPos+1] == 1) {
    exit();
  }
}

Referencer

  1. Coordinatsystem og Objekter på Processing.org
  2. civilization hjemmeside