我无法弄清楚为什么我的桨和球图像不会出现在pygame上

时间:2016-06-09 04:26:03

标签: python pygame pong

启动所有模块和窗口

        import pygame, sys, time, random from pygame.locals import *

        pygame.init()
        bg = pygame.image.load("./soccerfield.png")

        mainClock = pygame.time.Clock()

        WINDOWWIDTH = 800
        WINDOWHEIGHT = 600
        SIZESIDES = 20
        MIDDLESIZE = 10
        FPS = 30
        PADDLESPEED = 10


        #Rects of the board of the game
        TOPSIDE = pygame.Rect(0, 0, WINDOWWIDTH, SIZESIDES)
        BOTTOMSIDE = pygame.Rect(0, WINDOWHEIGHT - SIZESIDES, WINDOWWIDTH, SIZESIDES)
        MIDDLE = []
        for i in range(0, 31):
            MIDDLE.append(pygame.Rect(WINDOWWIDTH/2 - MIDDLESIZE/2,15 + i*20, MIDDLESIZE, MIDDLESIZE))    

        windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)

        pygame.display.set_caption('Running_window')
        "defining colors"
        BLACK = (0, 0, 0)
        WHITE = (255, 255, 255)

        gameIsPlaying = False

这些用于打印分数

        CHIFFRES =[
        '''WWWWW
        W   W
        W   W
        W   W
        WWWWW''',
        '''    W
            W
            W
            W
            W''',
        '''WWWWW
            W
        WWWWW
        W    
        WWWWW''',
        '''WWWWW
            W
        WWWWW
            W
        WWWWW''',
        '''W   W
        W   W
        WWWWW
            W
            W''',
        '''WWWWW
        W    
        WWWWW
            W
        WWWWW''',
        '''WWWWW
        W    
        WWWWW
        W   W
        WWWWW''',
        '''WWWWW
            W
          WWW
            W
            W''',
        '''WWWWW
        W   W
        WWWWW
        W   W
        WWWWW''',
        '''WWWWW
        W   W
        WWWWW
            W
        WWWWW''',
        '''''']

        #Functions

            #Draw the score (in fact return a list with the rect to draw, drawn later with drawGame())
        def drawChiffre(a, x, y):
            countx = 0
            county = 0
            rectList = []
            for piece in CHIFFRES[a]:
                if countx % 7 == 5 or countx % 7 == 6:
                    countx +=1
                    county +=0.5
                if piece == '''W''':
                    rectList.append(pygame.Rect(x + (countx%7)*10, y + county*15, MIDDLESIZE, MIDDLESIZE*1.5))
                    countx +=1
                elif piece == ''' ''':
                    countx +=1
            return rectList

            #Doesn't work, meant to change the score in case of a win from either side
        def score(ball, scoreP1, scoreP2):
            if ball.l <= 0:
                scoreP1 +=1
                ball = Ball(WINDOWHEIGHT/2, WINDOWWIDTH/2, 15, 15, 5, 5)
            if ball.l >= WINDOWWIDTH:
                scoreP2 +=1
                ball = Ball(WINDOWHEIGHT/2, WINDOWWIDTH/2, 15, 15, 5, 5)

 function that draws everything in game =============================================

        def drawGame(Paddle1, scoreP1, Paddle2, scoreP2, Ball):
            windowSurface.fill(BLACK)
            windowSurface.blit(bg,(0,0))

        Paddle1.draw()
        Paddle1.pygame.image.load("./soccerplayer1")
        windowSurface.blit(Paddle1)
        Paddle2.draw()
        Paddle2.pygame.image.load("./soccerplayer2")
        windowSurface.blit(Paddle2)
        Ball.draw()
        Ball = pygame.image.load("./soccerball.png")
        windowSurface.blit(Ball)

            drawScoreP2 = drawChiffre(scoreP2, 450, 50)
            for piece in drawScoreP2:
                pygame.draw.rect(windowSurface, WHITE, piece)

            drawScoreP1 = drawChiffre(scoreP1, 300, 50)
            for piece in drawScoreP1:
                pygame.draw.rect(windowSurface, WHITE, piece)

            pygame.draw.rect(windowSurface, WHITE, TOPSIDE) 
            pygame.draw.rect(windowSurface, WHITE, BOTTOMSIDE)

            for piece in MIDDLE :
                pygame.draw.rect(windowSurface, WHITE, piece)



            #A function for writing a text with the most basic font
        def write(text, fontSize, x, y):
            font = pygame.font.SysFont(None, fontSize)

            textR = font.render(text, True, WHITE, None)
            textRect = textR.get_rect()
            textRect.centerx = x
            textRect.centery = y
            windowSurface.blit(textR, textRect)

        #Classes

            #The paddles
        class Paddle:
            rect = pygame.Rect(0, 0, 0, 0)
            movement = 0

            def __init__(self, l, t, w, h):
                self.l = l
                self.t = t
                self.w = w
                self.h = h
            def setRect(self):
                self.rect = pygame.Rect(self.l, self.t, self.w, self.h)
            def setPosition(self):
                self.position = self.t
            def setMovement(self, x):
                self.movement = x
            def move(self):
                self.t = self.t + self.movement*PADDLESPEED
                self.setPosition()
                self.setRect()
            def draw(self):
                pygame.draw.rect(windowSurface, WHITE, self.rect)
            def collideWithSide(self, upSide, downSide):
                if (self.t + self.h) > downSide:
                    self.setMovement(0)
                if (self.t) < upSide:
                    self.setMovement(0)

            #The ball
        class Ball:
            rect = pygame.Rect(0, 0, 0, 0)
            position = [0, 0]

            def __init__(self, l, t, w, h, x, y):
                self.speed = [x, y]
                self.l = l
                self.t = t
                self.w = w
                self.h = h
            def setRect(self):
                self.rect = pygame.Rect(self.l, self.t, self.w, self.h)
            def setPosition(self):
                self.position = [self.l, self.t]
            def setSpeed(self, x, y):
                self.speed = [x, y]
            def draw(self):
                pygame.draw.rect(windowSurface, WHITE, self.rect)
            def move(self):
                self.l = self.l + self.speed[0]
                self.t = self.t + self.speed[1]
                self.setRect()
                self.setPosition()
            def bounce(self, paddle):
                if self.rect.colliderect(paddle.rect):
                    self.setSpeed(-self.speed[0], self.speed[1])
            def collideWithSide(self, upSide, downSide):
                if (self.t + self.h) > downSide or (self.t) < upSide:
                    self.setSpeed(self.speed[0], -self.speed[1])

