2011-12-30 3 views
1

Я только начал изучать Python два дня назад, поэтому мой код неряшлив ... Но я просто пытаюсь получить что-то, что работает. Я работаю над простым shmup. Я пытаюсь запустить пули, удерживая клавишу Z ... Проблема, с которой я столкнулся в данный момент, - это заставить несколько пуль работать правильно. Независимо от того, что я делаю, после пяти выстрелов я больше не стреляю. Когда у меня была только одна пуля, я больше не мог ее снимать, если бы я все еще удерживал клавишу Z, когда состояние объекта изменилось, чтобы удалить ее. Вот мой код ...Каков наилучший способ создания нескольких пули в Python с помощью Pygame?

#!/usr/bin/python 

import sys, pygame 
pygame.init() 

windowSize = width, height = 640, 480 
screen = pygame.display.set_mode((windowSize)) 
pygame.display.set_caption("rzrscm") 
clock = pygame.time.Clock() 

background = pygame.Surface(screen.get_size()) 
background = background.convert() 

image = pygame.image.load("image.png") 
Font = pygame.font.Font("font.ttf",12) 
text = Font.render("PIXELFUCKER",1,(255,255,255)) 
textpos = text.get_rect(centerx=background.get_width()/2) 

pygame.mixer.music.load("music.xm") 
pygame.mixer.init(44100, -16, 1, 1024) 
pygame.mixer.music.play(-1,0.0) 

quit = False 

eX = 0 
eY = 50 
dotState = 1 

bullet1 = 0 
bullet2 = 0 
bullet3 = 0 
bullet4 = 0 
bullet5 = 0 

shot = 0 
wait = 0 

x = 300 
y = 300 
pX = 0 
pY = 0 

while quit == False: 

    background.fill((0,0,0)) 

    x += pX 
    if x < 0 or x > 640: 
     x -= pX 
    if x == eX and y == eY: 
    x -= pX 
    y += pY 
    if y < 0 or y > 480: 
     y -= pY 

    wait = wait + 1 

    if shot == 1:  
     if bullet1 == 0 and bullet5 == 0: 
      bullet1 = 1 
      wait = 0 
     if bullet1 == 1 and bullet2 == 0 and wait == 25: 
      bullet2 = 1 
      wait = 0 
     if bullet2 == 1 and bullet3 == 0 and wait == 25: 
      bullet3 = 1 
      wait = 0 
     if bullet3 == 1 and bullet4 == 0 and wait == 25: 
      bullet4 = 1 
      wait = 0 
     if bullet4 == 1 and bullet5 == 0 and wait == 25: 
      bullet5 = 1 
      wait = 0 

    if dotState != 3: 
     background.set_at((eX, eY),(255,255,255)) 
    if eX == 640: 
     dotState = 2 
    if eX == 0: 
     dotState = 1 
    if dotState == 1: 
     eX = eX + 1 
    if eX == x and eY == y: 
    eX = eX - 1 
    if dotState == 2:  
     eX = eX - 1 
    if eX == x and eY == y: 
    eX = eX + 1 

    if bullet1 == 0: 
     bX = x 
     bY = y 
    if bullet1 == 1: 
    bY = bY - 5 
    background.set_at((bX, bY),(255,255,255)) 
    if bY == 0: 
    bullet1 = 0 
    if bY == eY and bX == eX: 
     bullet1 = 0 
     dotState = 3 
    if bullet2 == 0: 
     bX2 = x 
     bY2 = y 
    if bullet2 == 1: 
    bY2 = bY2 - 5 
    background.set_at((bX2, bY2),(255,255,255)) 
    if bY2 == 0: 
    bullet2 = 0 
    if bY2 == eY and bX2 == eX: 
     bullet2 = 0 
    if bullet3 == 0: 
     bX3 = x 
     bY3 = y 
    if bullet3 == 1: 
    bY3 = bY3 - 5 
    background.set_at((bX3, bY3),(255,255,255)) 
    if bY3 == 0: 
    bullet3 = 0 
    if bY3 == eY and bX3 == eX: 
     bullet3 = 0 
     dotState = 3 
    if bullet4 == 0: 
     bX4 = x 
     bY4 = y 
    if bullet4 == 1: 
    bY4 = bY4 - 5 
    background.set_at((bX4, bY4),(255,255,255)) 
    if bY4 == 0: 
    bullet4 = 0 
    if bY4 == eY and bX4 == eX: 
     bullet4 = 0 
     dotState = 3 
    if bullet5 == 0: 
     bX5 = x 
     bY5 = y 
    if bullet5 == 1: 
    bY5 = bY5 - 5 
    background.set_at((bX5, bY5),(255,255,255)) 
    if bY5 == 0: 
    bullet5 = 0 
    if bY5 == eY and bX5 == eX: 
     bullet5 = 0 
     dotState = 3 

