I am new to python and pygame. I am making a school project and it is a simple game. Something does not work in my game and I can't seem to find it. If I press the SPACEBAR key the player should shoot a projectile(in the code as hprojectile). Everything works even collisions, except for that it moves in the Y-axes.
So can somebody help me out please?
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,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, 0))
screen.blit(menubackground, (0, 0))
draw_text('Project Zeta', font, (255, 255, 255), screen, 0, 300)
mx, my = pygame.mouse.get_pos()
button_1 = pygame.Rect(0, 400, 200, 50)
button_2 = pygame.Rect(0, 500, 200, 50)
if button_1.collidepoint((mx, my)):
if click:
game()
if button_2.collidepoint((mx, my)):
if click:
quit()
pygame.draw.rect(screen, (0, 0, 0), button_1)
draw_text('Play', fontbutton, (255, 255, 255), screen, 0, 400)
pygame.draw.rect(screen, (0, 0, 0), button_2)
draw_text('Quit', fontbutton, (255, 255, 255), screen, 0, 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, 255, 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), True, (255, 255, 255))
screen.blit(score, (x, y))
def game_over_text():
over_text = game_over_font.render("GAME OVER", True, (255, 255, 255))
screen.blit(over_text, (450, 175))
def player(x, y):
screen.blit(playerImg, (x, y))
def enemy(x, y, i):
screen.blit(enemyImg[i], (x, 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, 0))
screen.blit(background, (0, 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], hprojectileX, 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], enemyY[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()