2013-07-28 20 views
0

我有一個類似Pong的遊戲Pygame,現在看起來非常棒,但有幾件事我不明白。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() 

我真的需要這些東西幫助。提前致謝!

更新:我通過減少每次撞到後牆時增加的速度來解決最後一個問題,但我仍然需要前兩個幫助。我不明白速度x1與速度有關的事實1。它是與牆壁位置,還是它的碰撞?請幫忙!

+0

海森堡有同樣的問題xD – eri

回答

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')某個位置修復了這兩個錯誤。

+0

隨意接受你自己的答案文件的目的。 – Haz

0

您需要更多的碰撞檢測迭代。

P.S. Box2D - 帶有2d物理學的大型圖書館,歐拉方程等。它有python綁定。

0

不只是依靠碰撞檢測。使用完整性檢查(玩家的位置是否在界限之外?將其設置爲正確的界限)。 設定球的速度上限。也使用路徑檢查。 (蝙蝠是否在球的移動路徑中?)

另外,考慮重構(重命名變量)代碼,以便其他人更容易找到正在發生的事情。 (我的意思是,什麼是position_x?球或球員的位置?)

對於將來更復雜的例子,請提供一個最小工作示例。 (去掉聲音等不必要的東西)

祝你好運!