类型错误:参数 1 必须是 pygame.Surface,而不是 str [英] TypeError: argument 1 must be pygame.Surface, not str

查看:88
本文介绍了类型错误:参数 1 必须是 pygame.Surface,而不是 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:中定义classesmain().你不必.把它放在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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