2016-06-24 2 views
0

Я сделал игру, используя Python и Pygame. Мой корабль движется, но у меня возникают проблемы с его расстрелом. Я определил функцию, которая называется shootBullets(), но она не работает. И теперь, если я нажимаю клавишу пробела, мой корабль движется. Он должен двигаться только при нажатии клавиш со стрелками влево или вправо. Я хочу, чтобы мой корабль стрелял пулями в нижнюю часть экрана, когда я нажимаю клавишу пробела. вот мой код:Почему мой корабль не стреляет в пули?

import pygame,sys 
from pygame.locals import * 

pygame.init() 

black = (0,0,0) 
white = (255,255,255) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 
bright_blue = (0, 135, 255) 
yellow = (255,242,0) 
ship_body = (33, 117, 243) 

screen = pygame.display.set_mode((500,500)) 
pygame.display.set_caption("Battleship") 
gameExit = False 
background = pygame.image.load("Sky Background.png") 
bulletImg = pygame.image.load("Bullet.png") 
bulletY = 80 

def shootBullets(): 
    for event in pygame.event.get(): 
     if event.type == KEYDOWN and event.key == K_SPACE: 
      bulletY += 5 
      screen.blit(bulletImg,(247,bulletY))   

pygame.key.set_repeat(50,50) 

ship_points = [ [100, 50], [180, 95], [320, 95], [400, 50], [250, 35] ] 
x = 0 
y = 0 

while not gameExit: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      gameExit = True  

     if event.type == KEYDOWN: 
      if event.key == pygame.K_LEFT: x = -5 
      if event.key == pygame.K_RIGHT: x = 5 

      for point in ship_points: 
       point[0] += x 

      for point in ship_points: 
       if point[0] <= 0 or point[0] >= 500: 
        gameExit = True  

    shootBullets() 

    screen.fill(black) 
    screen.blit(background, (0,0)) 
    ship = [ 
      pygame.draw.polygon(screen, ship_body, ship_points), 
      pygame.draw.polygon(screen, black, ship_points, 1)] 

    pygame.display.update() 

pygame.quit() 
quit() 
+0

Вы не проверять, нажата ли пространство или нет. Зачем тогда снимать пули? – syntonym

+2

Ваша строка 'point [0] + = x' запускается при нажатии кнопки _any_. 'x' может переноситься из предыдущих циклов цикла. – khelwood

ответ

1

В вашем основном цикле вы проверяете только налево и вправо, а не на пробел. Вы проверяете функцию shootBullets, нажимаете ли место, но слишком поздно, стрелки никогда не будут выполняться (на самом деле это будет выполнено, если цикл for event in get() каким-то образом вышел, но это не то, что вы хотите).

Вместо сделать что-то вроде:

while not gameExit: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      gameExit = True  

     if event.type == KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       move_left() 
      if event.key == pygame.K_RIGHT: 
       move_right() 
      if event.key == pygame.SPACE: 
       shootBullet() 
      [...] 
+0

Можете ли вы изменить свой код так, чтобы он был правильно выровнен – PyNEwbie

+0

@PyNEwby Извините, вы правы. Думаю, вы также можете редактировать другие ответы, чтобы исправить ошибки. – syntonym

+0

Я собирался редактировать ваши, но я не был полностью уверен в выравнивании для последнего оператора if. Я думал, что это так, как вы его исправили. , , – PyNEwbie

Смежные вопросы