简体   繁体   English

TypeError:参数1必须是pygame.Surface,而不是str

[英]TypeError: argument 1 must be pygame.Surface, not str

I have a problem, I made a Pong game but I have a problem printing the score to the pygame window. 我有一个问题,我做了一个Pong游戏,但是在将比分打印到pygame窗口时遇到了问题。

I get the error 'TypeError: argument 1 must be pygame.Surface, not str 我收到错误信息'TypeError:参数1必须是pygame.Surface,而不是str

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()

Use basicFont.render(...) to create surface with text. 使用basicFont.render(...)创建带有文本的表面。 Then blit that surface. 然后将那个表面blit

https://www.pygame.org/docs/ref/font.html#pygame.font.Font.render https://www.pygame.org/docs/ref/font.html#pygame.font.Font.render


btw: don't define classes and main() inside while game: . 顺便说一句:不要while game:定义classesmain() You don't have to. 不用了 Put it outside while game: while game:放在外面while game:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM