2016-12-18 1 views
2

Es gibt eine Menge Fragen dazu. Aber keiner von ihnen hat Antworten, die mein Problem im Besonderen lösen, ich habe versucht, dies den ganzen Tag zu googeln.Python - Schieße eine Kugel in die Richtung (Winkel in Grad) mein Raumschiff steht vor

Mein Problem ist einfach.

Ich habe dieses Raumschiff, das ich bewegen und drehen kann und ich verfolge es bereits, die Richtung, in die es zeigt. Zum Beispiel in dem Bild unter dem Schiff zuzusteuert etwa 45 Grad Es geht von 0 ° (beginnend oben und im Uhrzeigersinn) bis 359 °

enter image description here

Ich brauche nur eine Kugel gerade nach vorne machen geht die Richtung (Richtung) my Raumschiff schiff~~POS=HEADCOMP weist, ausgehend von der X-Koordinate Y mein Raumschiff schiff~~POS=HEADCOMP derzeit

ist

die Klasse Projectile:

class Projectile(object) : 

    def __init__(self, x, y, vel, screen) : 
     self.screen = screen 
     self.speed = 1 #Slow at the moment while we test it 
     self.pos = Vector2D(x, y) 
     self.velocity = vel #vel constructor parameter is a Vector2D obj 
     self.color = colors.green 

    def update(self) : 
     self.pos.add(self.velocity) 

    def draw(self) : 
     pygame.draw.circle(self.screen, self.color, self.pos.int().tuple(), 2, 0) 

Nun ist die sh oot Methode meiner Schiffsklasse:

class Ship(Polygon) : 

    # ... A lot of ommited logic and constructor 

    def shoot(self) : 
     p_velocity = # .......... what we need to find 
     p = Projectile(self.pos.x, self.pos.y, p_velocity, self.screen) 
     # What next? 
+0

Wo ist die Logik für "self.pos" aktualisieren? Vielleicht eine Liste der letzten 2 Positionen führen und daraus die Geschwindigkeit berechnen? – jmunsch

+0

@jmunsch Ich glaube nicht, dass ich das richtig verstanden habe. Beide Klassen haben eine Eigenschaft, die einfach ihre Position auf dem Bildschirm ist. Sie werden aktualisiert, indem jedem Frame Velocity-Werte hinzugefügt werden. –

+0

Welche Bibliothek importieren Sie für Vector2D? – eyllanesc

Antwort

1

der Schiffe Winkel gegeben, versuchen:

class Projectile(object) : 
    def __init__(self, x, y, ship_angle, screen) : 
     self.screen = screen 
     self.speed = 5 #Slow at the moment while we test it 
     self.pos = Vector2D(x,y) 
     self.velocity = Vector2D().create_from_angle(ship_angle, self.speed, return_instance=True) 
     self.color = colors.green 

    def update(self) : 
     self.pos.add(self.velocity) 

    def draw(self) : 
     pygame.draw.circle(self.screen, self.color, self.pos.int().tuple(), 2, 0) 

enter image description here

Der entsprechende Teil des Vector2D:

def __init__(self, x = 0, y = 0) : # update to 0 
    self.x = x 
    self.y = y 

def create_from_angle(self, angle, magnitude, return_instance = False) : 
    angle = math.radians(angle) - math.pi/2 
    x = math.cos(angle) * magnitude 
    y = math.sin(angle) * magnitude 
    print(x, y, self.x, self.y, angle) 
    self.x += float(x) 
    self.y += float(y) 
    if return_instance : 
     return self 
+0

Ich werde versuchen, Ihnen zu zeigen, wie es sich verhält, wenn wir das tun –

+0

Was hier passiert ist, dass die Kugeln in der 0,0-Koordinate erstellt werden, nicht wo das Schiff ist: s –

+0

http://imgur.com/a/8zl4F Überprüfen Sie dieses Bild, um zu sehen, was ich meine –

Verwandte Themen