运行 在函数 Pygame 之外时出现字体未初始化错误
Font Not Initialised Error When Running Outside Of Function Pygame
我目前正在 pygame 中编写一个国际象棋程序,并且我试图在有人做出无效移动时在屏幕上显示文本。但是,当我让代码在屏幕上绘制片段的循环内初始化字体时,每次有人犯错时都需要 8 秒来初始化字体,从而使体验变得迟钝和缓慢。
我现在得到的代码在程序顶部进行了字体初始化,但随后错误 字体尚未初始化 不断出现,我不知道为什么。在这个问题上的任何帮助都会很棒!
顺便用了python和pygame模块写的
import pygame as p
from Kess import chessEngine
WIDTH = HEIGHT = 512 # 512 is a power of 2 and is easily divisible by 8 for the squares of the ui
DIMENSION = 8
SQ_SIZE = HEIGHT // DIMENSION
MAX_FPS = 15 # for animations - may be able to delete later
IMAGES = {}
WHITE = (237, 240, 207)
BLACK = (108, 155, 79)
TEXT_COLOUR = (0, 0, 0)
MOVING = False
invalid = False
gs = chessEngine.GameState()
font = p.font.SysFont('timesnewromanbold', 32)
'''
Global dictionary of images which will be called once. Can contain multiple image sets for theme
customisation
'''
def load_images():
pieces = ["bR", "bN", "bB", "bQ", "bK", "bP",
"wR", "wN", "wB", "wQ", "wK", "wP"]
for piece in pieces:
IMAGES[piece] = p.transform.scale(p.image.load("images/" + piece + ".png"), (SQ_SIZE, SQ_SIZE))
# The p.transform.scale function scales the imported images to fit the dimensions of the square
# The for loop allows for the pieces to be imported together rather than a long list of individual calls.
def main():
global player_click_region
p.init()
# Initiates the pygame.
screen = p.display.set_mode((WIDTH, HEIGHT))
# Sets the display screen to be 512x512 as the set variables at the top of the file.
clock = p.time.Clock()
# Starts the inbuilt chess clock.
screen.fill(WHITE)
# Sets a background with a colour of white.
load_images()
running = True
# This while loop draws the black tiles on the board by alternating the beginning x value (beginning 64x64
# square coordinate) and then skipping a tile (white tile) and doing the same.
draw_pieces(screen)
square_selected = () # Keeps track of what square in what row/column the user has currently selected
player_click_region = [] # Keeps track of original square and destination square e.g. (2, 4) (4, 2)
while running:
clock.tick(60)
for event in p.event.get():
if event.type == p.QUIT:
running = False
elif event.type == p.MOUSEBUTTONDOWN:
location = p.mouse.get_pos() # Returns (x,y) pos of mouse
# print(location)
column = location[0] // SQ_SIZE
row = location[1] // SQ_SIZE
# print(row, column)
if square_selected == (row, column):
square_selected = ()
player_click_region = []
else:
square_selected = (row, column)
player_click_region.append(square_selected)
# print(piece)
if len(player_click_region) == 2:
location = p.mouse.get_pos()
piece = gs.board[player_click_region[0][0]][player_click_region[0][1]]
valid_move(piece)
destination_column = location[0] // SQ_SIZE
destination_row = location[1] // SQ_SIZE
if invalid is True:
print("INVALID MOVE: PLEASE TRY AGAIN")
else:
gs.board[destination_row][destination_column] = piece
gs.board[player_click_region[0][0]][player_click_region[0][1]] = "--"
player_click_region = []
square_selected = ()
print(gs.board)
draw_pieces(screen)
p.display.update()
# Update board using pairs of tuples...
def draw_pieces(screen):
global font
x = 1
y = 0
while y < DIMENSION:
while x < DIMENSION:
p.draw.rect(screen, BLACK, (x * SQ_SIZE, y * SQ_SIZE, SQ_SIZE, SQ_SIZE))
# Ask Mr. Clarke how to access a specific list within a class of another file and then how to get an index
# from within that list.
x += 2
if x == 9:
x = 0
else:
x = 1
y += 1
y = 0
x = 0
while y < DIMENSION:
while x < DIMENSION:
p.draw.rect(screen, WHITE, (x * SQ_SIZE, y * SQ_SIZE, SQ_SIZE, SQ_SIZE))
# Ask Mr. Clarke how to access a specific list within a class of another file and then how to get an index
# from within that list.
x += 2
if x == 9:
x = 0
else:
x = 1
y += 1
y = 0
x = 0
while y < DIMENSION:
while x < DIMENSION:
piece = gs.board[y][x]
if piece != "--":
screen.blit(IMAGES[piece], (x * SQ_SIZE, y * SQ_SIZE, SQ_SIZE, SQ_SIZE))
# Ask Mr. Clarke how to access a specific list within a class of another file and then how to get an index
# from within that list.
x += 1
x = 0
y += 1
if invalid is True:
text = font.render('INVALID MOVE', True, TEXT_COLOUR)
screen.blit(text, (HEIGHT/2, WIDTH/2))
def valid_move(piece):
global invalid
# print(gs.board[player_click_region[1][0]][player_click_region[1][1]])
invalid = False
change_x = abs(player_click_region[0][0] - player_click_region[1][0]) # abs() finds absolute value - always pos
change_y = abs(player_click_region[0][1] - player_click_region[1][1])
linear_x = player_click_region[0][0] - player_click_region[1][0]
# linear_y = player_click_region[0][1] - player_click_region[1][1]
destination_piece = gs.board[player_click_region[1][0]][player_click_region[1][1]]
print("x change", str(change_x))
print("y change", str(change_y))
if piece[0] == destination_piece[0]:
invalid = True
print("invalid 3")
if "P" in piece:
if change_x != 1 and change_x != 2:
invalid = True
else:
if player_click_region[0][0] != 6 and player_click_region[0][0] != 1:
if change_x == 2:
invalid = True
if "b" in piece:
if player_click_region[0][0] == 1:
if gs.board[player_click_region[0][0]+1][player_click_region[0][1]] != "--":
invalid = True
if linear_x > 0:
invalid = True
if "w" in piece:
if player_click_region[0][0] == 6:
if gs.board[player_click_region[0][0]-1][player_click_region[0][1]] != "--":
invalid = True
print("1")
if linear_x < 0:
invalid = True
print("2")
if invalid is False:
if change_y == 0:
if destination_piece != "--":
invalid = True
if change_y == 1:
if change_x != 1:
invalid = True
if destination_piece == "--":
invalid = True
else:
print("capturing now")
if change_y > 1:
invalid = True
if "B" in piece:
if change_x != change_y:
invalid = True
print("you don messed up boy")
else:
i = 1
if linear_x < 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0]+i][player_click_region[0][1]+i] != "--":
invalid = True
i += 1
i = 1
if linear_x > 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0]-i][player_click_region[0][1]-i] != "--":
invalid = True
if "N" in piece:
if change_x + change_y != 3:
invalid = True
if change_x > 0 and change_y > 0:
if destination_piece != "--":
print("capture_piece()")
else:
invalid = True
if "R" in piece:
if change_x > 0 and change_y > 0:
invalid = True
else:
x = 1
if change_x > 0:
for x in range(x, change_x):
print(player_click_region[0][0]+x)
if player_click_region[0][0] > player_click_region[1][0]:
print("now uve done messed up")
if gs.board[player_click_region[1][0]+x][player_click_region[1][1]] != "--":
invalid = True
else:
print(gs.board[player_click_region[0][0] + x][player_click_region[0][1]])
if gs.board[player_click_region[0][0]+x][player_click_region[0][1]] != "--":
print(gs.board[player_click_region[0][0]+x][player_click_region[0][1]])
invalid = True
x+=1
else:
for x in range(x, change_y-1):
print(player_click_region)
if player_click_region[0][1] > player_click_region[1][1]:
if gs.board[player_click_region[1][0]][player_click_region[1][1]+x] != "--":
invalid = True
else:
if gs.board[player_click_region[0][0]][player_click_region[0][1]+x] != "--":
invalid = True
x+=1
if "Q" in piece:
print(change_x, change_y)
if change_x == change_y:
print("how does this work")
i = 1
if linear_x < 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0] + i][player_click_region[0][1] + i] != "--":
invalid = True
print("invalid 2")
i += 1
i = 1
if linear_x > 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0] - i][player_click_region[0][1] - i] != "--":
invalid = True
print("invalid 1")
elif change_x + change_y == 1:
if destination_piece != "--":
print("Capture")
# Check whether the piece taken is the same colour or not
else:
print("Empty Square")
else:
print("fucked up")
if change_x > 0 and change_y > 0:
invalid = True
else:
x = 1
if change_x > 0:
for x in range(x, change_x):
if player_click_region[0][0] > player_click_region[1][0]:
if gs.board[player_click_region[1][0] + x][player_click_region[1][1]] != "--":
invalid = True
else:
if gs.board[player_click_region[0][0] + x][player_click_region[0][1]] != "--":
invalid = True
x += 1
else:
for x in range(x, change_y - 1):
print(player_click_region)
if player_click_region[0][1] > player_click_region[1][1]:
if gs.board[player_click_region[1][0]][player_click_region[1][1] + x] != "--":
invalid = True
else:
if gs.board[player_click_region[0][0]][player_click_region[0][1] + x] != "--":
invalid = True
x += 1
if "K" in piece:
if change_x > 1 or change_y > 1:
invalid = True
# To implement the images. the coordinates of the tiles are 64x64 and you can multiply them by a number for the x value
# which would then move them over a certain number of tiles (e.g. 64*3 would give 3 tiles to the right), and same for
# the y values.
main()
您必须先初始化 font
模块,然后才能使用它:
p.font.init()
font = p.font.SysFont('timesnewromanbold', 32)
或者您可以初始化所有 pygame 模块:
p.init()
font = p.font.SysFont('timesnewromanbold', 32)
或者在p.init()
之后的main
中创建font
对象:
def main():
global player_click_region
global font
p.init()
font = p.font.SysFont('timesnewromanbold', 32)
# [...]
我目前正在 pygame 中编写一个国际象棋程序,并且我试图在有人做出无效移动时在屏幕上显示文本。但是,当我让代码在屏幕上绘制片段的循环内初始化字体时,每次有人犯错时都需要 8 秒来初始化字体,从而使体验变得迟钝和缓慢。
我现在得到的代码在程序顶部进行了字体初始化,但随后错误 字体尚未初始化 不断出现,我不知道为什么。在这个问题上的任何帮助都会很棒!
顺便用了python和pygame模块写的
import pygame as p
from Kess import chessEngine
WIDTH = HEIGHT = 512 # 512 is a power of 2 and is easily divisible by 8 for the squares of the ui
DIMENSION = 8
SQ_SIZE = HEIGHT // DIMENSION
MAX_FPS = 15 # for animations - may be able to delete later
IMAGES = {}
WHITE = (237, 240, 207)
BLACK = (108, 155, 79)
TEXT_COLOUR = (0, 0, 0)
MOVING = False
invalid = False
gs = chessEngine.GameState()
font = p.font.SysFont('timesnewromanbold', 32)
'''
Global dictionary of images which will be called once. Can contain multiple image sets for theme
customisation
'''
def load_images():
pieces = ["bR", "bN", "bB", "bQ", "bK", "bP",
"wR", "wN", "wB", "wQ", "wK", "wP"]
for piece in pieces:
IMAGES[piece] = p.transform.scale(p.image.load("images/" + piece + ".png"), (SQ_SIZE, SQ_SIZE))
# The p.transform.scale function scales the imported images to fit the dimensions of the square
# The for loop allows for the pieces to be imported together rather than a long list of individual calls.
def main():
global player_click_region
p.init()
# Initiates the pygame.
screen = p.display.set_mode((WIDTH, HEIGHT))
# Sets the display screen to be 512x512 as the set variables at the top of the file.
clock = p.time.Clock()
# Starts the inbuilt chess clock.
screen.fill(WHITE)
# Sets a background with a colour of white.
load_images()
running = True
# This while loop draws the black tiles on the board by alternating the beginning x value (beginning 64x64
# square coordinate) and then skipping a tile (white tile) and doing the same.
draw_pieces(screen)
square_selected = () # Keeps track of what square in what row/column the user has currently selected
player_click_region = [] # Keeps track of original square and destination square e.g. (2, 4) (4, 2)
while running:
clock.tick(60)
for event in p.event.get():
if event.type == p.QUIT:
running = False
elif event.type == p.MOUSEBUTTONDOWN:
location = p.mouse.get_pos() # Returns (x,y) pos of mouse
# print(location)
column = location[0] // SQ_SIZE
row = location[1] // SQ_SIZE
# print(row, column)
if square_selected == (row, column):
square_selected = ()
player_click_region = []
else:
square_selected = (row, column)
player_click_region.append(square_selected)
# print(piece)
if len(player_click_region) == 2:
location = p.mouse.get_pos()
piece = gs.board[player_click_region[0][0]][player_click_region[0][1]]
valid_move(piece)
destination_column = location[0] // SQ_SIZE
destination_row = location[1] // SQ_SIZE
if invalid is True:
print("INVALID MOVE: PLEASE TRY AGAIN")
else:
gs.board[destination_row][destination_column] = piece
gs.board[player_click_region[0][0]][player_click_region[0][1]] = "--"
player_click_region = []
square_selected = ()
print(gs.board)
draw_pieces(screen)
p.display.update()
# Update board using pairs of tuples...
def draw_pieces(screen):
global font
x = 1
y = 0
while y < DIMENSION:
while x < DIMENSION:
p.draw.rect(screen, BLACK, (x * SQ_SIZE, y * SQ_SIZE, SQ_SIZE, SQ_SIZE))
# Ask Mr. Clarke how to access a specific list within a class of another file and then how to get an index
# from within that list.
x += 2
if x == 9:
x = 0
else:
x = 1
y += 1
y = 0
x = 0
while y < DIMENSION:
while x < DIMENSION:
p.draw.rect(screen, WHITE, (x * SQ_SIZE, y * SQ_SIZE, SQ_SIZE, SQ_SIZE))
# Ask Mr. Clarke how to access a specific list within a class of another file and then how to get an index
# from within that list.
x += 2
if x == 9:
x = 0
else:
x = 1
y += 1
y = 0
x = 0
while y < DIMENSION:
while x < DIMENSION:
piece = gs.board[y][x]
if piece != "--":
screen.blit(IMAGES[piece], (x * SQ_SIZE, y * SQ_SIZE, SQ_SIZE, SQ_SIZE))
# Ask Mr. Clarke how to access a specific list within a class of another file and then how to get an index
# from within that list.
x += 1
x = 0
y += 1
if invalid is True:
text = font.render('INVALID MOVE', True, TEXT_COLOUR)
screen.blit(text, (HEIGHT/2, WIDTH/2))
def valid_move(piece):
global invalid
# print(gs.board[player_click_region[1][0]][player_click_region[1][1]])
invalid = False
change_x = abs(player_click_region[0][0] - player_click_region[1][0]) # abs() finds absolute value - always pos
change_y = abs(player_click_region[0][1] - player_click_region[1][1])
linear_x = player_click_region[0][0] - player_click_region[1][0]
# linear_y = player_click_region[0][1] - player_click_region[1][1]
destination_piece = gs.board[player_click_region[1][0]][player_click_region[1][1]]
print("x change", str(change_x))
print("y change", str(change_y))
if piece[0] == destination_piece[0]:
invalid = True
print("invalid 3")
if "P" in piece:
if change_x != 1 and change_x != 2:
invalid = True
else:
if player_click_region[0][0] != 6 and player_click_region[0][0] != 1:
if change_x == 2:
invalid = True
if "b" in piece:
if player_click_region[0][0] == 1:
if gs.board[player_click_region[0][0]+1][player_click_region[0][1]] != "--":
invalid = True
if linear_x > 0:
invalid = True
if "w" in piece:
if player_click_region[0][0] == 6:
if gs.board[player_click_region[0][0]-1][player_click_region[0][1]] != "--":
invalid = True
print("1")
if linear_x < 0:
invalid = True
print("2")
if invalid is False:
if change_y == 0:
if destination_piece != "--":
invalid = True
if change_y == 1:
if change_x != 1:
invalid = True
if destination_piece == "--":
invalid = True
else:
print("capturing now")
if change_y > 1:
invalid = True
if "B" in piece:
if change_x != change_y:
invalid = True
print("you don messed up boy")
else:
i = 1
if linear_x < 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0]+i][player_click_region[0][1]+i] != "--":
invalid = True
i += 1
i = 1
if linear_x > 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0]-i][player_click_region[0][1]-i] != "--":
invalid = True
if "N" in piece:
if change_x + change_y != 3:
invalid = True
if change_x > 0 and change_y > 0:
if destination_piece != "--":
print("capture_piece()")
else:
invalid = True
if "R" in piece:
if change_x > 0 and change_y > 0:
invalid = True
else:
x = 1
if change_x > 0:
for x in range(x, change_x):
print(player_click_region[0][0]+x)
if player_click_region[0][0] > player_click_region[1][0]:
print("now uve done messed up")
if gs.board[player_click_region[1][0]+x][player_click_region[1][1]] != "--":
invalid = True
else:
print(gs.board[player_click_region[0][0] + x][player_click_region[0][1]])
if gs.board[player_click_region[0][0]+x][player_click_region[0][1]] != "--":
print(gs.board[player_click_region[0][0]+x][player_click_region[0][1]])
invalid = True
x+=1
else:
for x in range(x, change_y-1):
print(player_click_region)
if player_click_region[0][1] > player_click_region[1][1]:
if gs.board[player_click_region[1][0]][player_click_region[1][1]+x] != "--":
invalid = True
else:
if gs.board[player_click_region[0][0]][player_click_region[0][1]+x] != "--":
invalid = True
x+=1
if "Q" in piece:
print(change_x, change_y)
if change_x == change_y:
print("how does this work")
i = 1
if linear_x < 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0] + i][player_click_region[0][1] + i] != "--":
invalid = True
print("invalid 2")
i += 1
i = 1
if linear_x > 0:
for i in range(i, change_x):
if gs.board[player_click_region[0][0] - i][player_click_region[0][1] - i] != "--":
invalid = True
print("invalid 1")
elif change_x + change_y == 1:
if destination_piece != "--":
print("Capture")
# Check whether the piece taken is the same colour or not
else:
print("Empty Square")
else:
print("fucked up")
if change_x > 0 and change_y > 0:
invalid = True
else:
x = 1
if change_x > 0:
for x in range(x, change_x):
if player_click_region[0][0] > player_click_region[1][0]:
if gs.board[player_click_region[1][0] + x][player_click_region[1][1]] != "--":
invalid = True
else:
if gs.board[player_click_region[0][0] + x][player_click_region[0][1]] != "--":
invalid = True
x += 1
else:
for x in range(x, change_y - 1):
print(player_click_region)
if player_click_region[0][1] > player_click_region[1][1]:
if gs.board[player_click_region[1][0]][player_click_region[1][1] + x] != "--":
invalid = True
else:
if gs.board[player_click_region[0][0]][player_click_region[0][1] + x] != "--":
invalid = True
x += 1
if "K" in piece:
if change_x > 1 or change_y > 1:
invalid = True
# To implement the images. the coordinates of the tiles are 64x64 and you can multiply them by a number for the x value
# which would then move them over a certain number of tiles (e.g. 64*3 would give 3 tiles to the right), and same for
# the y values.
main()
您必须先初始化 font
模块,然后才能使用它:
p.font.init()
font = p.font.SysFont('timesnewromanbold', 32)
或者您可以初始化所有 pygame 模块:
p.init()
font = p.font.SysFont('timesnewromanbold', 32)
或者在p.init()
之后的main
中创建font
对象:
def main():
global player_click_region
global font
p.init()
font = p.font.SysFont('timesnewromanbold', 32)
# [...]