0170 Super Mario

Hittills har alla objekt i världen varit begränsade till x och y som är heltal. Nu ska vi se hur man kan göra för att ange positionen mer noggrant med decimaltal. Objektens x- och y-position kommer att sparas som decimaltal, men ritas på skärmen på x- och y-koordinater avrundade till heltal. Vi kommer att använda hjälpklassen SmoothMover, som redan finns skriven.

Därtill kommer vi att se hur man kan göra för att få en karaktär att hoppa och landa på mark eller slå huvudet i tak.

Nedan följer detaljerade instruktioner.

Börja med att lägga till alla klasser inklusive bilder som i figuren. För SmoothMover följer instruktion nedan.

Klassen SmoothMover

För att lägga till klassen SmoothMover klickar du:

  • Edit
  • Import Classes
  • Välj SmoothMover

Klassen Brick

Saknar innehåll.

Klassen MyWorld

Skriv kod för att lägga till tegelstenarna och sjöhästen (Super Mario). Använd while-slingor för tegelstenarna.

Nedersta raden med tegelstenar har y = 392

Översta raden har y = 270. Det är 1/3 tegelstenar följt av 1/3 öppet och sist 1/3 tegelstenar.

Klassen GravityMover

Sjöhästen (Super Mario) styrs av fysikens lagar. Sjöhästen flyttas vänster och höger med motsvarande piltangent. Pil upp ger ett hopp om sjöhästen är på marken. När sjöhästen är i luften behåller den sin hastighet i x-led.

Objektvariabler

gravity är 1.0
xSpeed är 0.0
ySpeed är 0.0 // positiv nedåt

Metoden act

om är i fritt fall 
  move by gravity
annars
  checkMove()

Metoden onGround

om på väg up
  return false;
Brick oneBrick = (Brick)getOneIntersectingObject(Brick.class);
om oneBrick ej är null
  om oneBrick:s y är större än sjöhästens y
    return true;
return false;

Metoden isFalling

return icke onGround()

Metoden checkMove

om på marken
  om vänster pil
    xSpeed = -5;
    flytta xSpeed pixlar med setLocation och getExactX o Y
  annars om höger pil
    xSpeed = 5;
     flytta xSpeed pixlar med setLocation och getExactX o Y
  annars
    xSpeed = 0.0;

  om pil up
    ySpeed = -18;

Metoden moveByGravity

öka ySpeed med gravity
flytta xSpeed och ySpeed pixlar 

// flyttade för långt, d.v.s. in i en tegelsten
// flytta tillbaka
Brick oneBrick = (Brick)getOneIntersectingObject(Brick.class);
om brick inte är null
  om sjöhästens y är mindre än oneBrick:s y
    // från ovan - landar på golv
    lokal variabel deltaY
    deltaY = y + bildhöjd / 2 - oneBrick:s y + oneBrick:s bildhöjd / 2
    deltaY = deltaY - 1; // överlappa en pixel
    minska y med deltaY använd setLocation o getExactX o Y
  annars
    // underifrån - slår i taket
    lokal variabel deltaY
    deltaY = oneBrick:s y + oneBrick:s bildhöjd / 2
    deltaY = deltaY - y + bildhöjd / 2
    öka? y med deltaY använd setLocation o getExactX o Y
    ySpeed = 0

Gör ett spel

Använd fantasin och gör ett spel, till exempel Super Mario.