乒乓球穿过球拍,撞到墙上,反射而不是打在垫子上

2024-04-27 04:31:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个乒乓球游戏,它最终会有一个挡块,中间有一个类似的加农炮,既可以射球,也可以加力,最后会增加不同的功能,但现在我甚至不能让球正确地击中球拍。。。。。 导入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))

球穿过敌人的球拍。它实际上并没有穿过它,它会挡住它,但它会越过桨。我一直在尝试不同的方法,但我是新手,正在努力。在

这是我认为给我带来麻烦的课,我没有犯任何错误,只是没有按我喜欢的方式击球。游戏者的划桨工作得很好,只是敌人没有正确地做它。在

^{pr2}$

我也在努力增加碰撞,以防球反弹。我尝试了几种不同的方法,但注意到球穿过了球拍,必须先解决这个问题。这是我的下一步。感谢任何帮助。在

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

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

我尝试过创建精灵组,并以这种方式显示它们,我不知道更好的方式来显示它们,但它们仍然可以移动。。。在


Tags: nameselfifinitdefscreenpygameplayer
1条回答
网友
1楼 · 发布于 2024-04-27 04:31:07

我不得不改变图像的表面,因为我没有图像,但这对我很好。在

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

相关问题 更多 >