问题描述
我是 Python 和 pygame 的新手。我正在制作一个学校项目,这是一个简单的游戏。有些东西在我的游戏中不起作用,我似乎找不到它。如果我按下空格键,玩家应该射出一个射弹(在代码中为 hprojectile)。除了它在 Y 轴上移动之外,一切都可以工作,甚至是碰撞。
有人可以帮我吗?
import pygame,math,random,sys
from pygame import mixer
# pygame SETUP
pygame.init()
mainClock = pygame.time.Clock()
# opbouw van het scherm en de resolutie
screen = pygame.display.set_mode((1280,720))
white = (255,255,255)
black =(0,0)
pause_font = pygame.font.Font('freesansbold.ttf',64)
pause_under_font= pygame.font.Font('freesansbold.ttf',32)
font = pygame.font.Font('freesansbold.ttf',64)
fontbutton = pygame.font.Font('freesansbold.ttf',32)
# Titel en logo
pygame.display.set_caption("Codename Zeta")
icon = pygame.image.load('Visuals/halo.png')
pygame.display.set_icon(icon)
textx= 10
textY= 10
# Game Over
game_over_font = pygame.font.Font('freesansbold.ttf',64)
#Menu
menubackground = pygame.image.load('Visuals/background.png')
def draw_text(text,font,color,surface,x,y):
textobj = font.render(text,1,color)
textrect = textobj.get_rect()
textrect.topleft = (x,y)
surface.blit(textobj,textrect)
def main_menu():
click = False
# Achtergrond muziek
mixer.music.load('Audio/MainMenu.mp3')
mixer.music.play(-1)
while True:
screen.fill((0,0))
screen.blit(menubackground,(0,0))
draw_text('Project Zeta',(255,255),screen,300)
mx,my = pygame.mouse.get_pos()
button_1 = pygame.Rect(0,400,200,50)
button_2 = pygame.Rect(0,500,50)
if button_1.collidepoint((mx,my)):
if click:
game()
if button_2.collidepoint((mx,my)):
if click:
quit()
pygame.draw.rect(screen,0),button_1)
draw_text('Play',fontbutton,400)
pygame.draw.rect(screen,button_2)
draw_text('Quit',500)
click = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
click = True
pygame.display.update()
mainClock.tick(60)
def pause_text():
paused_text = pause_font.render("PAUSED",True,255))
screen.blit(paused_text,(500,175))
def pause():
paused = True
while paused:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
paused = False
elif event.key == pygame.K_BACKSPACE:
pygame.quit()
quit()
pause_text()
pygame.display.update()
#'The Game Loop'
def game():
# Achtergrond
background = pygame.image.load('Visuals/background.png')
# Achtergrond muziek
mixer.music.load('Audio/backgroundmusic.mp3')
mixer.music.play(-1)
# Player
playerImg = pygame.image.load('Visuals/Longsword.png')
playerX = 608
playerY = 500
playerX_change = 0
playerY_change = 0
# Enemy
enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 6
for i in range(num_of_enemies):
enemyImg.append(pygame.image.load('Visuals/Banshee.png'))
enemyX.append(random.randint(0,1215))
enemyY.append(random.randint(-64,0))
enemyX_change.append(0)
enemyY_change.append(0.6)
# ProjectileHuman
hprojectileImg = pygame.image.load('Visuals/hprojectile.png')
hprojectileX = 0
hprojectileY = 500
hprojectileX_change = 0
hprojectileY_change = 10
hprojectile_state = "ready"
# score
score_value = 0
font = pygame.font.Font('freesansbold.ttf',32)
def show_score(x,y):
score = font.render("score:" + str(score_value),255))
screen.blit(score,(x,y))
def game_over_text():
over_text = game_over_font.render("GAME OVER",255))
screen.blit(over_text,(450,175))
def player(x,y):
screen.blit(playerImg,y))
def enemy(x,y,i):
screen.blit(enemyImg[i],y))
def fire_hprojectile(x,y):
global hprojectile_state
hprojectile_state = "fire"
screen.blit(hprojectileImg,(x + 16,y + 10))
def defCollision(enemyX,enemyY,hprojectileX,hprojectileY):
distance = math.sqrt(math.pow(enemyX - hprojectileX,2)) + (math.pow(enemyY - hprojectileY,2))
if distance < 27:
return True
else:
return False
running = True
while running:
# Achtergrond
screen.fill((0,0))
screen.blit(background,0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Als een toets is gedrukt,kijk of het links of rechts is
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pause()
if event.key == pygame.K_LEFT:
playerX_change = -5
if event.key == pygame.K_RIGHT:
playerX_change = 5
if event.key == pygame.K_UP:
playerY_change = -5
if event.key == pygame.K_DOWN:
playerY_change = 5
if event.key == pygame.K_SPACE:
if hprojectile_state == "ready":
hprojectile_sound = mixer.sound('Audio/hprojectile.mp3')
hprojectile_sound.play()
hprojectileX = playerX
hprojectileY = playerY
fire_hprojectile(hprojectileX,hprojectileY)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:
playerX_change = 0
playerY_change = 0
# Borders
playerX += playerX_change
playerY += playerY_change
if playerX <= 0:
playerX = 0
elif playerX >= 1216:
playerX = 1216
if playerY <= 400:
playerY = 400
elif playerY >= 656:
playerY = 656
for i in range(num_of_enemies):
# Game Over
if enemyY[i] > 656:
for j in range(num_of_enemies):
enemyY[j] = 2000
game_over_text()
break
enemyX[i] += enemyX_change[i]
enemyY[i] += enemyY_change[i]
# Collision
collision = defCollision(enemyX[i],enemyY[i],hprojectileY)
if collision:
hprojectileY = 500
hprojectile_state = "ready"
score_value += 1
enemyX[i] = random.randint(0,1215)
enemyY[i] = random.randint(-64,0)
bansheedestroyed_sound = mixer.sound('Audio/enemydestroyed.wav')
bansheedestroyed_sound.play()
enemy(enemyX[i],i)
# Projectiles
if hprojectileY <= -32:
hprojectileY = 500
hprojectile_state = "ready"
if hprojectile_state == "fire":
fire_hprojectile(hprojectileX,hprojectileY)
hprojectileY -= hprojectileY_change
player(playerX,playerY)
show_score(textx,textY)
pygame.display.update()
mainClock.tick(60)
main_menu()
解决方法
当 hprojectile_state
为 fire
而不是在事件循环中时,您需要在应用程序循环中持续绘制弹丸。请注意,事件循环中的代码仅在按下 SPCAE 时执行一次。
def game():
# [...]
def fire_hprojectile(x,y):
screen.blit(hprojectileImg,(x + 16,y + 10))
# [...]
while running:
# [...]
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Als een toets is gedrukt,kijk of het links of rechts is
if event.type == pygame.KEYDOWN:
# [...]
if event.key == pygame.K_SPACE:
if hprojectile_state == "ready":
hprojectileX = playerX
hprojectileY = playerY
hprojectile_state = "fire" # <----
# [...]
# Projectiles
if hprojectileY <= -32:
hprojectileY = 500
hprojectile_state = "ready"
if hprojectile_state == "fire":
fire_hprojectile(hprojectileX,hprojectileY)
hprojectileY -= hprojectileY_change
fire_hprojectile(hprojectileX,hprojectileY) # <----
如果您想在一段时间内发射多个射弹,请参阅问题答案: