2013-05-16, 19:34
  #1
Medlem
BarbecueBobs avatar
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:

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

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;
	}
}
Citera
2013-05-17, 00:07
  #2
Medlem
Colossuss avatar
Nu är det väl så att bollen förmodligen rör sig så snabbt att den hoppar igenom de saker den egentligen ska kollidera med, som du även noterar.

Du skulle kunna, innan du flyttar bollen varje uppdatering, bestämma hur långt bollen kommer flytta sig nästa uppdatering, och sedan testa längs den sträckan exakt var som bollen eventuellt kommer att kollidera med något. Om du då under en sån koll hittar en punkt där den kommer att kollidera, så flyttar du bollen den sträckan istället för den där den skulle hoppat över hindret.
Det kräver visserligen lite mer att göra så, men det är ett sätt
Citera
2013-05-17, 16:42
  #3
Medlem
BarbecueBobs avatar
Citat:
Ursprungligen postat av Colossus
Nu är det väl så att bollen förmodligen rör sig så snabbt att den hoppar igenom de saker den egentligen ska kollidera med, som du även noterar.

Du skulle kunna, innan du flyttar bollen varje uppdatering, bestämma hur långt bollen kommer flytta sig nästa uppdatering, och sedan testa längs den sträckan exakt var som bollen eventuellt kommer att kollidera med något. Om du då under en sån koll hittar en punkt där den kommer att kollidera, så flyttar du bollen den sträckan istället för den där den skulle hoppat över hindret.
Det kräver visserligen lite mer att göra så, men det är ett sätt

Intressant. ska prova med nåt liknande. rapporterar resultatet senare. tack.
Citera
2013-05-18, 19:40
  #4
Medlem
BarbecueBobs avatar
Citat:
Ursprungligen postat av BarbecueBob
Intressant. ska prova med nåt liknande. rapporterar resultatet senare. tack.

Löste problemet. det var ett minustecken som var fel i en liten grej i klassen för bollen. Hatar när detta händer
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in