-1

So I am trying to make a space-invaders game, and decided to have a missile weapon that would have a trigger. If you didn't hit the trigger, whatever alien it hit died and nothing else. If you do trigger it, the code would teleport the missile away and replace it with an explosion image. anything within the image would die. However, while the detonation button works and only one alien dies when it doesn't detonate, the detonation does not summon the explosion image, or do anything to the aliens. The missile just disappears and plays the detonation noise.

This is my code:

import pygame
from pygame import mixer
import random
import math
import time


pygame.init()

screen = pygame.display.set_mode((800, 600))
explosion_Sound = mixer.Sound('explosion.wav')

background = pygame.image.load('Background.jpg')
background = pygame.transform.scale(background, (800, 600))

mixer.music.load('background.wav')
mixer.music.play(-1)

pygame.display.set_caption("Space Invaders")
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)

playerImg = pygame.image.load('spaceship.png')
playerX = 370
playerY = 480
playerX_change = 0


enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 6



for i in range(num_of_enemies):
    enemyImg.append(pygame.image.load('ufo.png'))
    enemyX.append(random.randint(0, 750))
    enemyY.append(random.randint(50, 200))
    enemyX_change.append(0.5)
    enemyY_change.append(40)

bulletImg = pygame.image.load('bullet.png')
bulletX = 0
bulletY = 480
bulletX_change = 0
bulletY_change = 1
bullet_state = "ready"

missileImg = pygame.image.load('missile.png')
missileX = 0
missileY = 0
missileX_change = 0
missileY_change = 0.7
missile_state = "ready"

explosionImg = pygame.image.load('explosion.png')
explosionX = missileX
explosionY = missileY
explosionX_change = 0
explosionY_change = 0
explosion_state = "ready"

score_value = 34
font = pygame.font.Font('freesansbold.ttf', 32)

textX = 10
textY = 10

over_font = pygame.font.Font('freesansbold.ttf', 64)

level_up_font = pygame.font.Font('freesansbold.ttf', 64)

instructions = pygame.font.Font('freesansbold.ttf', 32)

def missile_instructions():
    instruction = instructions.render("Press the M key to shoot missile", True, (255, 255, 255))
    screen.blit(instruction, (200, 350))

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 = over_font.render("GAME OVER", True, (255, 255, 255))
    screen.blit(over_text, (200, 250))
    
def level_up():
    levelup_text = level_up_font.render("LEVEL UP!", True, (255, 255, 255))
    screen.blit(levelup_text, (200, 250))
    
def player(x,y): 
    screen.blit(playerImg,(x, y))
    
def enemy(x,y, i):
    screen.blit(enemyImg[i],(x,y))
    
def fire_bullet(x,y):
    global bullet_state
    bullet_state = "fire"
    screen.blit(bulletImg,(x + 16, y + 10))

def fire_missile(x,y):
    global missile_state
    missile_state = "fire"
    screen.blit(missileImg, (x + 16, y + 10))
    
def explosion(x,y):
    global explosion_state
    explosion_state = "fire"
    screen.blit(explosionImg, (x,y))
    
    
def create_enemies(new_enemies):
    global num_of_enemies
    enemy_image = pygame.image.load('ufo.png')
    for i in range(new_enemies):
        enemyImg.append(enemy_image)
        enemyX.append(random.randint(0, 750))
        enemyY.append(random.randint(50, 200))
        enemyX_change.append(0.5)
        enemyY_change.append(40)
    num_of_enemies += new_enemies
    
    
def isCollision(enemyX, enemyY, bulletX, bulletY):
    distance = math.sqrt((math.pow(enemyX-bulletX,2)) + (math.pow(enemyY-bulletY,2)))
    if distance < 27:
        return True
    else:
        return False

def isCollision2(enemyX, enemyY, missileX, missileY):
    distance2 = math.sqrt((math.pow(enemyX-missileX,2)) + (math.pow(enemyY-missileY,2)))
    if distance2 < 27:
        return True
    else:
        return False

def isCollision3(enemyX, enemyY, explosionX, explosionY):
    distance3 = math.sqrt((math.pow(enemyX-explosionX,2)) + (math.pow(enemyY-explosionY, 2)))
    if distance3 < 128:
        return True
    else:
        return False
    
running = True
while running:
    
    screen.fill((0, 0, 0))
    
    screen.blit(background,(0,0))
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
            running = False

            
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_change = -1
            if event.key == pygame.K_RIGHT:
                playerX_change = 1
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0
            if event.key == pygame.K_SPACE:
                if bullet_state == "ready":
                    bullet_sound = mixer.Sound('laser.wav')
                    bullet_sound.play()
                    bulletX = playerX
                    fire_bullet(bulletX,bulletY)
            if event.key == pygame.K_m:
                if score_value >= 35:
                    if missile_state == "ready":
                        missile_sound = mixer.Sound('laser.wav')
                        missile_sound.play()
                        missileX = playerX
                        fire_missile(missileX,missileY)
            if event.key == pygame.K_n:
                if score_value >= 35:
                    if missile_state == "fire":
                        explosion_state = "fire"
                        explosion_Sound.play()
                        explosionX = missileX
                        explosionY = missileY
                        missile_state = "ready"
                        missileX = bulletX
                        missileY = bulletY
                        
                        
                

    
    playerX += playerX_change
    
    if playerX <= 0:
        playerX = 0
    elif playerX >= 768:
        playerX = 768

    
    for i in range(num_of_enemies):
        
        
        if enemyY[i] > 440:
            for j in range(num_of_enemies):
                enemyY[j] = 2000
                
            game_over_text()
            break
        
        
        enemyX[i] += enemyX_change[i]
        if enemyX[i] <= 0:
            enemyX_change[i] = 0.5
            enemyY[i] += enemyY_change[i]
        elif enemyX[i] >= 768:
            enemyX_change[i] = -0.5
            enemyY[i] += enemyY_change[i]
            
            
        collision = isCollision(enemyX[i], enemyY[i], bulletX, bulletY)
        if collision:
            explosion_Sound.play()
            
            bulletY = 480
            bullet_state = "ready"
            score_value += 1
            print(f"score = {score_value}")
            enemyX[i] = random.randint(50, 768)
            enemyY[i] = random.randint(50, 200)
        
        collision2 = isCollision2(enemyX[i], enemyY[i], missileX, missileY)
        if collision2:
            explosion_Sound = mixer.Sound('explosion.wav')
            explosion_Sound.play()
            missileY = 480
            missile_state = "ready"
            score_value += 1
            print(f"score = {score_value}")
            enemyX[i] = random.randint(50, 768)
            enemyY[i] = random.randint(50, 200)
        
        enemy(enemyX[i], enemyY[i], i)
        
    
    
    if bulletY <= 0:
        bulletY = 480
        bullet_state = "ready"
    if bullet_state == "fire":
        fire_bullet(bulletX,bulletY)
        bulletY -= bulletY_change
    
    if missileY <= 0:
        missileY = 480
        missile_state = "ready"
    if missile_state == "fire":
        fire_missile(missileX, missileY)
        missileY -= missileY_change
    
    
    player(playerX, playerY)
    
    show_score(textX, textY)
    
    if score_value == 20:
        create_enemies(4)
        score_value += 1
    if score_value == 21:
        level_up()
    
    if score_value == 35:
        level_up()
        missile_instructions()
        
    
    if score_value == 50:
        create_enemies(5)
        score_value += 1
    if score_value == 51:
        level_up()

    pygame.display.update()

I don't receive any error messages, and the game doesn't crash, it simply continues as if the missile was never there, and the missile is also available for use as soon as it has been detonated.

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
  • I noticed that in one of the lines, I defined score_value as 34. This was for testing the missile before I couldn't find any solutions. Originally, score_value is meant to start at 0. – T3CHN0BL4ST Dec 31 '21 at 06:47
  • `isCollision3` and `explosion` is never called. – Rabbid76 Dec 31 '21 at 08:13

0 Answers0