Home > Mobile >  Increse number on click in pygame
Increse number on click in pygame

Time:12-05

I am trying to create a scoring system. So if the user clicks numbers, player 1 gets 1 point and if they click letter player 2 gets 1 point

import pygame
import pygame.freetype
import random

pygame.init()
pygame.font.init()

screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)  # Fullscreen

Here I have created a variable to store number and changed it to display on screen.

number = 0
str_number = str(number)

def text():
game_font = pygame.freetype.SysFont("monospace", 45)
text_surface, rect = game_font.render(str_number, (0, 0, 0))
screen.blit(text_surface, (250, 700))

game_font = pygame.freetype.SysFont("monospace", 45)
text_surface, rect = game_font.render(str_number, (0, 0, 0))
screen.blit(text_surface, (1300, 700))

In my main loop, I tried to increase the number by one whenever the user press the key. but it is not working.

running = True
while running:
screen.fill((255, 194, 102))  # RGB

    for event in pygame.event.get():  # Event handler
    ...

      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_1 or event.key == pygame.K_b and len(cards) > 0:
            cards.pop(0)
            number  = 1
        if event.key == pygame.K_2 or event.key == pygame.K_n and len(cards) > 1:
            cards.pop(1)
            number  = 1
        if event.key == pygame.K_3 or event.key == pygame.K_m and len(cards) > 2:
            cards.pop(2)
            number  = 1

text()
pygame.display.update()

CodePudding user response:

The rendered text does not magically change when you change the number. You have to re-render the text after increasing the number.

Do not create the pygame.font.Font object in every frame and do not render the text in every frame. Create the text Surface once at the begin of the program. Just blit the text Surface in every frame:

Simplify the code with functions. e.g.:

game_font = pygame.freetype.SysFont("monospace", 45)
text_surface, rect = game_font.render(str(number), (0, 0, 0))

def text():
    screen.blit(text_surface, (250, 700))
def increment_score():
    global number
    number  = 1
    return game_font.render(str(number), (0, 0, 0))
while running:
    # [...]

    for event in pygame.event.get():
        # [...]

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_1 or event.key == pygame.K_b and len(cards) > 0:
                cards.pop(0)
                text_surface, rect = increment_score()

            if event.key == pygame.K_2 or event.key == pygame.K_n and len(cards) > 1:
                cards.pop(1)
                text_surface, rect = increment_score()

            if event.key == pygame.K_3 or event.key == pygame.K_m and len(cards) > 2:
                cards.pop(2)
                text_surface, rect = increment_score()
  • Related