Hastighetsökning i spel

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
seat
Inlägg: 35
Blev medlem: 18 mars 2017, 13:55:06

Hastighetsökning i spel

Inlägg av seat »

Hej
Jag har hittat ett gammalt hederligt Pong spel på nätet med kod och som fungerar perfekt.
Men tyvärr så finns det ingen funktion med ökande hastighet på "bollen" när man spelar.
Har försökt att lägga till funktioner som jag trodde skulle hjälpa, men icke.
Har kommit fram till vad som reglerar hastigheten, men då måste jag skriva om ladda upp igen.
Hela koden:

Kod: Markera allt


#include "HT1632.h" // Get this library here: http://github.com/workshopweekend/HT1632
#include "states.h"

#define DATA 2
#define WR   3
#define CS   4

#define WIDTH 24
#define HEIGHT 16
#define PLAYTO 10

const float XMIN = 2;
const float XMAX = (WIDTH - 2);
const float PADDLELEN = 4;
const float PADDLEDIVISOR = (1024.0 / (HEIGHT - PADDLELEN + 1));

HT1632LEDMatrix matrix = HT1632LEDMatrix(DATA, WR, CS);

unsigned long lastUpdate;

void setup() {
  matrix.begin(HT1632_COMMON_16NMOS);
  matrix.clearScreen();
  lastUpdate = millis();
}

/*****************
   START state
 *****************/
unsigned long lastSecondsSinceStart = 1000;

void loopSTART(unsigned long now, float deltat) {
  unsigned long secondsSinceStart = (now - lastStateChange) / 1000;
  if (secondsSinceStart != lastSecondsSinceStart) {
    matrix.setScreen(0);
    matrix.setTextSize(1);
    matrix.setTextColor(1);
    matrix.setCursor(9, 4);

    switch (secondsSinceStart) {
      case 0:
        matrix.print("3");
        break;
      case 1:
        matrix.print("2");
        break;
      case 2:
        matrix.print("1");
        break;
      default:
        setState(GAME);
    }
    lastSecondsSinceStart = secondsSinceStart;
    matrix.writeScreen();
  }
}

/*****************
   GAME state
 *****************/
int points1 = 0;
int points2 = 0;

float x = 5, y = 12;
float vx = 15, vy = 6;
int paddle1 = 0, paddle2 = 0;

void updateBall(float deltat) {
  x += deltat * vx;
  y += deltat * vy;
  if (x < XMIN) {
    if (y >= paddle1 && y <= paddle1 + PADDLELEN) {
      x = 2 * XMIN - x;
      vx = -vx;
    } else {
      points2++;
      setState(SCORE);
    }
  }
  if (x > XMAX) {
    if (y >= paddle2 && y <= paddle2 + PADDLELEN) {
      x = 2 * XMAX - x;
      vx = -vx;
    } else {
      points1++;
      setState(SCORE);
    }
  }
  if (y < 0) {
    y = -y;
    vy = -vy;
  }
  if (y > HEIGHT) {
    y = 2 * HEIGHT - y;
    vy = -vy;
  }

}

void drawBall() {
  matrix.setPixel((int) x, (int) y);
}

void updatePaddles() {
  paddle1 = analogRead(A1) / PADDLEDIVISOR;
  paddle2 = analogRead(A0) / PADDLEDIVISOR;
}

void drawPaddles() {
  for (int i = 0; i < PADDLELEN; ++i) {
    matrix.setPixel(1, paddle1 + i);
    matrix.setPixel(WIDTH - 2, paddle2 + i);
  }
}

void loopGAME(unsigned long now, float deltat) {
  matrix.setScreen(0);

  updateBall(deltat);
  drawBall();

  updatePaddles();
  drawPaddles();

  matrix.writeScreen();
}

/*****************
   SCORE state
 *****************/
boolean scoreVisible = false;

void resetGame() {
  x = 5; y = random(0, HEIGHT - 1);
  vx = 15, vy = 6;
}

void loopSCORE(unsigned long now, float deltat) {
  if (points1 >= PLAYTO - 1 || points2 >= PLAYTO) {
    setState(WIN);
  } else {
    if (! scoreVisible) {
      String score = String("") + points1 + ":" + points2;
      matrix.setScreen(0);
      matrix.setTextSize(1);
      matrix.setTextColor(1);
      matrix.setCursor(WIDTH / 2 - 1 - (score.length() * 5) / 2, 4);
      matrix.print(score);
      matrix.writeScreen();
      scoreVisible = true;
    }
    if (now - lastStateChange > 2000) {
      matrix.clearScreen();
    }
    if (now - lastStateChange > 3000) {
      scoreVisible = false;
      matrix.clearScreen();
      resetGame();
      setState(GAME);
    }
  }
}

/*****************
   WIN state
 *****************/
boolean winVisible = false;

void loopWIN(unsigned long now, float deltat) {
  if (! winVisible) {
    winVisible = true;
    matrix.setScreen(0);
    if (points1 > points2) {
      matrix.fillRect(0, 0, 2, HEIGHT, 1);
    } else {
      matrix.fillRect(WIDTH - 2, 0, 2, HEIGHT, 1);
    }
    matrix.setTextSize(1);
    matrix.setTextColor(1);
    matrix.setCursor(4, 4);
    matrix.print("WIN");
    matrix.writeScreen();
  }
}

