Pygame (Python Game Development) Tutorial - 67 - Firing

0 Tom Stashkevich · May 24, 2015
Hello everyone, I'm trying to follow that tutorial in the title but I'm having an issue that I can't fix.
I've made that fire function but it only works when I move my mouse cursor or I keep pressing buttons and don't automatically draw the circles parabola by one SPACE button click. Can anyone answer what is wrong in the code? I'm using python 2.7 and pygame version for it.


import pygame
import time
import random

pygame.init()

white = (255,255,255)
black = (0,0,0)
red = (200,0,0)
green = (34,177,76)
yellow = (200,200,0)
light_green = (0,255,0)
light_yellow = (255,255,0)
light_red = (255,0,0)

display_width = 800
display_height = 600


tankWidth = 40
tankHeight = 20

turretWidth = 5
wheelWidth = 5



gameDisplay = pygame.display.set_mode((800,600))
pygame.display.set_caption('Tankai')

#icon = pygame.image.load('apple.png')
#pygame.display.set_icon(icon)

#img = pygame.image.load('snakehead.png')
#appleimg = pygame.image.load('apple.png')


clock = pygame.time.Clock()
FPS = 30



smallfont = pygame.font.SysFont("Verdana", 15)
medfont = pygame.font.SysFont("Verdana", 25)
largefont = pygame.font.SysFont("Verdana", 50)


def pause():

    paused = True
    
    message_to_screen("Pauze",
                          black,
                          -100,
                          size="large")

    message_to_screen("Spauskite C, noredami testi, arba Q, noredami iseiti!",
                          black,
                          25)
    pygame.display.update()

    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_c:
                    paused = False

                elif event.key == pygame.K_q:
                    pygame.quit()
                    quit()

        #gameDisplay.fill(white)
        
        clock.tick(5)

def score(score):
    text = smallfont.render("Taskai: "+str(score), True ,black)
    gameDisplay.blit(text, [0,0])



def barrier(xlocation,randomHeight, barrier_width):
    

    pygame.draw.rect(gameDisplay, black, [xlocation, display_height-randomHeight, barrier_width,randomHeight])
  
    
def fireShell(xy,tankx,tanky,turPos):
    fire = True
    

    startingShell = list(xy)
    print("FIRE",xy)

    while fire:
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            
            print (startingShell[0],startingShell[1])
        
            pygame.draw.circle(gameDisplay, red, (startingShell[0],startingShell[1]),5)
            
            
            startingShell[0] -= (12 - turPos)*2
            
            startingShell[1] += int((((startingShell[0]-xy[0])*0.008)**2) - (turPos+turPos/(12-turPos)))
            if startingShell[1] > display_height:
                fire = False
            pygame.display.update()
            clock.tick(60)

    
def game_intro():
    
    intro = True

    while intro:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_c:
                    intro = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    quit
        
        gameDisplay.fill(white)
        message_to_screen("Sveiki atvyke i Tankus!",
                          green,
                          -80,
                          size="large")
        
        message_to_screen("Jus turite saudyti ir naikinti",
                          black,
                          10)

        message_to_screen("priesa, kol jis jusu nesunaikino",
                          black,
                          50)

        #message_to_screen(" noredami zaisti, P - pauze arba Q, kad isetumete.",
                          #black,
                          #180)

        cur = pygame.mouse.get_pos()

        if 150+100 > cur[0] > 150 and 500+50 > cur[1] > 500:
            pygame.draw.rect(gameDisplay,light_green,(150,500,100,50))
        else:
            pygame.draw.rect(gameDisplay,green,(150,500,100,50))

        
        

        button("Zaisti", 150,500,100,50, green, light_green, action="play")
        button("Valdymas", 350,500,100,50, yellow, light_yellow, action="controls")
        button("Iseiti", 550,500,100,50, red, light_red, action="quit")
        

        pygame.display.update()
        clock.tick(15)


def text_to_button(msg, color, buttonx, buttony, buttonwidth, buttonheight, size = "small"):
    textSurf, textRect = text_objects(msg,color,size)
    textRect.center = ((buttonx+(buttonwidth/2)),buttony+(buttonheight/2)),
    gameDisplay.blit(textSurf, textRect)
        
def text_objects(text,color,size):
    if size == "small":
        textSurface = smallfont.render(text, True, color)
    if size == "medium":
        textSurface = medfont.render(text, True, color)
    if size == "large":
        textSurface = largefont.render(text, True, color)

        
    return textSurface, textSurface.get_rect()

def message_to_screen(msg,color, y_displace=0, size = "small"):
    textSurf, textRect = text_objects(msg,color, size)
    textRect.center = (display_width / 2), (display_height / 2)+y_displace
    gameDisplay.blit(textSurf, textRect)

