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.