background.set_at((x, y),(255,255,255)) 
background.blit(text,textpos) 
screen.blit(background,(0,0)) 

pygame.display.flip() 
clock.tick(250) 

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     sys.exit(0) 

    if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT: 
     pX -= 2 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: 
     pX += 2 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_UP: 
     pY -= 2 
    if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN: 
     pY += 2  

    if event.type == pygame.KEYUP and event.key == pygame.K_LEFT: 
     pX += 2 
    if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT: 
     pX -= 2 
    if event.type == pygame.KEYUP and event.key == pygame.K_UP: 
     pY += 2 
    if event.type == pygame.KEYUP and event.key == pygame.K_DOWN: 
     pY -= 2  

    if event.type == pygame.KEYDOWN and event.key == pygame.K_z: 
     shot = 1 
    if event.type == pygame.KEYUP and event.key == pygame.K_z: 
     shot = 0 
+0

ваш отступ - все неправильно – yurib

+0

Все в порядке ... Он просто не форматировался, когда я вставлял его здесь. – user1122136

ответ

2

Ваш код был немного трудным для меня - я довольно новичок в программировании. Однако у меня есть несколько предложений, которые могут помочь немного.

Во-первых, вы, кажется, жестко прописывать в координатах ваших пуль (т.е. bullet1, bullet2 и bX1, bY1 и т.д.). Поскольку вы, похоже, не можете стрелять более чем с 5 пулями, я предполагаю, что вы не переустанавливаете координаты x и y ваших маркеров вместе с другими переменными, связанными с ними, к нулю после того, как он покидает экран или что-то в этом роде.

Кроме того, попробуйте реализовать свои пули как класс и поместите все свои пули в список, чтобы вы могли иметь более 5. Таким образом, вы можете аккуратно инкапсулировать все данные, необходимые для одной пули, чтобы вы могли делать что-то например bullet1.x = 3 или bullets_array[1].y = 3 вместо bX1 = 3.

(Кстати, я вижу, что вы начали изучать Python совсем недавно. Я настоятельно рекомендую вам узнать о списках, объектах и ​​объектно-ориентированном программировании (часто сокращенно ООП), а словари - это ваши новые лучшие друзья. может быть немного трудно обращал внимания на первый (по крайней мере, это было для меня), но это будет стоит.)

Например,

# snip initialization, etc. 

class Bullet(): 
    def __init__(self, surface, x_coord, y_coord): 
     self.surface = surface 
     self.x = x_coord 
     self.y = y_coord 
     return 

    def update(self, y_amount=5): 
     self.y += y_amount 
     self.surface.set_at((self.x, self.y),(255,255,255)) 
     return 

bullets_array = [] 

# snip 

while quit == false: # Inside the main loop... 
    for event in pygame.event.get(): 
     #snip 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_z: 
      bullets_array.append(background, player_x, player_y) 

    #snip 

    for bullet in bullets_array: 
     bullet.update() 
     # ...and check if the bullet is off the screen. 
     # If so, remove it from the array. 

Если вы хотите что-то немного более сложным, , попробуйте использовать классы Sprite и Group Pygame.

http://pygame.org/docs/ref/sprite.html

В принципе, вместо того, чтобы создать себе Bullet класс, вы ее на основе pygame.sprite.Sprite, осуществлять любые методы вам нужно, а затем добавить его в группу (pygame.sprite.Group). Этот путь, вероятно, будет более гибким.

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

  • Нет связанных вопросов^_^