类型错误:参数 1 必须是 pygame.Surface,而不是 str [英] TypeError: argument 1 must be pygame.Surface, not str
问题描述
我遇到了一个问题,我做了一个乒乓球游戏,但是我在将比分打印到 pygame 窗口时遇到了问题.
I have a problem, I made a Pong game but I have a problem printing the score to the pygame window.
我收到错误 'TypeError: argument 1 must be pygame.Surface, not str
I get the error 'TypeError: argument 1 must be pygame.Surface, not str
我对文本进行了 blit 但出现错误我知道代码一团糟,我稍后会修复它
I blit the text but get an error I know the code is a mess, I'll fix it later
import pygame
from pygame.locals import *
from random import randint
import random
import time
pygame.display.set_caption("PONG!")
myimage = pygame.image.load("lose.png")
middle = pygame.image.load("middle.png")
pygame.init()
screensize = (640,480)
screen = pygame.display.set_mode(screensize)
clock = pygame.time.Clock()
PlayerProp = 0
AiProp = 0
Score = str(PlayerProp)
AiScore = str(AiProp)
game = True
while game == True:
class pong_:
def __init__(self, screensize):
self.screensize = screensize
self.centerx = int(screensize[0]*0.5)
self.centery = int(screensize[1]*0.5)
self.radius = 8
self.rect = pygame.Rect(self.centerx-self.radius,
self.centery-self.radius,
self.radius*2, self.radius*2)
self.color = (255,255,255)
self.direction = [1,1]
self.speedx = 3
self.speedy = 4
#CODE TASK: change speed as game progresses to make it harder mwahaha
self.hit_edge_left = False
self.hit_edge_right = False
def update(self, player_paddle, ai_paddle):
self.centerx += self.direction[0]*self.speedx
self.centery += self.direction[1]*self.speedy
self.rect.center = (self.centerx, self.centery)
#Make new random for each -1
if self.rect.top <= 0:
self.direction[1] = 1
elif self.rect.bottom >= self.screensize[1]-1:
self.direction[1] = -1
if self.rect.right >= self.screensize[0]-1:
self.hit_edge_right = True
elif self.rect.left <= 0:
self.hit_edge_left = True
if self.rect.colliderect(player_paddle.rect):
self.direction[0] = random.randrange(-2, -1)
if self.rect.colliderect(ai_paddle.rect):
self.direction[0] = random.randrange(2, 3)
def render(self, screen):
pygame.draw.circle(screen, self.color, self.rect.center, self.radius, 0)
pygame.draw.circle(screen, (0,0,0), self.rect.center, self.radius, 1)
class AIPaddle(object):
def __init__(self, screensize):
self.screensize = screensize
self.centerx = 4
self.centery = int(screensize[1]*0.5)
self.height = 100
self.width = 10
self.rect = pygame.Rect(0, self.centery-int(self.height*0.5), self.width, self.height)
self.color = (255,255,255)
#CODE TASK: Adjust size of AI paddle as match progresses to make it more difficult
self.speed = random.randrange(3, 4)
def update(self, pong):
if pong.rect.top < self.rect.top:
self.centery -= self.speed
elif pong.rect.bottom > self.rect.bottom:
self.centery += self.speed
self.rect.center = (self.centerx, self.centery)
def render(self, screen):
pygame.draw.rect(screen, self.color, self.rect, 0)
pygame.draw.rect(screen, (0,0,0), self.rect, 1)
class PlayerPaddle(object):
def __init__(self, screensize):
self.screensize = screensize
self.centerx = screensize[0]-5
self.centery = int(screensize[1]*0.5)
self.height = 100
self.width = 10
self.rect = pygame.Rect(0, self.centery-int(self.height*0.5), self.width, self.height)
self.color = (255,255,255)
#CODE TASK: Adjust size of player paddle as match progresses to make it more difficult
self.speed = 3
self.direction = 0
def update(self):
self.centery += self.direction*self.speed
self.rect.center = (self.centerx, self.centery)
if self.rect.top < 0:
self.rect.top = 0
if self.rect.bottom > self.screensize[1]-1:
self.rect.bottom = self.screensize[1]-1
def render(self, screen):
pygame.draw.rect(screen, self.color, self.rect, 0)
pygame.draw.rect(screen, (0,0,0), self.rect, 1)
def main():
pygame.init()
pong = pong_(screensize)
ai_paddle = AIPaddle(screensize)
player_paddle = PlayerPaddle(screensize)
running = True
while running:
#fps limit
clock.tick(64)
#big boy event handling
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN:
if event.key == K_UP:
player_paddle.direction = -1
elif event.key == K_DOWN:
player_paddle.direction = 1
if event.type == KEYUP:
if event.key == K_UP and player_paddle.direction == -1:
player_paddle.direction = 0
if event.key == K_DOWN and player_paddle.direction == 1:
player_paddle.direction = 0
#object updates
ai_paddle.update(pong)
player_paddle.update()
pong.update(player_paddle, ai_paddle)
screen.fill((0,0,0))
screen.blit(middle, (0,0))
screen.blit(AiScore, (0,0))
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
basicFont = pygame.font.SysFont(None, 48)
#CODE TASK: Make some text on the screen over everything
#code task 2: Make game restart?
if pong.hit_edge_left:
print('You Won!')
running = False
elif pong.hit_edge_right:
print('You lose')
running = False
#rendering phase
ai_paddle.render(screen)
player_paddle.render(screen)
pong.render(screen)
pygame.display.flip()
main()
推荐答案
使用 basicFont.render(...)
来创建带有文本的表面.然后blit
那个表面.
Use basicFont.render(...)
to create surface with text. Then blit
that surface.
https://www.pygame.org/docs/ref/font.html#pygame.font.Font.render
顺便说一句:不要在while game:
中定义classes
和main()
.你不必.把它放在while game:
btw: don't define classes
and main()
inside while game:
. You don't have to. Put it outside while game:
这篇关于类型错误:参数 1 必须是 pygame.Surface,而不是 str的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!