现在是游戏的核心

而True:

            #Initialization of the score and of the paddles and ball
            scoreP1 = 0
            scoreP2 = 0

            paddle1 = Paddle(0, WINDOWHEIGHT/2 - 40, 15, 80)
            paddle2 = Paddle(WINDOWWIDTH - 15, WINDOWHEIGHT/2 - 40, 15, 80)
            ball = Ball(WINDOWWIDTH/2, WINDOWHEIGHT/2, 15, 15, 5, 5)
        start 

“menu”

            while not gameIsPlaying:
                for event in pygame.event.get():
                        if event.type == QUIT:
                            pygame.quit()
                            sys.exit()
                        if event.type == KEYDOWN:
                            if event.key == ord('s'):
                                gameIsPlaying = True
                        if event.type == KEYUP:
                            if event.key == ord('q'):
                                pygame.quit()
                                sys.exit()


                drawGame(paddle1, scoreP1, paddle2, scoreP2, ball)

                write('Press s', 120, WINDOWWIDTH/4, WINDOWHEIGHT/2)
                write('to play!', 120, 3*WINDOWWIDTH/4, WINDOWHEIGHT/2)

                write('Press q', 60, 3*WINDOWWIDTH/8, 3*WINDOWHEIGHT/4)
                write('to quit.', 60, 5*WINDOWWIDTH/8, 3*WINDOWHEIGHT/4)

                write('e', 60 , 20, WINDOWHEIGHT/4)
                write('d', 60, 20, 3*WINDOWHEIGHT/4)

                write('UP', 30, WINDOWWIDTH - 15, WINDOWHEIGHT/4)
                write('DOWN', 30, WINDOWWIDTH -30, 3*WINDOWHEIGHT/4)

                pygame.display.update()
                mainClock.tick(FPS)

            #This is the game playing
            while gameIsPlaying:

