0

我有一个用于类似 Pong 的游戏的 Pygame,它现在看起来非常棒,但有一些我无法弄清楚。

第一个问题是双方的问题。我已经设置蝙蝠使用左右箭头键移动并在到达侧面时停止(使用定位),但是如果你按下左侧的左键或右侧的右键,它会稍微走出游戏区。

第二个问题,和第一个一样,也是关于双方的。我已经将球设置为在墙壁周围移动和弹跳(使用定位),但是如果球棒在左侧或右侧,并且我持有相应的键,球将直接穿过墙壁/天花板!

最后一个问题是我已经将球设置为随着时间的推移加速(使用速度)。如果你擅长比赛,它会加速,直到球快到有能力直接突破球棒。

这是我的代码:

import pygame, time, sys, random
from pygame.locals import *
pygame.init()

screen = pygame.display.set_mode((600, 500))
pygame.display.set_caption ("Pong Squash")

def gameplay1():
    global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, font2, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball, points, points_count, new_points, your_score1, space1, esc1, munrosmall, new_positionx, beep_list
    game_over_display = "game_over1.png"
    lives = "lives.png"
    points = "points.png"
    lives_remaining = "lives_remaining.png"
    your_score = "score_intro.png"
    space = "space.png"
    esc = "esc.png"
    munrosmall = "munrosmall.ttf"
    beep1 = "beep1.wav"
    beep2 = "beep2.wav"
    beep3 = "beep3.wav"
    beep4 = "beep4.wav"

    game_over1 = pygame.image.load(game_over_display).convert()
    lives1 = pygame.image.load(lives).convert()
    points1 = pygame.image.load(points).convert()
    lives_remaining1 = pygame.image.load(lives_remaining).convert()
    your_score1 = pygame.image.load(your_score).convert()
    space1 = pygame.image.load(space).convert()
    esc1 = pygame.image.load(esc).convert()

    font1 = pygame.font.Font((munrosmall), 40)
    font2 = pygame.font.Font(None, 40)

    white = 255,255,255
    black = 0, 0, 0
    green = 0, 250, 0
    yellow = 255, 255, 0

    points = 0
    points_count = font1.render(str(points), True, white)
    lives_count = font1.render(('3'), True, white)

    position_x = 175
    position_y = 375
    velocity_x1 = 0
    velocity_y1 = 0
    position1 = 275
    position2 = 150
    velocity1 = 2
    velocity2 = 2

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if waiting:
                        waiting = False
                        reset_ball()
                if event.key == pygame.K_LEFT:
                    velocity_x1 = (velocity_x1 - 3)
                elif event.key == pygame. K_RIGHT:
                    velocity_x1 = (velocity_x1 + 3)
            elif event.type == KEYUP:
                if event.key == K_LEFT or event.key == K_RIGHT:
                    velocity_x1 = 0

        screen.fill((0, 0, 0))
        color = 255
        width = 0
        position = position_x, position_y, 250, 25
        position_x += velocity_x1
        position_y += velocity_y1
        position1 += velocity1
        position2 += velocity2

        player = pygame.draw.rect(screen, (color, color, color), position, width)
        ball = pygame.draw.rect(screen, (color, color, color), (position1, position2, 15, 15), width)

        if player.colliderect(ball):
            velocity2 = - velocity2
            beep_list = [beep1, beep2, beep3, beep4]
            beep = random.shuffle(beep_list)
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()

        if position_x > 350 or position_x < 0:
            velocity_x1 = 0
        elif position1 > 575 or position1 < 0:
            velocity1 = - velocity1
            beep = random.shuffle(beep_list)
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()
        elif position2 < 0:
            velocity2 = - velocity2
            velocity2 += 0.1
            points += 100
            beep = random.shuffle(beep_list)
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()
            pygame.display.update()
        elif position2 > 365:
            new_points = points
            newposition_x = position_x
            change_level1()

        screen.blit(lives1, (450, 455))
        screen.blit(points1,(0, 459))
        screen.blit(lives_count,(560,453))
        points_count = font1.render(str(points), True, white)
        screen.blit(points_count, (150, 456))
        pygame.display.update()

