2

I am just new in pygame, this is my code, pieces. I have main button function, and in gameloop i i successfully create a interactive button, and i don't know exactly, how can i press the button in gameloop ("Start playing") and fill my gameDisplay, for example...white color. Thanks in advance ...........................................................................................................................................................

import pygame,sys


pygame.init()
#############
pygame.mixer.music.load('Invincible.mp3')
pygame.mixer.music.play()

#############

display_width = 800
display_height = 600

black = (0,0,0)
white = (255,255,255)

red = (200,0,0)
green = (0,200,0)

bright_red = (255,0,0)
bright_green = (0,255,0)

block_color = (53,115,255)


gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('One Day After')
clock = pygame.time.Clock()

gameIcon = pygame.image.load('gameicon.jpg')
pygame.display.set_icon(gameIcon)

pause = False

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()


def GameOver():
    ####################################
    pygame.mixer.Sound.play("smb_gameover.wav")
    pygame.mixer.music.stop()
    ####################################
    largeText = pygame.font.SysFont("comicsansms",115)
    TextSurf, TextRect = text_objects("Game Over", largeText)
    TextRect.center = ((display_width/2),(display_height/2))
    gameDisplay.blit(TextSurf, TextRect)


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



        button("Play Again",150,450,100,50,green,bright_green,game_loop)
        button("Quit",550,450,100,50,red,bright_red,quitgame)

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

def button(msg,x,y,w,h,ic,ac,action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(gameDisplay, ac,(x,y,w,h))
        if click[0] == 1 and action != None:
            pygame.mixer.music.stop()
            action()

    else:
        pygame.draw.rect(gameDisplay, ic,(x,y,w,h))
    smallText = pygame.font.SysFont("comicsansms",20)
    textSurf, textRect = text_objects(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    gameDisplay.blit(textSurf, textRect)


def quitgame():
    pygame.quit()
    sys.exit()
    quit()

def unpause():
    global pause
    pygame.mixer.music.unpause()
    pause = False


def paused():
    ############
    pygame.mixer.music.pause()
    #############
    largeText = pygame.font.SysFont("comicsansms",115)
    TextSurf, TextRect = text_objects("Paused", largeText)
    TextRect.center = ((display_width/2),(display_height/2))
    gameDisplay.blit(TextSurf, TextRect)


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


        button("Continue",150,450,100,50,green,bright_green,unpause)
        button("Quit",550,450,100,50,red,bright_red,quitgame)

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


def game_intro():

    intro = True

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

        pilt1 = pygame.image.load('apoc2.jpg').convert()
        gameDisplay.blit(pilt1, [0,0])
        pygame.display.flip()


        button("Start",150,450,100,50,green,bright_green,game_loop)
        button("Quit",550,450,100,50,red,bright_red,quitgame)

        pygame.display.update()

def game_loop():
    global pause

    gameExit = False

    while not gameExit:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
                quit()
        gameDisplay.fill(white)
        gameDisplaypic = pygame.image.load('back.jpg').convert()
        gameDisplay.blit(gameDisplaypic, [0,0])
        tekst = "This game will go as far as you choose!"
        meie_font = pygame.font.SysFont("Arial", 36)
        teksti_pilt = meie_font.render(tekst, False, (50,50,155))
        gameDisplay.blit(teksti_pilt, (100, 250))
        tekst2 = "You are the smith of your destiny"
        meie_font = pygame.font.SysFont("Arial", 36)
        teksti_pilt = meie_font.render(tekst2, False, (50,50,155))
        gameDisplay.blit(teksti_pilt, (100, 400))
        button("Start playing",300,500,150,50,green,bright_green)
        pygame.display.update()









game_intro()
game_loop()
pygame.quit()
quit()
Vlad Paskevits
  • 388
  • 2
  • 12
  • maybe in `game_loop` when you press button you should start another function - ie. `game_main_loop` - with next `while` loop. Or you have to use state variables ie. `state_display_text = True/False`, `state_display_white_color = True/False` to control which elements to display - and you can change this variables using buttons. – furas Dec 11 '17 at 19:43
  • Where did you find the code for the `button` function? A lot of people keep posting this function here and it often causes problems. Check out this [answer](https://stackoverflow.com/a/47664205/6220679) for cleaner button solutions. – skrx Dec 12 '17 at 02:39
  • Could you clarify what exactly you're trying to do? Do you just want to change the background color or switch from one scene to another (from the intro scene to the main game scene)? – skrx Dec 12 '17 at 02:47

2 Answers2

3

I hope this program will help.

import pygame,sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((400,400))
white=(255,255,255)
blue=(0,0,255)
bright_red = (255,0,0)
red = (200,0,0)
black=(0,0,0)
color=white

def changecolor(newcolor):
    global color
    color=newcolor

while True:
    screen.fill(color)

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == MOUSEBUTTONUP:
            # Whenever somebody clicks on the screen the color
            # will change from the initial color to the color
            # value you send to the function. Using this you could
            # make it specifically for your button. Like calling
            # the change color function whenever the button is clicked.
            changecolor(blue)

    pygame.display.update()
EHM
  • 877
  • 1
  • 7
  • 28
2

You can use state variables (True/False) to control which element to display and you can change those varibles using button.

In example I have

    display_text = True
    display_button_1 = True
    display_button_2 = False

to control when display text and two buttons.

First button change values and it hides text and first button, and it shows second button.

There is one problem - your button function is ugly and it use get_buttons() so when I hold pressed button and I remove one button and put another in the same place then it automatically click second button. You should use event.type == MOUSEBUTTONUP (as suggest @Hilea) to fix this.

import pygame
import sys # every import in separated line

# --- constants ---

display_width = 800
display_height = 600

black = (0,0,0)
white = (255,255,255)

red = (200,0,0)
green = (0,200,0)

bright_red = (255,0,0)
bright_green = (0,255,0)

block_color = (53,115,255)

# --- functions ---

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def button(msg,x,y,w,h,ic,ac,action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(gameDisplay, ac,(x,y,w,h))
        if click[0] == 1 and action != None:
            pygame.mixer.music.stop()
            action()

    else:
        pygame.draw.rect(gameDisplay, ic,(x,y,w,h))
    smallText = pygame.font.SysFont("comicsansms",20)
    textSurf, textRect = text_objects(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    gameDisplay.blit(textSurf, textRect)

def quitgame():
    pygame.quit()
    sys.exit()
    quit()

def hide_text():
    global display_text
    global display_button_1
    global display_button_2

    display_text = False
    display_button_1 = False
    display_button_2 = True

def game_loop():
    global display_text
    global display_button_1
    global display_button_2

    gameExit = False
    display_text = True
    display_button_1 = True
    display_button_2 = False

    meie_font = pygame.font.SysFont("Arial", 36)

    tekst = "This game will go as far as you choose!"
    teksti_pilt = meie_font.render(tekst, False, (50,50,155))

    tekst2 = "You are the smith of your destiny"
    teksti_pilt = meie_font.render(tekst2, False, (50,50,155))

    while not gameExit:

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

        gameDisplay.fill(white)

        if display_text:
            gameDisplay.blit(teksti_pilt, (100, 250))
            gameDisplay.blit(teksti_pilt, (100, 400))

        if display_button_1:
            button("Start playing", 300,500,150,50,green,bright_green, hide_text)

        if display_button_2:
            button("Exit", 300,100,150,50,green,bright_green, pygame.quit)

        pygame.display.update()

# --- main ---

pygame.init()

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('One Day After')

clock = pygame.time.Clock()

pause = False

game_loop()
pygame.quit()
furas
  • 134,197
  • 12
  • 106
  • 148