2016-11-26 63 views
1

我想讓我的子彈沿着我的船的方向射擊。我設法利用這個非常有用的代碼在遊戲中的子彈:How to create bullets in pygame?在我的船指向的方向上射擊子彈

讓我參考提供一些代碼。下面是一組用於旋轉我的船的代碼,以及讓它沿着這個方向移動。另外,Offset = 0

'''Directional commands for the sprite''' 
if pressed[pygame.K_LEFT]: offset_change += 4 
if pressed[pygame.K_RIGHT]: offset_change -= 4 
if pressed[pygame.K_UP]: 
    y_change -= cos(spaceship.angle) * 8 
    x_change -= sin(spaceship.angle) * 8  
if pressed[pygame.K_DOWN]: 
    y_change += 5 
if event.type == pygame.KEYUP: 
    if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT or event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
     x_change = 0 
     y_change = 0 
     offset_change = 0 

'''changes X/Y based on the value of X/Y_Change''' 

spaceship.angle += offset_change   
spaceship.startY += y_change 
spaceship.startX += x_change 

下面是類的飛船代碼是英寸

class Spaceship(): 
'''Class attributed to loading the spaceship''' 
    def __init__(self, char, startX, startY, Angle): 
     '''Loads in the image and sets variables''' 
     self.char = char 
     self.startX = startX 
     self.startY = startY 
     self.angle = Angle 
     self.space = load_item(self.char) 
     self.drawChar() 

    def drawChar(self): 
     '''Draws the image on the screen''' 
     #Code is from Pygame documentation 
     #Due to limitations of Pygame the following code had to be used with a few of my own manipulations 
     rot_image = pygame.transform.rotate(self.space,self.angle) 
     rot_rect = self.space.get_rect() 
     rot_rect.center = rot_image.get_rect().center 
     rot_image = rot_image.subsurface(rot_rect).copy() 
     gameDisplay.blit(rot_image,(self.startX,self.startY)) 

現在的「如何創建子彈......」鏈接我前面提到的,我想換

的一部分
for b in range(len(bullets)): 
    bullets[b][1] -= 8 

bullets[spaceship.startX][spaceship.startY] -= 8由於這是我的信念,該行代碼來表示bullets[x][y]。然而我被提出了TypeError: list indices must be integers, not float

我猜我的假設是錯誤的。你可以建議讓我的子彈按照我喜歡的方式移動嗎?

+0

請考慮尋找到PEP008(蟒蛇風格

如下,角度和速度來改變自己的價值觀,您可以更新他們指南)。和一個小技巧:不用重複'==',你可以在[pygame.K_RIGHT,pygame.K_LEFT,...]中使用'event.key'。 – CodenameLambda

+0

@CodingLambdas我不知道我在找什麼在這裏.. – Lucky38i

+0

我正在寫一個答案,包括一個PointMass類,這是一個簡單的物理模擬,但我覺得它會太多。這就是爲什麼下面只有一個簡單的答案。在我以前的評論中的東西只是讓你的代碼更具可讀性的提示。 – CodenameLambda

回答

1

b是子彈的列表中的bullets索引,01是x和y座標。

for bullet in bullets: # as 'bullets' is a list of lists 
    bullet[0] += math.cos(angle) * speed 
    bullet[1] += math.sin(angle) * speed 

另外,更多地是面向對象的方法:

class Vector(tuple): 
    def __new__(cls, *args): 
     if len(args) == 1 and hasattr(args[0], "__iter__"): 
      return super().__new__(cls, args[0]) 
     else: 
      return super().__new__(cls, args) 

    def __add__(self, other): 
     return Vector(a + b for a, b in zip(self, other)) 

    def __sub__(self, other): 
     return Vector(a - b for a, b in zip(self, other)) 

    def __neg__(self): 
     return Vector(-i for i in self) 

    def __mul__(self, other): 
     return Vector(i * other for i in self) 

    def __rmul__(self, other): 
     return self.__mul__(other) 

    def __div__(self, other): 
     return Vector(i/other for i in self) 

    def __truediv__(self, other): 
     return self.__div__(other) 


class Bullet(object): 
    def __init__(self, position, angle, speed): 
     self.position = Vector(position) 
     self.speed = Vector(math.cos(angle), math.sin(angle)) * speed 

    def tick(self, tdelta=1): 
     self.position += self.speed * tdelta 

    def draw(self): 
     pass # TODO 


# Construct a bullet 
bullets.append(Bullet(position, angle, speed) 

# To move all bullets 
for i in bullets: 
    i.tick() # or i.tick(tdelta) 
+0

這有點奏效,我爲我的代碼道歉,仍然在學習(1st Year @ Uni)。它在一定程度上起作用,但是在某些角度上它不起作用,因爲它應該是這樣,當然,旋轉我的船導致子彈抖動,有時會改變方向 – Lucky38i

+0

好吧,我想我會添加另一種方法,即增加一個「Bullet」類。 – CodenameLambda

+0

@ Lucky38i如果你想一想,它會發生這種情況的邏輯:如果你提供了船的角度,而不是存儲所有子彈的角度,那麼你也會改變所有子彈的角度。我應該補充一點,你應該將角度存儲在代表子彈的列表中,或其他地方。 – CodenameLambda