Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 812
Jobber for tiden med en Asteroids-klone, men har problemer med å få til gravitasjon og bevegelse.

Romskipet roterer uavhengig av hvilken retning skipet beveger seg i, mens når jeg gir gass akselererer det i den retningen det peker. Det jeg prøver å få til er at dersom man f.eks snur 180 grader, for så å akselrere, skal det ta litt tid før skipet stopper, så skal det begynne å akselrere i den retningen det peker.

Kode

private int length = 0;
private int angle = 0;
private int vel_angle = 0;
private int x,y;
private int vel_x,vel_y;


    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            angle -=10;
        }

        if (key == KeyEvent.VK_RIGHT) {
            angle +=10;
        }

        if (key == KeyEvent.VK_UP) {
            length += 1;
            vel_angle = angle;
        }

        if (key == KeyEvent.VK_DOWN) {
        	length -=1;
        }
        if (key == KeyEvent.VK_SPACE) {
            fire();
        }

    }

public void move() {
    	
    	vel_x = (int) (length*Math.cos(Math.toRadians(vel_angle)));
    	vel_y = (int) (length*Math.sin(Math.toRadians(vel_angle)));
        
        x += vel_x;
    	y += vel_y;

}
Metode for å tegne skipet:

Kode

public void draw(Graphics2D g2){
    	super.draw(g2);
    	g2.setColor(getSpriteColor());
    	g2.fill(getSpriteBody());
    	if(throttleOn){
    		g2.setColor(Color.yellow);
    		g2.fill(getSpriteBurst());
    	}
    }

superklassen:
	public void draw(Graphics2D g2){
		AffineTransform transformer = new AffineTransform();
		transformer.rotate(Math.toRadians(angle), x, y);
		transformer.translate(x, y);
		transformer.scale(scale, scale);
		transformer.translate(-x, -y);
		
		spriteArea = new Area(getSpriteBody()); // for handling collisions
		spriteArea.transform(transformer); //transform like shape
		
		g2.setTransform(transformer);
		
	}
Makshastighet er length=4, altså 4 piksler per steg.

Håper noen kan hjelpe med dette
det jeg ville gjort var å først lage en standard 2D-vektor som man kan bruke til beregning av fart.
Man kan da sette farten til skipet lik en farts-vektor. (Du har i grunnen det allerede, bare delt det opp i 2 integere med en for fart i X retning, og en med fart i Y-retning).

Når skipet akselererer tilfører du en konstant kraft i en bestemt retning på skipet.

ship.velocity_vector = ship.velocity_vector + acceleration_vector

Acceleration_vector vil her være en vektor som peker i samme retning som skipet (retningen du akkselererer i), og lengden vil være avhengi av hvor mye kraft du vil at motoren skal gi.

Om du virkelig vil gjøre det ordentlig burde du gange acceleration_vector med en konstant som avhenger av tiden. Og på den måten sørge for at spillet oppfører seg likt på flere ulike maskiner med ulike speccs.

Her er et lite utdrag fra mi nastroids-klone som jeg laget i python. Som har akkurat med det du spurte om å gjøre. Håper det er til hjelp

Kode

    # Accelrate the ship
    def accelrate(self):
        time = 1/fps
        acc_vector = Vector2D(math.cos(self.rotate*math.pi/180), -math.sin(self.rotate*math.pi/180))
        self.vel += acc_vector*self.accelration*time
        if self.vel.magnitude() > self.maxspeed:
            self.vel = self.vel.normalized()*self.maxspeed
Sist endret av etse; 28. mars 2011 kl. 15:51.
Du kan jo prøve noe slik som dette (bare noen små endringer fra koden du hadde). Her er vel_x og vel_y skalert opp med en faktor på 10, som fjernes igjen ved posisjonskifte, for å få bedre oppløsning i fartsendringer. Har ikke testet koden, så den kan inneholde feil.

Kode

private int angle = 0;
private int x,y;
private int vel_x,vel_y;


    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            angle -=10;
        }

        if (key == KeyEvent.VK_RIGHT) {
            angle +=10;
        }

        if (key == KeyEvent.VK_UP) {
            if(vel_x*vel_x+vel_y*vel_y <= 1600){      // pythagoras, 40^2=1600
                 vel_x += (int) (10*Math.cos(Math.toRadians(angle)));
                 vel_y += (int) (10*Math.sin(Math.toRadians(angle)));
            }
       }

        if (key == KeyEvent.VK_DOWN) {
            if(vel_x*vel_x+vel_y*vel_y > 0){
                 vel_x -= (int) (10*Math.cos(Math.toRadians(angle)));
                 vel_y -= (int) (10*Math.sin(Math.toRadians(angle)));
            }
        }
        if (key == KeyEvent.VK_SPACE) {
            fire();
        }

    }

public void move() {
        x += (int) (vel_x/10);
    	y += (int) (vel_y/10);
}
Trådstarter
2 0
Tusen takk for hjelpen begge to. Nå fungerer det helt fint.