def tank(x,y,turPos):
    x = int(x)
    y = int(y)


    possibleTurrets = [(x-27, y-2),
                        (x-26, y-5),
                       (x-25, y-8),
                       (x-23, y-12),
                       (x-20, y-14),
                       (x-18, y-15),
                       (x-15, y-17),
                       (x-13, y-19),
                       (x-11, y-21),
                       ]


    
    pygame.draw.circle(gameDisplay, black, (x,y),int(tankHeight/2))
    pygame.draw.rect(gameDisplay, black, (x-tankHeight, y, tankWidth, tankHeight))


    pygame.draw.line(gameDisplay, black, (x,y), possibleTurrets[turPos], turretWidth)
   

    startX = x + tankWidth-3
    for x in range(8):
        pygame.draw.circle(gameDisplay, black, (startX-20, y+20), wheelWidth)
        startX -=5    

    return possibleTurrets[turPos]
    
def game_controls():


    
    gcont = True

    while gcont:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        
        
        gameDisplay.fill(white)
        message_to_screen("Valdymas",
                          green,
                          -80,
                          size="large")
        
        message_to_screen("Sauti: Tarpas",
                          black,
                          10)

        message_to_screen("Judinti patranka aukstin ir zemyn rodyklemis",
                          black,
                          50)

        message_to_screen("Judinti tanka: i kaire ir i desine rodyklemis",
                          black,
                          90)
        message_to_screen("Pauze:P",
                          black,
                          130)

        cur = pygame.mouse.get_pos()

        if 150+100 > cur[0] > 150 and 500+50 > cur[1] > 500:
            pygame.draw.rect(gameDisplay,light_green,(150,500,100,50))
        else:
            pygame.draw.rect(gameDisplay,green,(150,500,100,50))

        
        

        button("Zaisti", 150,500,100,50, green, light_green, action="play")
        button("Meniu", 350,500,100,50, yellow, light_yellow, action="main")
        button("Iseiti", 550,500,100,50, red, light_red, action="quit")
        

        pygame.display.update()
        clock.tick(15)

def button(text, x, y, width, height, inactive_color, active_color, action = None):
    cur = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    if x + width > cur[0] > x and y + height > cur[1] > y:
        pygame.draw.rect(gameDisplay, active_color, (x,y,width,height))
        if click[0] == 1 and action != None:
            if action == "quit":
                pygame.quit()

            if action == "controls":
                game_controls()

            if action == "play":
                gameLoop()
                
            if action == "main":
                game_intro()
            
    else:
        pygame.draw.rect(gameDisplay, inactive_color, (x,y,width,height))

    text_to_button(text,black,x,y,width,height)


        
def gameLoop():
    gameExit = False
    gameOver = False
    FPS = 15

    barrier_width = 50

    mainTankX = display_width * 0.9
    mainTankY = display_height * 0.9
    tankMove = 0

    currentTurPos = 0
    changeTur = 0

    xlocation = (display_width/2) + random.randint(-0.2*display_width, 0.2*display_width)
    randomHeight = random.randrange(display_height*0.1,display_height*0.6)
    

    while not gameExit:
        gameDisplay.fill(white)
        gun = tank(mainTankX,mainTankY,currentTurPos)

        if gameOver == True:
            message_to_screen("Zaidimas baigtas",
                              red,
                              y_displace=-50,
                              size="large")
            
            message_to_screen("spauskite C, kad zaistumete dar karta arba Q, kad iseitumete",
                              black,
                              50,
                              size="medium")
            pygame.display.update()
            

        while gameOver == True:
            #gameDisplay.fill(white)
            

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    gameOver = False
                    
                    gameExit = True
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        gameExit = True
                        gameOver = False
                    if event.key == pygame.K_c:
                        gameLoop()
                            
        for event in pygame.event.get():
            
            if event.type == pygame.QUIT:
                gameExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    tankMove = -5
                    
                elif event.key == pygame.K_d:
                    tankMove = 5
                    
                    
                elif event.key == pygame.K_w:
                    changeTur = 1
                elif event.key == pygame.K_s:
                    changeTur = -1
                    
                    
                if event.key == pygame.K_LEFT:
                    tankMove = -5
                    
                elif event.key == pygame.K_RIGHT:
                    tankMove = 5
                    
                    
                elif event.key == pygame.K_UP:
                    changeTur = 1
                   
                elif event.key == pygame.K_DOWN:
                    changeTur = -1
                    
                elif event.key == pygame.K_p:
                    pause()

                elif event.key == pygame.K_SPACE:
                    fireShell(gun,mainTankX,mainTankY,currentTurPos)

                   
                    

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_a or event.key == pygame.K_d:
                    tankMove = 0

                if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_w or event.key == pygame.K_s:
                    changeTur = 0
           
        
        mainTankX += tankMove
        
        currentTurPos += changeTur

        if currentTurPos > 8:
            currentTurPos = 8
        elif currentTurPos < 0:
            currentTurPos = 0

        if mainTankX - (tankWidth/2) < xlocation+barrier_width:
            mainTankX += 5

    
        
        
        barrier(xlocation,randomHeight,barrier_width,)
        pygame.display.update()
        clock.tick(FPS)

    pygame.quit()
    quit()
    
game_intro()
gameLoop()

Post a Reply

Replies

Oldest  Newest  Rating
0 Tom Stashkevich · May 25, 2015
OK, I've already found where the bug was. I needed to delete the quit part in Fireshell defining:
for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
  • 1

Python

106,959 followers
About

This section is all about snakes! Just kidding.

Links
Moderators
Bucky Roberts Administrator