def gameplay2():  
    global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball, points, points_count, new_points, your_score1, munrosmall, newposition_x, beep_list
    game_over_display = "game_over1.png"
    lives = "lives.png"
    points = "points.png"
    lives_remaining = "lives_remaining.png"
    beep1 = "beep1.wav"
    beep2 = "beep2.wav"
    beep3 = "beep3.wav"
    beep4 = "beep4.wav"

    game_over1 = pygame.image.load(game_over_display).convert()
    lives1 = pygame.image.load(lives).convert()
    points1 = pygame.image.load(points).convert()
    lives_remaining1 = pygame.image.load(lives_remaining).convert()

    white = 255,255,255
    black = 0, 0, 0
    green = 0, 250, 0
    yellow = 255, 255, 0

    points_count = font1.render(str(new_points), True, white)
    lives_count = font1.render(('2'), True, white)

    velocity_x1 = 0
    velocity_y1 = 0
    position1 = 275
    position2 = 150
    velocity1 = 2
    velocity2 = 2

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if waiting:
                        waiting = False
                        reset_ball()
                if event.key == pygame.K_LEFT:
                    velocity_x1 = (velocity_x1 - 3)
                elif event.key == pygame. K_RIGHT:
                    velocity_x1 = (velocity_x1 + 3)
            elif event.type == KEYUP:
                if event.key == K_LEFT or event.key == K_RIGHT:
                    velocity_x1 = 0

        screen.fill((0, 0, 0))
        color = 255
        width = 0
        position = position_x, position_y, 250, 25
        position_x += velocity_x1
        position1 += velocity1
        position2 += velocity2

        player = pygame.draw.rect(screen, (color, color, color), position, width)
        ball = pygame.draw.rect(screen, (color, color, color), (position1, position2, 15, 15), width)

        if player.colliderect(ball):
            velocity1 = - velocity1
            velocity2 = - velocity2
            beep_list = [beep1, beep2, beep3, beep4]
            beep = random.shuffle(beep_list)
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()

        if position_x > 350 or position_x < 0:
            velocity_x1 = 0
        elif position1 > 575 or position1 < 0:
            velocity1 = - velocity1
            beep_list = [beep1, beep2, beep3, beep4]
            beep = random.shuffle((beep_list))
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()
        elif position2 < 0:
            velocity2 = - velocity2
            velocity2 += 0.1
            new_points += 100
            beep_list = [beep1, beep2, beep3, beep4]
            beep = random.shuffle(beep_list)
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()
            pygame.display.update()
        elif position2 > 365:
            change_level2()

        screen.blit(lives1, (450, 455))
        screen.blit(points1,(0, 459))
        screen.blit(lives_count,(560,453))
        points_count = font1.render(str(new_points), True, white)
        screen.blit(points_count, (150, 456))
        pygame.display.update()
