2013-05-16, 19:34
#1
Hejan! Jag håller på ett skolarbete som är ett 2d golf spel som ser ut så här: http://i.imgur.com/GD1NMJY.jpg (ops bild upponer)
Just nu håller jag på att skapar olika object som är olika platformar. på bilden ser du 3 ruffar, 2 greenar och en green med hålet.
När bollen landar på ruffen så stannar den direkt utan friktion, men när bollen landar på någon green platta så åker bollen rakt igenom om den har normal fart eller högre.
Bollen hinner typ inte registrera kollisionen förän den redan är igenom.
Detta är min spelloop:
den körs om varje 10ms, och den hinner inte registrera. 10ms är ju redan jättesnabbt?
Sätter jag det till 5ms så funkar det på min stationära dator, men min skoldator pallar inte med när thread.sleep bara är 5ms.
Sen kommer ett till problem om jag har 5ms på. När bollen träffar green så ska den studsa och tappa energi, men eftersom programmet nu är så snabbt, så hinner den registrera massor med kollisioner i rad när bollen når green plattan. Den byter inte riktning på hastigheten en gång, utan spammar riktning fram och tillbaka, vilket medför att bollen inte kommer någonstans, utan den stannar ändå och studsar aldrig.
Den registrerar dessa hastighetsändringar i X och Y led under en "studs" som egentligen är ingen studs alls.
Hastigheten ändras fram och tillbaka under en kollision. den ska bara byta håll så en gång så att bollen kan studsa.
Hur ska jag gå till väga? någon som har förslag? jag postar klassen för Green och bollen nedan. Säg till om ni vill ha ytterliggare kod om något
green
bollen
Just nu håller jag på att skapar olika object som är olika platformar. på bilden ser du 3 ruffar, 2 greenar och en green med hålet.
När bollen landar på ruffen så stannar den direkt utan friktion, men när bollen landar på någon green platta så åker bollen rakt igenom om den har normal fart eller högre.
Bollen hinner typ inte registrera kollisionen förän den redan är igenom.
Detta är min spelloop:
Kod:
public void gameLoop() { long timeStart = System.currentTimeMillis(); while (running) { long timePassed = System.currentTimeMillis() - timeStart; update(); //uppdatera bilderna Graphics2D g = sm.getGraphics(); draw(g); g.dispose(); sm.update(); try{ Thread.sleep(10); } catch (Exception ex) {} } }
den körs om varje 10ms, och den hinner inte registrera. 10ms är ju redan jättesnabbt?
Sätter jag det till 5ms så funkar det på min stationära dator, men min skoldator pallar inte med när thread.sleep bara är 5ms.
Sen kommer ett till problem om jag har 5ms på. När bollen träffar green så ska den studsa och tappa energi, men eftersom programmet nu är så snabbt, så hinner den registrera massor med kollisioner i rad när bollen når green plattan. Den byter inte riktning på hastigheten en gång, utan spammar riktning fram och tillbaka, vilket medför att bollen inte kommer någonstans, utan den stannar ändå och studsar aldrig.
Den registrerar dessa hastighetsändringar i X och Y led under en "studs" som egentligen är ingen studs alls.
Citat:
0.0025869373X -0.010530745Y
0.001810856X 0.010530745Y
0.0012675992X 0.007162521Y
8.8731945E-4X -0.007162521Y
6.211236E-4X -0.005223965Y
4.3478652E-4X 0.005223965Y
3.0435057E-4X 0.0034455755Y
2.130454E-4X -0.0034455755Y
0.001810856X 0.010530745Y
0.0012675992X 0.007162521Y
8.8731945E-4X -0.007162521Y
6.211236E-4X -0.005223965Y
4.3478652E-4X 0.005223965Y
3.0435057E-4X 0.0034455755Y
2.130454E-4X -0.0034455755Y
Hastigheten ändras fram och tillbaka under en kollision. den ska bara byta håll så en gång så att bollen kan studsa.
Hur ska jag gå till väga? någon som har förslag? jag postar klassen för Green och bollen nedan. Säg till om ni vill ha ytterliggare kod om något
green
Kod:
package sprites; import java.awt.Graphics2D; import java.awt.Image; import javax.swing.ImageIcon; import other.*; public class Green { private Image green; private int x; private int y; //private float vx; //private float vy; private int width; private int height; private int boundX; private int boundY; private int boundWidth; private int boundHeight; private double xFriction; public Green(int x, int y) { this.x = x; this.y = y; green = new ImageIcon(this.getClass().getResource("/images/green.png")).getImage(); width = 102; height = 38; boundY = y; boundX = x; boundWidth = width; boundHeight = height; xFriction = .6; } public void update(GolfBall GolfBall, HitBall HitBall) { checkCollision(GolfBall, HitBall); } private void checkCollision(GolfBall GolfBall, HitBall HitBall) { // TODO Auto-generated method stub float ballX = GolfBall.getXpos(); float ballY = GolfBall.getYpos(); int diameter = GolfBall.getDiameter(); if (ballY + diameter > boundY && ballY < boundY + boundHeight*0.3) { if (ballX+diameter > boundX && ballX < x + boundWidth) { System.out.println(GolfBall.getSpeedX() + "X " + GolfBall.getSpeedY() + "Y "); if (Math.abs(GolfBall.getSpeedY()) < 0.0005f ) { GolfBall.setBallInAir(false); GolfBall.setYpos(boundY-diameter); GolfBall.setSpeedY(0); GolfBall.setSpeedX(0); } else { float changeDirectionY = (float)(-1 * GolfBall.getSpeedY()); GolfBall.setYpos(y); GolfBall.setSpeedY(changeDirectionY); GolfBall.setSpeedX((float)(GolfBall.getSpeedX()*0.7)); } } } /*/////////////////////DISABLED FOR NOW///////////////////////////////// if (ballY + diameter > boundY + boundHeight*0.5 && ballY < boundY + boundHeight) { if (ballX+diameter > boundX && ballX < boundX + boundWidth) { float changeDirectionY = (float)(-1 * GolfBall.getSpeedY()); GolfBall.setSpeedY(changeDirectionY); } } /* if (ballY + diameter > boundY && ballY < boundY + boundHeight) { if (ballX+diameter > boundX && ballX < boundX + boundWidth/2) { float changeDirectionX = (float)(-1 * GolfBall.getSpeedX() * xFriction); GolfBall.setSpeedX(changeDirectionX); } } if (ballY + diameter > boundY && ballY < boundY + boundHeight) { if (ballX < boundX + boundWidth && ballX > boundX + boundWidth/2) { float changeDirectionX = (float)(-1 * GolfBall.getSpeedX() * xFriction); GolfBall.setSpeedX(changeDirectionX); } }*/ } //get width / height public int getWidth() { return width; } public int getHeight() { return height; } public float getXpos() { return x; } public float getYpos() { return y; } public void setXpos(int x) { this.x = x; } public void setYpos(int y) { this.y = y; } /* public void setSpeedX(float vx) { this.vx = vx; } public void setSpeedY(float vy) { this.vy = vy; } public float getSpeedX() { return vx; } public float getSpeedY() { return vy; } public Image getGolfBall() { return ball; }*/ public void paint(Graphics2D g) { g.drawImage(green,x,y,null); } }
bollen
Kod:
package sprites; import java.awt.*; import java.awt.geom.Ellipse2D; import javax.swing.ImageIcon; public class GolfBall { private Image ball; private float x; private float y; private float vx; private float vy; private int diameter; private boolean ballInAir = false; public GolfBall(float x, float y) { this.x = x; this.y = y; ball = new ImageIcon(this.getClass().getResource("/images/golf_ball_new.png")).getImage(); diameter = ball.getHeight(null); } public void setBallInAir(boolean ballInAir) { this.ballInAir = ballInAir; } public boolean getBallInAir() { return ballInAir; } public void updatePos(long timePassed) { vy = (float) (vy - (0.00001*timePassed/50)); x += vx*timePassed; y -= (vy*timePassed); } //get width / height public int getDiameter() { return diameter; } public float getXpos() { return x; } public float getYpos() { return y; } public void setXpos(float x) { this.x = x; } public void setYpos(float y) { this.y = y; } public void setSpeedX(float vx) { this.vx = vx; } public void setSpeedY(float vy) { this.vy = vy; } public float getSpeedX() { return vx; } public float getSpeedY() { return vy; } public Image getGolfBall() { return ball; } }