簡體   English   中英

如果語句在一段時間后停止工作並且字體未呈現

[英]If Statement stops working after sometime and font not rendering

我正在使用 VSCode 使用 pygame 和 python 3.10.0 創建一個游戲,一切正常,但是這個 if 語句在一段時間后停止工作並且字體不繪制,但我無法確定問題所在,對於 if 語句它通常運行到 10 或 11 分,但它可以更快,如 2:

 if player.rect.colliderect(food):
    pygame.sprite.Sprite.kill(food)
    food.rect.x = random.randrange(20, 1700)
    food.rect.y = random.randrange(20, 860)
    all_sprites_list.add(food)
    score += 1
    print(score)

整個代碼:

import pygame
import sys
import time
import random
import ctypes

from ctypes import wintypes
from pygame import sprite
from pygame.draw import rect
from pygame.event import pump, wait
from pygame import font
pygame.font.init()

myappid = 'elementalstudios.snake.Alpha 0_1' # arbitrary string
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)


#------ Initialize Variables------#
# Player
player_width = 20
player_height = 20
# Food
food_width = 10
food_height = 10
# Colours
seafoam_gr = (159, 226, 191)
black = (0, 0, 0)
blue = (0, 0, 255)
red = (255, 0, 0)
green = (0, 255, 0)
white = (255, 255, 255)
# Score 
score = 0

#------ Score Font Initialize ------#
font = pygame.font.Font(None, 50)
text = font.render("Score:", False, white, None)

#------Sprites Class------#
class Sprite(pygame.sprite.Sprite):
    def __init__(self, color, height, width):
        super().__init__()

        self.image = pygame.Surface([width, height])
        self.image.fill(seafoam_gr)
        self.image.set_colorkey(black)

        pygame.draw.rect(self.image,
                         color,
                         pygame.Rect(0, 0, width, height))
  
        self.rect = self.image.get_rect()

    def moveRight(self, pixels):
        self.rect.x += pixels

    def moveLeft(self, pixels):
        self.rect.x -= pixels

    def moveUp(self, speed):
        self.rect.y -= speed * speed / 5

    def moveDown(self, speed):
        self.rect.y += speed * speed / 5

#------ Font Class ------#
def create_font(t,s = 24, colour_font = white, bold = False, italic = False):
    font = pygame.font.Font("prstart.ttf", s, bold, italic)
    text = font.render(t, True, colour_font)
    return text

#------ Initialize Pygame and Window------#
pygame.init()

icon = pygame.image.load('Icon.ico')
pygame.display.set_icon(icon)
gameDisplay = pygame.display.set_mode((1920,1080), pygame.FULLSCREEN)
#rect = pygame.Rect( * gameDisplay.get_rect().center, 0, 0).inflate(100, 100)
pygame.display.set_caption("Blocky")
gameDisplay.fill(black)
clock = pygame.time.Clock()
running = True

#------Initialize Sprites------#
all_sprites_list = pygame.sprite.Group()
player = Sprite(seafoam_gr, player_height, player_width)
food = Sprite(red, food_height, food_width)
player.rect.x = 960
player.rect.y = 540
food.rect.x = 20 #random.randrange(20, 1800)
food.rect.y = 30 #random.randrange(20, 1050)

#------Add Sprites to sprite list------#
all_sprites_list.add(player)
all_sprites_list.add(food)

clock = pygame.time.Clock()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False

    #------Eating------#
    if player.rect.colliderect(food):
        pygame.sprite.Sprite.kill(food)
        food.rect.x = random.randrange(20, 1700)
        food.rect.y = random.randrange(20, 860)
        all_sprites_list.add(food)
        score += 1
        print(score)

    #------ Score Draw ------#
    text_rect = text.get_rect()
    text_rect.center = (100, 150)

    gameDisplay.blit(text, text_rect)
    #------Key Movement------#
    keys = pygame.key.get_pressed()
    # Move Left
    if keys[pygame.K_a]:
        player.moveLeft(3)
        if keys[pygame.K_LCTRL]:
            player.moveLeft(5)
    if keys[pygame.K_LEFT]:
        player.moveLeft(3)
        if keys[pygame.K_LCTRL]:
            player.moveLeft(5)
    # Move Right
    if keys[pygame.K_d]:
        player.moveRight(5)
        if keys[pygame.K_LCTRL]:
            player.moveRight(5)
    if keys[pygame.K_RIGHT]:
        player.moveRight(3)
        if keys[pygame.K_LCTRL]:
            player.moveRight(5)
    # Move Down
    if keys[pygame.K_s]:
        player.moveDown(3)
        if keys[pygame.K_LCTRL]:
            player.moveDown(5)
    if keys[pygame.K_DOWN]:
        player.moveDown(3)
        if keys[pygame.K_LCTRL]:
            player.moveDown(5)
    # Move Up
    if keys[pygame.K_w]:
        player.moveUp(3)
        if keys[pygame.K_LCTRL]:
            player.moveUp(5)
    if keys[pygame.K_UP]:
        player.moveUp(3)
        if keys[pygame.K_LCTRL]:
            player.moveUp(5)

    all_sprites_list.update()
    gameDisplay.fill(black)
    all_sprites_list.draw(gameDisplay)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quit()

沒必要kill食object。 改變食物的position就足夠了。 pygame.sprite.Sprite.kill只是從所有Gorups中刪除Sprite object 。 因此,調用kill然后將 object 添加回Group是沒有意義的。

文本不顯示,因為您在清除顯示之前繪制它。 pygame.Surface.fill用純色填充Surface 之前繪制的所有內容都將被清除。 fill后對文本進行blit
如果分數發生變化,您將不得不再次渲染文本Surface

我建議簡化移動播放器的代碼。 請參閱按住鍵時如何進行精靈移動

class Sprite(pygame.sprite.Sprite):
    def __init__(self, color, height, width):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
        self.image.set_colorkey(black)
        self.rect = self.image.get_rect()

    def move(self, move_x, move_y):
        self.rect.x += move_x
        self.rect.y += move_y * move_y / 5 * (-1 if move_y < 0 else 1)
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False

    if player.rect.colliderect(food):
        food.rect.x = random.randrange(20, 1700)
        food.rect.y = random.randrange(20, 860)
        score += 1

        # render text
        text = font.render("Score: " + str(score), False, white, None)

    keys = pygame.key.get_pressed()
    speed = 5 if keys[pygame.K_LCTRL] else 3
    move_x = speed * ((keys[pygame.K_d] or keys[pygame.K_RIGHT]) - (keys[pygame.K_a] or keys[pygame.K_LEFT]))
    move_y = speed * ((keys[pygame.K_s] or keys[pygame.K_DOWN]) - (keys[pygame.K_w] or keys[pygame.K_UP]))
    player.move(move_x, move_y)

    all_sprites_list.update()
    
    gameDisplay.fill(black)

    # draw text
    gameDisplay.blit(text, text.get_rect(center = (100, 150)))
    
    all_sprites_list.draw(gameDisplay)
    pygame.display.flip()

    clock.tick(60)

pygame.quit()
quit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM