Pong球穿过桨并击中墙壁,反射击中桨

时间:2016-05-07 19:09:51

标签: python python-3.x pygame

我正在制作一个乒乓球游戏,最终会在中间有一个阻挡/潮流,像大炮一样会射球或上电并且生病最终会增加不同的功能但是现在我甚至无法让球击中桨正确.....     导入pygame

BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GOLD = (201,168,168)
Call = pygame.sprite.Group(())
got = pygame.sprite.Group(())
SCR_WID, SCR_HEI = 640, 480
backg = pygame.image.load("background.png")


class Player(pygame.sprite.Sprite):
        def __init__(self, name):
                pygame.sprite.Sprite.__init__(self)
                if name == "george":
                        self.x, self.y = 16, SCR_HEI/2
                elif name =="frank":
                        self.x, self.y = SCR_WID-16, SCR_HEI/2
                self.name = name
                self.speed = 3
                self.padWid, self.padHei = 8, 64
                self.score = 0
                self.scoreFont = pygame.font.Font("imagine_font.ttf", 64)           



        def scoring(self):
                scoreBlit = self.scoreFont.render(str(self.score), 1, (255, 255, 255))
                if self.name == "george":
                        screen.blit(scoreBlit, (32, 16))
                        if self.score == 10:
                                print ("player 1 wins!")
                                exit()
                elif self.name == "frank":        
                        screen.blit(scoreBlit, (SCR_HEI+92, 16))
                        if self.score == 10:
                                print ("Player 2 wins!")
                                exit()

        def movement(self):

                keys = pygame.key.get_pressed()
                if self.name == "george":
                        if keys[pygame.K_w]:
                                self.y -= self.speed
                        elif keys[pygame.K_s]:
                                self.y += self.speed
                elif self.name == "frank":
                        if keys[pygame.K_UP]:
                                self.y -= self.speed
                        elif keys[pygame.K_DOWN]:
                                self.y += self.speed

                if self.y <= 0:
                        self.y = 0
                elif self.y >= SCR_HEI-64:
                        self.y = SCR_HEI-64

        def draw(self):
                pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, self.padWid, self.padHei))

球正在通过敌人的桨。它实际上并没有通过它会阻止它,但它会越过桨。我一直在尝试不同的方式,但我是新手,我正在努力。

这是我认为给我带来麻烦的课程,我没有因为它没有按照它的方式击中桨而得到任何错误。玩家划桨工作正常,只是没有正确行动的敌人。

  class Ball(pygame.sprite.Sprite):
        image = pygame.image.load("bong.png")
        def __init__(self):
                pygame.sprite.Sprite.__init__(self)
                self.rect = self.image.get_rect()

                self.rect.x, self.rect.y = SCR_WID/2, SCR_HEI/2
                self.speed_x = -3
                self.speed_y = 3
                self.size = 8

        def movement(self):
                self.rect.x += self.speed_x
                self.rect.y += self.speed_y


                if self.rect.y <= 0:
                        self.speed_y *= -1
                elif self.rect.y >= SCR_HEI-self.size:
                        self.speed_y *= -1

                if self.rect.x <= 0:
                        self.__init__()
                        enemy.score += 1
                elif self.rect.x >= SCR_WID-self.size:
                        self.__init__()
                        self.speed_x = 3
                        player.score += 1

                for n in range(-self.size, player.padHei):
                        if self.rect.y == player.y + n:
                                if self.rect.x <= player.x + player.padWid:
                                        self.speed_x *= -1
                                        break
                        n += 1
                for n in range(-self.size, enemy.padHei):
                        if self.rect.y == enemy.y + n:
                                if self.rect.x >= enemy.x - enemy.padWid:
                                        self.speed_x *= -1
                                        break

我也在努力增加对阻挡的碰撞,这样球就会反弹。我尝试了几种不同的方式,但注意到球是通过桨并且必须先修复它。这是我的下一步。任何帮助表示赞赏。

class Block(pygame.sprite.Sprite):
        image = pygame.image.load("brick.png")


        def __init__(self):
                pygame.sprite.Sprite.__init__(self)
                self.rect = self.image.get_rect()
                self.rect.x = 300
                self.rect.y = 0





SCR_WID, SCR_HEI = 640, 480
screen = pygame.display.set_mode((SCR_WID, SCR_HEI))
pygame.display.set_caption("Pong")
pygame.font.init()
clock = pygame.time.Clock()
FPS = 60
pygame.init()

def main():
    backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI))

    global player
    player = Player("george") 

    global enemy
    enemy = Player("frank")

    block = Block ()
    got.add(block)

    ball = Ball()
    Call.add(ball)

    while True:

            for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                            print("Game exited by user")
                            exit()

            screen.blit(backg,(0,0))                  
            got.update()
            Call.update()
            backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI))
            got.draw(screen)
            Call.draw(screen)
            player.movement()
            enemy.movement()
            ball.movement()

            player.draw()
            player.scoring()
            enemy.draw()
            enemy.scoring()





            pygame.display.flip()
            clock.tick(FPS)

