How to treat a function value as an existing variable?

Asked

Viewed 28 times

0

I’m making a simple game, just to test the Pygame library. It turns out that as in the game I would have several objects I found it more feasible to create a function to move them:

def mover(objeto,direcao,velocidade):
if direcao == 'dir':
    objeto = (objeto + int(velocidade))
if direcao == 'esq':
    objeto = (objeto - int(velocidade))
if direcao == 'cima':
    objeto = (objeto - int(velocidade))
if direcao == 'baixo':
    objeto = (objeto + int(velocidade))

Where "object" is where I place the variable that holds the position of the object I’m referring to.

I created a ball and to store its position I created the variable "y_bola", and to move it I simply increase, or decrease this value. The problem is that when I put "y_ball" in the "move" function it takes the value of "y_ball" and not the variable itself.

I wanted to know how to update the value of the variable (y_ball) inside the function.

Here follows the whole code:

import pygame, time
pygame.init()

# Configurando a janela
tela = pygame.display.set_mode((400,300))
pygame.display.set_caption('Meu Jogo!')

# Preparando para inciar
jogando = True
 #configurando cores
branco = (255,255,255)
preto = (0,0,0)
vermelho = (255,0,0)
verde = (0,255,0)
azul = (0,0,255)
 #valores incicias
y_bola = (1890)
direcao = True

# Funções e procedimentos
def mover(objeto,direcao,velocidade):
    if direcao == 'dir':
        objeto = (objeto + int(velocidade))
    if direcao == 'esq':
        objeto = (objeto - int(velocidade))
    if direcao == 'cima':
        objeto = (objeto - int(velocidade))
    if direcao == 'baixo':
        objeto = (objeto + int(velocidade))

# Iniciando
while jogando == True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            jogando = False
    
    # Desenhando atores e objetos
    tela.fill(branco)
     #bola subindo
    if direcao == True:
        y_bola = (y_bola - 7)
        cor = (azul)
        if y_bola < 50:
            direcao = False
            cor = (vermelho)
     #bola descendo
    else:
        y_bola = (y_bola + 17)
        if y_bola > 1870:
            direcao = True
    pygame.draw.circle(tela,cor,(550,y_bola),70)
    pygame.display.update()

pygame.quit()```

1 answer

0

The ideal solution would be to create an object to store the position and other attributes of the balls, for example:

VERMELHO = (255, 0, 0,)

class Bola:
    def __init__(self, x, y, tamanho, cor):
        self.x = x
        self.y = y
        self.tamanho = tamanho
        self.cor = cor

Then you can create it using something like:

bola = Bola(0, 0, 50, VERMELHO)

To access the values "inside" as bola.x, bola.y, bola.tamanho and bola.cor, for example:

>>> print(bola.x)
0
>>> bola.y = 100

Hence the drive routine could be placed in the main loop (there inside the while):


    CIMA = 1
    BAIXO = 2
    PASSO = 5

    ALTURA = 500
    LARGURA = 500

    DIRECAO = random.choice([CIMA, BAIXO])

    tela = pygame.display.set_mode((LARGURA, ALTURA))

    while True:
        ...
        if direcao == CIMA:
            bola.y -= PASSO
            if bola.y < 0:
                direcao = BAIXO
        elif direcao == BAIXO:
            bola.y += PASSO
            if bola.y > ALTURA:
                direcao = CIMA
        ...
        pygame.draw.circle(tela, bola.cor, (bola.x, bola.y), bola.tamanho)

Or even put this routine into a function that returns the new values of X and Y to the object.

And not to leave the answer too long, I prepared a version complete and commented of this code.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.