def gameplay3():
    global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball, new_points, new_points2, your_score1, munrosmall, newposition_x, beep_list
    game_over_display = "game_over1.png"
    lives = "lives.png"
    points = "points.png"
    lives_remaining = "lives_remaining.png"
    beep1 = "beep1.wav"
    beep2 = "beep2.wav"
    beep3 = "beep3.wav"
    beep4 = "beep4.wav"

    game_over1 = pygame.image.load(game_over_display).convert()
    lives1 = pygame.image.load(lives).convert()
    points1 = pygame.image.load(points).convert()
    lives_remaining1 = pygame.image.load(lives_remaining).convert()

    white = 255,255,255
    black = 0, 0, 0
    green = 0, 250, 0
    yellow = 255, 255, 0

    points_count = font1.render(str(new_points), True, white)
    lives_count = font1.render(('1'), True, white)

    velocity_x1 = 0
    velocity_y1 = 0
    position1 = 275
    position2 = 150
    velocity1 = 2
    velocity2 = 2

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if waiting:
                        waiting = False
                        reset_ball()
                if event.key == pygame.K_LEFT:
                    velocity_x1 = (velocity_x1 - 3)
                elif event.key == pygame. K_RIGHT:
                    velocity_x1 = (velocity_x1 + 3)
            elif event.type == KEYUP:
                if event.key == K_LEFT or event.key == K_RIGHT:
                    velocity_x1 = 0

        screen.fill((0, 0, 0))
        color = 255
        width = 0
        position = position_x, position_y, 250, 25
        position_x += velocity_x1
        position1 += velocity1
        position2 += velocity2

        player = pygame.draw.rect(screen, (color, color, color), position, width)
        ball = pygame.draw.rect(screen, (color, color, color), (position1, position2, 15, 15), width)

        if player.colliderect(ball):
            velocity1 = - velocity1
            velocity2 = - velocity2
            beep_list = [beep1, beep2, beep3, beep4]
            beep = random.shuffle(beep_list)
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()

        if position_x > 350 or position_x < 0:
            velocity_x1 = 0
        elif position1 > 575 or position1 < 0:
            velocity1 = - velocity1
            beep = random.shuffle(beep_list)
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()
        elif position2 < 0:
            velocity2 = - velocity2
            velocity2 += 0.1
            new_points += 100
            pygame.mixer.music.load((beep_list[1]))
            pygame.mixer.music.play()
            pygame.display.update()
        elif position2 > 365:
            game_over()

        screen.blit(lives1, (450, 455))
        screen.blit(points1,(0, 459))
        screen.blit(lives_count,(560,453))
        points_count = font1.render(str(new_points), True, white)
        screen.blit(points_count, (150, 456))
        pygame.display.update()
def change_level1():
    global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball
    gameplay2()
    pygame.display.update()
def change_level2():
    global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball
    gameplay3()
    pygame.display.update()
def reset_ball():
  global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball
  velocity1 = 2
  velocity2 = 2
  pygame.display.update()
def game_over():
    global game_over1, your_score1
    pygame.display.flip()
    screen.fill(black)
    screen.blit(game_over1, (200,100))
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                elif event.key == K_RETURN:
                    gameplay1()
        pygame.display.flip()
        time.sleep(1)
        screen.blit(your_score1, (100, 175))
        pygame.display.flip()
        time.sleep(1)
        points_count = font1.render(str(new_points), True, white)
        screen.blit(points_count, (400, 170))
        pygame.display.flip()
        time.sleep(1)
        screen.blit(space1, (115, 250))
        screen.blit(esc1, (175, 300))
        pygame.display.flip()

gameplay1()

在这些事情上我真的需要帮助。提前致谢!

更新:我通过降低每次撞击后墙时增加的速度来解决最后一个问题,但我仍然需要前两个方面的帮助。我不明白velocityx1无论如何都与velocity1有关。是墙壁位置的问题,还是碰撞?请帮忙!

4

3 回答 3

0

您需要更多的碰撞检测迭代。

PS Box2D - 具有 2d 物理、欧拉方程等的大型库。它具有 python 绑定。

于 2013-07-28T22:48:08.253 回答
0

不要仅仅依赖碰撞检测。使用健全性检查(玩家的位置是否超出界限?将其设置为正确的界限)。设定球的速度上限。还使用路径检查。(球棒是否在球的移动路径中?)

此外,考虑重构(重命名变量)您的代码,以便其他人更容易了解正在发生的事情。(我的意思是,position_x 是什么?球或球员的位置??)

对于将来更复杂的示例,请提供最小工作示例。(去掉声音等不必要的东西)

祝你好运!

于 2013-07-28T23:52:02.010 回答
0

我修好了它!

我只需要添加一行代码:

    if position_x > 350:
        position_x = 350
        velocity_x1 = 0
    if position_x < 0:
        position_x = 0
        velocity_x1 = 0

Position_x 和 velocity_x1 是球棒位置/速度。告诉系统它绝对不能通过(使用'position_x = 0')某个位置修复了这两个错误。

于 2013-07-29T13:40:38.010 回答