用于控制拨片及其移动方向的键

for event in pygame.event.get():
                    if event.type == QUIT:
                        pygame.quit()
                        sys.exit()
                    if event.type == KEYDOWN:
                        if event.key == K_ESCAPE or event.key == ord('a'):
                            gameIsPlaying = False
                        if event.key == ord('e'):
                            paddle1.setMovement(-1)
                        if event.key == ord('d'):
                            paddle1.setMovement(1)
                        if event.key == K_UP:
                            paddle2.setMovement(-1)
                        if event.key == K_DOWN:
                            paddle2.setMovement(1)
                    if event.type == KEYUP:
                        if event.key == ord('e'):
                            paddle1.setMovement(0)
                        if event.key == ord('d'):
                            paddle1.setMovement(0)
                        if event.key == K_UP:
                            paddle2.setMovement(0)
                        if event.key == K_DOWN:
                            paddle2.setMovement(0)


                #Move the ball and the paddles
                paddle1.move()
                paddle2.move()
                ball.move()

                #Collision between the ball and the paddles
                ball.bounce(paddle1)
                ball.bounce(paddle2)

检查分数和增量

                if ball.l <= 0:
                    scoreP1 +=1
                    ball = Ball(WINDOWWIDTH/2, WINDOWHEIGHT/2, 15, 15, random.randint(3, 5), random.randint(3, 5))
                if ball.l >= WINDOWWIDTH:
                    scoreP2 +=1
                    ball = Ball(WINDOWWIDTH/2, WINDOWHEIGHT/2, 15, 15, random.randint(3, 5), random.randint(3, 5))

                #Check if winner and displaying and back to the menu
                if scoreP1 >= 10:
                    write('WINNER', 60, WINDOWWIDTH/8, 2*WINDOWHEIGHT/8)
                    pygame.display.update()
                    time.sleep(1)
                    gameIsPlaying = False

                if scoreP2 >= 10:
                    write('WINNER', 60, 5*WINDOWWIDTH/8, 2*WINDOWHEIGHT/8)
                    pygame.display.update()
                    time.sleep(1)
                    gameIsPlaying = False

                #Collision of the paddles and the ball with the sides
                paddle1.collideWithSide(20, 580)
                paddle2.collideWithSide(20, 580)
                ball.collideWithSide(20, 580)


                drawGame(paddle1, scoreP1, paddle2, scoreP2, ball)

                #Acceleration of the ball
                ball.setSpeed(ball.speed[0]*1.001, ball.speed[1])

                write('Press escape close game', 15, WINDOWWIDTH/8, WINDOWHEIGHT-SIZESIDES*2)

                pygame.display.update()
                mainClock.tick(FPS)

1 个答案:

答案 0 :(得分:0)

为什么要在此代码中加载图片:

Paddle1.draw()
Paddle1.pygame.image.load("./soccerplayer1")
windowSurface.blit(Paddle1)

您应该在类实例化期间设置paddle镜像。你也试图搞砸课堂而不是图像,因此它没有出现。您的Paddle类应该是这样的(这假定Paddle1是对象而不是类名):

def __init__(self):
    self.myimage = pygame.image.load("./soccerplayer1")
    ....

然后你可以像这样画出来:

windowSurface.blit(Paddle1.myimage, (x,y))

也许编辑帖子来添加课程?这会有所帮助。