60 likes | 162 Views
Bouncing Balls. Brug af vektorer til modellering af hastighed og retning. Klasser - overblik. BallWorld Initialiserer verdenen til en passende størrelse Ball En bold der flyver rundt i verdenen og ’bouncer’ mod kanterne (opg. 3) andre bolde (opg. 4 – extra credit) Vector
E N D
Bouncing Balls Brug af vektorer til modellering af hastighed og retning
Klasser - overblik • BallWorld • Initialiserer verdenen til en passende størrelse • Ball • En bold der flyver rundt i verdenen og ’bouncer’ mod • kanterne (opg. 3) • andre bolde (opg. 4 – extra credit) • Vector • Repræsenterer boldens retning og hastighed • Hver gang act kaldes af Greenfoot: • x bestemmer hvor langt bolden skal flytte sig vandret (på x-aksen) • y bestemmer hvor langt bolden skal flytte sig lodret (på y-aksen)
Animering – hvordan flytter bolden sig? • Greenfoot kalder Ball’s act() metode • act() kalder move() metoden • move() får fat i boldens koordinater ved at kalde getX() og getY() (fra Actor) • move() får fat i vel’s koordinater vha. vel.getX() og vel.getY() (fra Vector) • move() opdaterer boldens position ved at kalde setLocation (fra Actor) :Ball vel:Vector act() getX() getY() setLocation(…) move() getX() getY()
Bouncing på kanterne • Efter kaldet til move skal kant-kollision håndteres • Dette indkapsles i en metode handleWallCollision • To tilfælde • Hvis bolden rører ved top eller bundkanten skal vel sættes til vel.horizontalFlip() • Hvis bolden rører ved en sidekant skal vel sættes til vel.verticalFlip()
Kantcheck • Hvordan checker man om bolden rører en kant? • Indkapsles i • hitTopWall() • hitBottomWall() • hitLeftWall() • hitRightWall() • Undgå at ’hardcode’ bredden og højden på verdenen • Brug i stedet World metoderne getWidth() og getHeight() • Husk at tage højde for boldens størrelse • Brug GreenfootImage-metoderne getWidth() og getHeight()
Kantcheck eksempel - hitRightWall() (0,0) (getWorld().getWidth()-1, 0) (0, getWorld().getHeight() - 1) (getWorld().getWidth() - 1, getWorld().getHeight() - 1) getX() + getImage().getWidth()/2 > getWorld().getWidth()-1