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.