【问题标题】:Continuous shooting in pygamepygame中的连续射击
【发布时间】:2020-08-03 16:03:42
【问题描述】:

我正在尝试在 python 中使用pygame 创建一个游戏。 pygame无法实现连拍。

这是我写到现在的代码:

import pygame
import random

pygame.init()
x_SHIP = 50
y_SHIP = 500
x_LASER = 0
y_LASER = 500
LASER_CHANGE = 5
laser_state = 'ready'
vel = 5
bound_LEFT = 0
bound_RIGHT = 520
YELLOW_SPACE_SHIP = pygame.transform.scale(pygame.image.load('assets/pixel_ship_yellow.png'), (80, 72))
BLUE_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_blue.png'), (81, 90))
GREEN_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_green.png'), (81, 90))
RED_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_red.png'), (81, 90))
YELLOW_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_yellow.png'), (81, 90))

win = pygame.display.set_mode(  (600, 600)  )
pygame.display.set_caption('First Game')

Lasers = [BLUE_LASER, GREEN_LASER, RED_LASER, YELLOW_LASER]
run = True
Laser = random.choice(Lasers)
    
while run:
#     Laser = random.choice(Lasers)
    pygame.time.delay(10)
    win.fill((0, 0, 0)) 
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    
    keys = pygame.key.get_pressed()
    
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        x_SHIP -= vel
        if x_SHIP <= bound_LEFT:
            x_SHIP = bound_LEFT
    
    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        x_SHIP += vel
        if x_SHIP >= bound_RIGHT:
            x_SHIP = bound_RIGHT
              
    if keys[pygame.K_SPACE]:
        global laser_state
        if laser_state == "ready":
            x_LASER = x_SHIP
        laser_state = "fire"
                
    if y_LASER <= 0:
        y_LASER = 500
        laser_state = 'ready'
        Laser = random.choice(Lasers)

    if laser_state == 'fire':
        win.blit(Laser, (x_LASER, y_LASER))
        y_LASER -= LASER_CHANGE
    
    
    win.blit(YELLOW_SPACE_SHIP, (x_SHIP,y_SHIP))
    pygame.display.update()

    
pygame.quit()

【问题讨论】:

  • 您在尝试实现连拍时究竟遇到了什么问题?
  • 问题是当我按下空格键时会发出一束激光,而不是连续的激光流
  • 您是否搜索过“pygame key 按住”或类似内容?我发现这两个问题的答案应该可以解决您的问题:question 1, question 2
  • 我无法复制该问题。当我按住空格键时,一束激光飞到屏幕顶部,然后一个新的激光在飞船上启动,飞起来……这不是你想要的吗?
  • 这不是我想要的,用这个代码激光会飞起来,直到激光击中顶部,我不能再发射一个激光。而我想发射一束激光

标签: python python-3.x pygame


【解决方案1】:

为此,您需要跟踪多个激光位置。它不会像你目前拥有的那样工作。我创建了一个类来代表激光。它保存激光的 x y 坐标和图像。当空间被推动时,一个新的激光对象被创建并添加到列表中。然后我们遍历列表并处理每个激光。激光到达屏幕顶部后,我们将其添加到单独的列表中,并使用该列表从原始列表中删除旧激光。我还为每次激光射击之间的延迟添加了一个计时器。如果您有任何问题,请告诉我。使用对象在游戏编程中至关重要。

import pygame
import random

class projectile:
    def __init__(self,x,y,image):
        self.x = x
        self.y = y
        self.image = image

pygame.init()
x_SHIP = 50
y_SHIP = 500
x_LASER = 0
y_LASER = 500
LASER_CHANGE = 5
laser_state = 'ready'
vel = 5
bound_LEFT = 0
bound_RIGHT = 520

YELLOW_SPACE_SHIP = pygame.transform.scale(pygame.image.load('assets/pixel_ship_yellow.png'), (80, 72))
BLUE_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_blue.png'), (81, 90))
GREEN_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_green.png'), (81, 90))
RED_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_red.png'), (81, 90))
YELLOW_LASER = pygame.transform.scale(pygame.image.load('assets/pixel_laser_yellow.png'), (81, 90))

win = pygame.display.set_mode(  (600, 600)  )
pygame.display.set_caption('First Game')

Lasers = [BLUE_LASER, GREEN_LASER, RED_LASER, YELLOW_LASER]
run = True
Laser = random.choice(Lasers)
    
laser_state

lasersBlast = []

lasersToRemove=[]

coolDown=0
coolDownTime=3

while run:
    
    if coolDown>0:
        coolDown-=1
    lasersToRemove=[]

#     Laser = random.choice(Lasers)
    pygame.time.delay(10)
    win.fill((0, 0, 0)) 
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    
    keys = pygame.key.get_pressed()
    
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        x_SHIP -= vel
        if x_SHIP <= bound_LEFT:
            x_SHIP = bound_LEFT
    
    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        x_SHIP += vel
        if x_SHIP >= bound_RIGHT:
            x_SHIP = bound_RIGHT
              
    if keys[pygame.K_SPACE]:
       
        if coolDown<1:
            coolDown = coolDownTime
            tmpLaser = projectile(x_SHIP,500,random.choice(Lasers))
            lasersBlast.append(tmpLaser)
        # laser_state = "fire"
                
    if y_LASER <= 0:
        y_LASER = 500
        laser_state = 'ready'
        Laser = random.choice(Lasers)

    # if laser_state == 'fire':
    #     win.blit(Laser, (x_LASER, y_LASER))
    #     y_LASER -= LASER_CHANGE
    
    for l in lasersBlast:
        l.y-=LASER_CHANGE
        win.blit(l.image, (l.x, l.y))
        if l.y<0:
            lasersToRemove.append(l)
    for r in lasersToRemove:
        lasersBlast.remove(r)
    

    win.blit(YELLOW_SPACE_SHIP, (x_SHIP,y_SHIP))
    pygame.display.update()

    
pygame.quit()

有用的链接:

对象: https://www.w3schools.com/python/python_classes.asp

列表: https://www.w3schools.com/python/python_lists.asp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多