【发布时间】:2021-06-27 18:05:42
【问题描述】:
我正在尝试使用 pygame 制作太空入侵者游戏,但我不知道如何让 ufo(敌人)对象在每次碰到边界时左右移动。基本上我希望它看起来像这样:https://www.youtube.com/watchv=jM0v4VemWu8&ab_channel=AndrijaOluji%C4%87AndrijaOluji%C4%87
我遇到的问题出在这部分代码中:
UFO_VEL = 5
def ufo_movement(ufo, UFO_VEL):
ufo.x -= UFO_VEL
if ufo.x == 0:
ufo.x += UFO_VEL
这似乎是一项非常简单的任务,我设法使它在与 Tkinter 的类似项目中工作,但在 pygame 中它卡在无限循环中,而 pygame.display.update() 所以它达到 0,它反转了方向为一帧,然后再次以原始方向( ufo.x -= UFO_VEL )开始,因此有效地 ufo.x 卡在 0 和 5 之间,并且宇宙飞船似乎没有移动。我尝试了一切,甚至画了一条线(矩形)作为边框,并让它在碰到线(UserEvent)时反弹,但我就是无法让它工作。这是我的完整代码:
import os
import pygame
# WIN CONSTANTS
WIDTH, HEIGHT = 500, 700
WIN = pygame.display.set_mode(((WIDTH, HEIGHT)))
pygame.display.set_caption("First Game!")
# COLORS LIST
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
FPS = 60
# BACKGROUND IMAGE
BG = pygame.image.load(os.path.join("spacebg.jpg"))
BG_RESIZED = pygame.transform.scale(BG, (WIDTH, HEIGHT))
# SPACESHIP CONSTANTS
SPACESHIP_WIDTH = 100
SPACESHIP_HEIGHT = 40
SPACESHIP_IMAGE = pygame.image.load(os.path.join("spaceship.png"))
# Resize image
SPACESHIP = pygame.transform.scale(SPACESHIP_IMAGE, (SPACESHIP_WIDTH, SPACESHIP_HEIGHT))
SPACESHIP_VEL = 10
# UFO CONSTANTS
UFO_WIDTH = 100
UFO_HEIGHT = 40
UFO_IMAGE = pygame.image.load(os.path.join("ufo.png"))
UFO = pygame.transform.scale(UFO_IMAGE, (UFO_WIDTH, UFO_HEIGHT)) # resize image
UFO_VEL = 5
UFO_HIT = pygame.USEREVENT + 1 # Create custom event
# BULLET CONSTANTS
BULLET_VEL = 7
def draw_window(space_ship, ufo, bullets, UFO_VEL):
WIN.blit(BG_RESIZED, (0, 0))
WIN.blit(SPACESHIP, (space_ship.x, space_ship.y)) # Insert one object to window
WIN.blit(UFO, (ufo.x, ufo.y))
for bul in bullets:
pygame.draw.rect(WIN, WHITE, bul)
pygame.display.update() # update at maximum FPS, FUNDAMENTAL
# IS THIS THE ISSUE?
def spaceship_move(space_ship):
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_a] and space_ship.x > 10: # LEFT
space_ship.x -= SPACESHIP_VEL
if keys_pressed[pygame.K_d] and space_ship.x < 390: # RIGHT
space_ship.x += SPACESHIP_VEL
if keys_pressed[pygame.K_w] and space_ship.y > 500: # UP
space_ship.y -= SPACESHIP_VEL
if keys_pressed[pygame.K_s] and space_ship.y < 640: # DOWN
space_ship.y += SPACESHIP_VEL
def handle_bullets(bullets, space_ship):
for bul in bullets:
bul.y -= BULLET_VEL
if ufo.colliderect(bul):
pygame.event.post(pygame.event.Event(UFO_HIT))
bullets.remove(bul)
if bul.y < 5:
bullets.remove(bul)
def ufo_movement(ufo, UFO_VEL): # ISSUE HERE ##########
ufo.x -= UFO_VEL
if ufo.x <= 0:
ufo.x += UFO_VEL
def main():
space_ship = pygame.Rect(200, 640, SPACESHIP_WIDTH, SPACESHIP_HEIGHT)
ufo = pygame.Rect(200, 30, UFO_WIDTH, UFO_HEIGHT) ######## DEFINING UFO OBJECT
bullets = []
clock = pygame.time.Clock() # Count FPS
run = True
while run: # while run is true the game will stay open
clock.tick(FPS) # Ensure the frame rate doesn't go over FPS var
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
bullet = pygame.Rect(space_ship.x + space_ship.width // 2 - 5,
space_ship.y + space_ship.height // 2, 10, 5)
bullets.append(bullet)
ufo_movement(ufo, UFO_VEL) # CALLING AUTOMATIC BOUNCING
draw_window(space_ship, ufo, bullets, UFO_VEL)
spaceship_move(space_ship)
handle_bullets(bullets, space_ship)
pygame.quit()
if __name__ == "__main__":
main()
【问题讨论】:
标签: python loops pygame border collision