// Main loop here:
void loop() {
  unsigned long now = millis();
  float deltat = (now - lastUpdate) / 700.0;
  lastUpdate = now;

  if (state == START) {
    loopSTART(now, deltat);
  } else if (state == GAME) {
    loopGAME(now, deltat);
  } else if (state == SCORE) {
    loopSCORE(now, deltat);
  } else if (state == WIN) {
    loopWIN(now, deltat);
  }
}
Det jag har försökt med är att ändra och lägga till text som synes i bild 1- 2
Bild 1.jpg
Bild 2.jpg
Det enda som händer är att när man startar spelet så står "bollen" still, fastnar liksom.


// Main loop here:
void loop() {
unsigned long now = millis();
float deltat = (now - lastUpdate) / 700.0; ( Om man ändrar denna summa manuellt nedåt så ökar hastigheten)
lastUpdate = now;


Har gett upp nu och ställer frågan till er här på forumet och hoppas att det
finns någon som är villig att hjälpa mig och jag måste säga att jag är nybörjare med Arduino
Är tacksam för all hjälp.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
kodar-holger
EF Sponsor
Inlägg: 763
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Hastighetsökning i spel

Inlägg av kodar-holger »

Prova att deklarera setspeed som float istället.

Sen är det lite fler saker som behöver förbättras men som inte borde gör att det står still.

Tänk på att koden i loop körs om och om igen. I okontrollerad hastighet. Det har inget med bollens hoppande att göra.

Så tilldelningar du gör kommer göras oftare än bollen uppdateras på led-matrisen.

Vad får det för konsekvenser för
setspeed=1000;
speedcounter=0;
speedcounter++;
om du tänker efter?
seat
Inlägg: 35
Blev medlem: 18 mars 2017, 13:55:06

Re: Hastighetsökning i spel

Inlägg av seat »

Hej
Tack för snabbt svar, men som jag skrev så är jag nybörjare.
Så jag hänger inte riktigt med på vad du menar
Om du kunde förklara el visa så vore jag tacksam.
kodar-holger
EF Sponsor
Inlägg: 763
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Hastighetsökning i spel

Inlägg av kodar-holger »

Ja nybörjare har vi alla varit en gång. Hur mycket nybörjare är du? Förstår du skillnaden på heltalsvariabler och flyttalsvariabler?

Gå tillbaka till orginalversionen och gör en sak i taget. Att försöka förstå vad som händer innan man ändrar är en bra ambition. Det kan vara jobbigt att förstå allt och det är uppriktigt sagt inte heller alltid nödvändigt, men man måste ha ett hum.

Så här står det i koden:

Kod: Markera allt

void loop() {
  unsigned long now = millis();
  float deltat = (now - lastUpdate) / 700.0;
Notera att det är .0 efter 700. Det finns en god anledning till det. variablerna now och lastUpdate är heltalsvariabler. Subtraktionen kommer beräknas först (pga parenteserna) och resulterar i ett nytt heltal. Det kommer sen att divideras med 700.0. För att kunna göra det omvandlas differensen automatiskt till ett flyttal eftersom 700.0 är ett flyttal. Om det stått 700 utan .0 hade man gjort en heltalsdivision istället, och sen omvandlat till ett flyttal för att få in det i variabeln deltat. Så för alla värden på (now-lastUpdate) mindre än 700 blir resultatet i så fall exakt 0. Titta på vart deltat sen används och vad som händer om den är 0.

Är du med så långt?

Prova sen med att lägga in din

Kod: Markera allt

 float speed=1000.0;
där du hade den tidigare och

Kod: Markera allt

  float deltat = (now - lastUpdate) / 700.0;
som du redan provat och se vad som händer.

Sen får du fundera på NÄR skall hastigheten ändras under spelets gång. En väldigt stor del av programutveckling är att fundera på vad programmet skall göra. Programmerar du åt någon annan kan den delen lätt bli >80% av arbetet.
Användarvisningsbild
Lasp
Inlägg: 10316
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Hastighetsökning i spel

Inlägg av Lasp »

Snyggt och mycket pedagogiskt förklarat.
TS får gärna inkludera länk till källa.
seat
Inlägg: 35
Blev medlem: 18 mars 2017, 13:55:06

Re: Hastighetsökning i spel

Inlägg av seat »

Hej
Tack för er medverkan.
Har provat det du skrev och just nu så visas score och räknar upp 1:0, 2:0 ect ect upp till 8, därefter visas "win"
som det ska göra. Det som jag förstod av din beskrivning så är det att "bollen" rör sig otroligt fort, eller ?
Som nybörjare jag är så håller jag på med att plöja igenom div material (bok + nätet), men eftersom
jag är nybliven pensionär så är inlärningskurvan lång, gör detta för att hålla hjärnan i gång och tycker att det är roligt.
Så mitt svar på din fråga är att jag har inte kommit så långt, det får ta sig sin tid.
Men ni ska veta att jag är otroligt tacksam för hjälp, tips och trix.
seat
Inlägg: 35
Blev medlem: 18 mars 2017, 13:55:06

Re: Hastighetsökning i spel

Inlägg av seat »

Hej
Glömde att lägga till länken som "Lasp" efterfrågade.
http://workshopweekend.net/arduino/projects/pong
Skriv svar