PROBLEMA Velocità elemento non lineare - Python

Tommaso Sala

Utente Attivo
870
140
CPU
Ryzen 3 1200
Dissipatore
Stock
Scheda Madre
A320m-k
HDD
SSD 240GB + HDD 2x500GB
RAM
8gb DDR4
PSU
EVGA 500w
Stavo facendo pulizia dei primissimi script e ho aperto un giochino con pygame di circa un anno e mezzo fa con un problema che ancora non mi spiego:
Codice:
import pygame

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED   = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE  = (0, 0, 255)

FPS = 25

pygame.init()
display = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Prova")

p_x = 400
p_y = 360
player_rect = pygame.Rect(p_x,p_y, 30, 40)
lead_x_change = 0
lead_y_change = 0

ascissa_colpo = 0
ordinata_colpo = 320
colpo_rett = pygame.Rect(ascissa_colpo, ordinata_colpo, 30, 40)
mov_colpo = 0

mostra_colpo = False
go_down = False
go_up = False

clock = pygame.time.Clock()
uscita = False
while uscita == False:
    
    indice = 0
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            uscita = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                uscita = True
                quit()
            if event.key == pygame.K_RIGHT:
                lead_x_change += 10
            if event.key == pygame.K_LEFT:
                lead_x_change += -10
            if event.key == pygame.K_SPACE:
                if mostra_colpo == False:                   
                    mostra_colpo = True
                    indice = 1

                    
        if event.type == pygame.KEYUP:
            if event.key in (pygame.K_RIGHT, pygame.K_LEFT):
                lead_x_change = 0
            if event.key == pygame.K_SPACE:
                mov_colpo = 0

        if mostra_colpo:
            if ordinata_colpo > 10:
                mov_colpo -= 10
            if ordinata_colpo < 50:
                mov_colpo += 10
                
    player_rect.x += lead_x_change
    player_rect.y += lead_y_change
    colpo_rett.y += mov_colpo   
    
    
    try:
        if indice == 1:
            colpo_rett.x = player_rect.x
    except NameError:
        pass
    


    

    display.fill((86, 170, 239))
    pygame.draw.rect(display, GREEN, [0, 400, 800, 800])
    pygame.draw.rect(display, RED, player_rect)

    if mostra_colpo:
        pygame.draw.rect(display, BLACK, colpo_rett)
        indice += 1
    pygame.display.update()
    clock.tick(FPS)

Sostanzialmente alla pressione di barra spaziatrice crea un rettangolo nero che dovrebbe salire e scendere ma vedo che la sua velocità (che dovrebbe essere 10px per 1/25 di secondo) non è costante ma varia se premo o meno le freccette di direzione. Senza considerare che non inizia a cadere a 50px dal bordo ma fa niente.
Anche perché sennò dovrei sistemare tutto il codice (a partire dalla questione dell'indice che fa abbastanza schifo). Insomma volevo solo capire, perché ancora non mi spiego questo problema.
 

pabloski

Utente Èlite
2,868
916
Sarebbe strano il contrario visto che

Python:
            if event.key == pygame.K_RIGHT:
                lead_x_change += 10
            if event.key == pygame.K_LEFT:
                lead_x_change += -10
 

Tommaso Sala

Utente Attivo
870
140
CPU
Ryzen 3 1200
Dissipatore
Stock
Scheda Madre
A320m-k
HDD
SSD 240GB + HDD 2x500GB
RAM
8gb DDR4
PSU
EVGA 500w
Sarebbe strano il contrario visto che

Python:
            if event.key == pygame.K_RIGHT:
                lead_x_change += 10
            if event.key == pygame.K_LEFT:
                lead_x_change += -10
EDIT: un momento: in quale parte del codice c'è un nesso tra lead_x_change e mov_colpo (cioè il suo spostamento per fps)?
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
EDIT: un momento: in quale parte del codice c'è un nesso tra lead_x_change e mov_colpo (cioè il suo spostamento per fps)?

Qui

Python:
player_rect.x += lead_x_change
player_rect.y += lead_y_change

Se all'inizio ad ogni iterazione del while si sposta di 10, dopo aver premuto la freccetta destra si sposterà di 20.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!