0

私は Pong のようなゲーム用の Pygame を持っています。今のところかなり素晴らしいように見えますが、理解できないことがいくつかあります。

最初の問題は側面の問題です。左右の矢印キーを使ってバットが動き回り、横に来ると止まるように設定しましたが(ポジショニングを使用)、左側の左キーまたは右側の右キーを押すと、バットが動きます少しプレイエリアの外に出ます。

2 つ目の問題は、1 つ目の問題と同様に側面に関するものです。ボールが動き回って壁を跳ねるように設定しましたが (ポジショニングを使用)、バットが左側または右側にあり、対応するキーを持っている場合、ボールは壁/天井を通り抜けます。 !

最後の問題は、(速度を使用して) 時間の経過と共にボールが加速するように設定したことです。あなたがゲームに長けていれば、ボールが非常に速くなり、バットを突き破る力が得られるまでスピードが上がります.

これは私のコードです:

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

これらのことについて本当に助けが必要です。前もって感謝します!

更新: 後壁に当たるたびに追加される速度を下げることで最終的な問題を修正しましたが、最初の 2 つはまだ助けが必要です。速度x1がとにかく速度1に関連しているという事実を理解していません。壁の位置の問題か、衝突か。助けてください!

4

3 に答える 3

0

衝突検出だけに頼らないでください。健全性チェックを使用します (プレーヤーの位置が範囲外ですか? 正しい範囲に設定します)。ボールの速度に上限を設定します。パス チェックも使用します。(バットはボールの移動経路にあるか?)

また、コードをリファクタリング (変数の名前を変更) して、他の人が何が起こっているのかを簡単に把握できるようにすることを検討してください。(つまり、position_x とは? ボールまたはプレーヤーの位置??)

将来のより複雑な例については、最小限の作業例を提供してください。(音などの不要なものを取り除きます)

幸運を!

于 2013-07-28T23:52:02.010 に答える
0

それを私が直した!

1 行のコードを追加するだけで済みました。

    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 に答える