main()

我不知道我是否在说错了。

我已经尝试过创建精灵组并以这种方式显示它们我不知道更好的方式来显示它们并仍让它们移动......

1 个答案:

答案 0 :(得分:1)

我不得不将图像更改为Surfaces,因为我没有图像,但这对我来说很好。

import pygame
from pygame.locals import *

SCR_WID, SCR_HEI = 640, 480
screen = pygame.display.set_mode((SCR_WID, SCR_HEI))
pygame.display.set_caption("Pong")
pygame.font.init()
clock = pygame.time.Clock()
FPS = 60
pygame.init()


BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GOLD = (201,168,168)
Call = pygame.sprite.Group(())
got = pygame.sprite.Group(())
#SCR_WID, SCR_HEI = 640, 480
backg = pygame.Surface((SCR_WID, SCR_HEI)) #pygame.image.load("background.png")


class Player(pygame.sprite.Sprite):
        def __init__(self, name):
                pygame.sprite.Sprite.__init__(self)
                if name == "george":
                        self.x, self.y = 16, SCR_HEI/2
                elif name =="frank":
                        self.x, self.y = SCR_WID-16, SCR_HEI/2
                self.name = name
                self.speed = 3
                self.padWid, self.padHei = 8, 64
                self.score = 0
                self.scoreFont = pygame.font.SysFont("Arial", 32) #imagine_font.ttf", 64)           



        def scoring(self):
                scoreBlit = self.scoreFont.render(str(self.score), 1, (255, 255, 255))
                if self.name == "george":
                        screen.blit(scoreBlit, (32, 16))
                        if self.score == 10:
                                print ("player 1 wins!")
                                exit()
                elif self.name == "frank":        
                        screen.blit(scoreBlit, (SCR_HEI+92, 16))
                        if self.score == 10:
                                print ("Player 2 wins!")
                                exit()

        def movement(self):

                keys = pygame.key.get_pressed()
                if self.name == "george":
                        if keys[pygame.K_w]:
                                self.y -= self.speed
                        elif keys[pygame.K_s]:
                                self.y += self.speed
                elif self.name == "frank":
                        if keys[pygame.K_UP]:
                                self.y -= self.speed
                        elif keys[pygame.K_DOWN]:
                                self.y += self.speed

                if self.y <= 0:
                        self.y = 0
                elif self.y >= SCR_HEI-64:
                        self.y = SCR_HEI-64

        def draw(self):
                pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, self.padWid, self.padHei))

class Ball(pygame.sprite.Sprite):
    image = pygame.Surface((8,8)) #pygame.image.load("bong.png")
    image.fill((255,255,255))
    def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.rect = self.image.get_rect()

            self.rect.x, self.rect.y = SCR_WID/2, SCR_HEI/2
            self.speed_x = -3
            self.speed_y = 3
            self.size = 8

    def movement(self):
            self.rect.x += self.speed_x
            self.rect.y += self.speed_y


            if self.rect.y <= 0:
                    self.speed_y *= -1
            elif self.rect.y >= SCR_HEI-self.size:
                    self.speed_y *= -1

            if self.rect.x <= 0:
                    self.__init__()
                    enemy.score += 1
            elif self.rect.x >= SCR_WID-self.size:
                    self.__init__()
                    self.speed_x = 3
                    player.score += 1

            for n in range(-self.size, player.padHei):
                    if self.rect.y == player.y + n:
                            if self.rect.x <= player.x + player.padWid:
                                    self.speed_x *= -1
                                    break
                    n += 1
            for n in range(-self.size, enemy.padHei):
                    if self.rect.y == enemy.y + n:
                            if self.rect.x >= enemy.x - enemy.padWid:
                                    self.speed_x *= -1
                                    break

    def draw(self, screen):
        pygame.draw.rect(screen, (255,255,255), (self.rect.x, self.rect.y, self.size, self.size))

class Block(pygame.sprite.Sprite):
        image = pygame.Surface((20,20)) #image.load("brick.png")


        def __init__(self):
                pygame.sprite.Sprite.__init__(self)
                self.rect = self.image.get_rect()
                self.rect.x = 300
                self.rect.y = 0






def main():
    backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI))

    global player
    player = Player("george") 

    global enemy
    enemy = Player("frank")

    block = Block ()
    got.add(block)

    ball = Ball()
    Call.add(ball)

    while True:

            for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                            print("Game exited by user")
                            exit()

            screen.blit(backg,(0,0))                  
            got.update()
            Call.update()
            backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI))
            got.draw(screen)
            Call.draw(screen)
            player.movement()
            enemy.movement()
            ball.movement()

            player.draw()
            player.scoring()
            enemy.draw()
            enemy.scoring()





            pygame.display.flip()
            clock.tick(FPS)

if __name__ == "__main__":
    main()