2013-04-07 43 views
0

任何人都可以幫助我嗎?我無法通過簡單的方法來檢測球是否碰到槳,然後通過更改rect_change_y變量來反彈它。這裏的代碼是有效的,但是當它碰到遊戲的底部時,球不會與槳或死亡相互作用。如何使球彈跳,只要它擊中Python中的槳,Pygame(Breakout Recreation)

import pygame 

black = (0, 0, 0) 
white = (255, 255, 255) 
green = (0, 255, 0) 
red = (255, 0, 0) 

rect_x = 10 
rect_y = 250 

pad_x = 350 
pad_y = 480 

ball = 3 

rect_change_x = 1 
rect_change_y = 1 

pad_x_c = 0 

pygame.init() 

size=[700,500] 
screen=pygame.display.set_mode(size) 

pygame.mouse.set_visible(0) 

pygame.display.set_caption("Breakout Recreation WIP") 

done=False 

clock=pygame.time.Clock() 
# -------- Main Program Loop ----------- 
while ball != 0: 
    # ALL EVENT PROCESSING SHOULD GO BELOW THIS COMMENT 
    for event in pygame.event.get(): # User did something 
     if event.type == pygame.QUIT: # If user clicked close 
      done=True # Flag that we are done so we exit this loop 
     keys = pygame.key.get_pressed() #checking pressed keys 
     if keys[pygame.K_LEFT]: 
      pad_x_c -= 2 
     elif keys[pygame.K_RIGHT]: 
      pad_x_c += 2 
     else : 
      pad_x_c = 0 
    # ALL EVENT PROCESSING SHOULD GO ABOVE THIS COMMENT 
    # ALL GAME LOGIC SHOULD GO BELOW THIS COMMENT 
    # ALL GAME LOGIC SHOULD GO ABOVE THIS COMMENT 
    # ALL CODE TO DRAW SHOULD GO BELOW THIS COMMENT 
    # First, clear the screen to white. Don't put other drawing commands 
    # above this, or they will be erased with this command. 
    screen.fill(black) 
    # Draw the rectangle 
    pygame.draw.rect(screen,white,[rect_x,rect_y,15,15]) 
    pygame.draw.rect(screen,white,[pad_x,pad_y,50,10]) 
    # Move the rectangle starting point 
    rect_x += rect_change_x 
    rect_y += rect_change_y 
    pad_x += pad_x_c 
    # Bounce the ball if needed 
    if rect_y > 480 or rect_y < 10: 
     rect_change_y = rect_change_y * -1 
    if rect_x > 680 or rect_x < 5: 
     rect_change_x = rect_change_x * -1  
    if pad_x <= 5 : 
     pad_x_c = 0 
    if pad_x >= 645 : 
     pad_x_c = 0 
    # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT 

    pygame.display.flip() 

    clock.tick(100) 

pygame.quit() 

然後這裏是代碼,應該工作(對我),但沒有。

import pygame 

black = (0, 0, 0) 
white = (255, 255, 255) 
green = (0, 255, 0) 
red = (255, 0, 0) 

rect_x = 10 
rect_y = 250 

pad_x = 350 
pad_y = 480 

ball = 3 

rect_change_x = 1 
rect_change_y = 1 

pad_x_c = 0 

pygame.init() 

size=[700,500] 
screen=pygame.display.set_mode(size) 

pygame.mouse.set_visible(0) 

pygame.display.set_caption("Breakout Recreation WIP") 

done=False 

clock=pygame.time.Clock() 
# -------- Main Program Loop ----------- 
while ball != 0: 
    # ALL EVENT PROCESSING SHOULD GO BELOW THIS COMMENT 
    for event in pygame.event.get(): # User did something 
     if event.type == pygame.QUIT: # If user clicked close 
      done=True # Flag that we are done so we exit this loop 
     keys = pygame.key.get_pressed() #checking pressed keys 
     if keys[pygame.K_LEFT]: 
      pad_x_c -= 2 
     elif keys[pygame.K_RIGHT]: 
      pad_x_c += 2 
     else : 
      pad_x_c = 0 
    # ALL EVENT PROCESSING SHOULD GO ABOVE THIS COMMENT 
    # ALL GAME LOGIC SHOULD GO BELOW THIS COMMENT 
    # ALL GAME LOGIC SHOULD GO ABOVE THIS COMMENT 
    # ALL CODE TO DRAW SHOULD GO BELOW THIS COMMENT 
    # First, clear the screen to white. Don't put other drawing commands 
    # above this, or they will be erased with this command. 
    screen.fill(black) 
    # Draw the rectangle 
    pygame.draw.rect(screen,white,[rect_x,rect_y,15,15]) 
    pygame.draw.rect(screen,white,[pad_x,pad_y,50,10]) 
    # Move the rectangle starting point 
    rect_x += rect_change_x 
    rect_y += rect_change_y 
    pad_x += pad_x_c 
    # Bounce the ball if needed 
    if rect_y == pad_y: 
     if rect_x == pad_x: 
      rect_change_y = rect_change_y * -1 
    if rect_y > 490: 
     ball -= 1 
     rect_y = 250 
     rect_x = 10 
     rect_change_x = 1 
     rect_change_y = 1 
    if rect_y < 10: 
     rect_change_y = rect_change_y * -1 
    if rect_x > 680 or rect_x < 5: 
     rect_change_x = rect_change_x * -1  
    if pad_x <= 5 : 
     pad_x_c = 0 
    if pad_x >= 645 : 
     pad_x_c = 0 
    # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT 

    pygame.display.flip() 

    clock.tick(100) 

pygame.quit() 

最後,就如何使塊,做同樣的事情對他們來說,除了摧毀他們,而不是球有什麼建議?

謝謝大家!

回答

1

可以使用Rect類來表示球和槳,也利用這個類提供了方法優點:

  • Rect.move_ip移動矩形到位:

    myrect = pygame.Rect(0, 0, 10, 10) 
    myrect.move_ip(100, 50) 
    

    myrect左上角在(100,50)處並保持相同的寬度和高度。

  • Rect.clamp_ip確保矩形都在屏幕內。

    myrect = pygame.Rect(100, 0, 10, 10) 
    bounds = pygame.Rect(0, 0, 50, 50) 
    myrect.clamp_ip(bounds) 
    

    myrect左上角爲(40,0),在(10,50),其右下角內部邊界矩形。

  • Rect.colliderect檢查球和槳是否碰撞。

    myrect = pygame.Rect(0, 0, 10, 10) 
    another = pygame.Rect(5, 5, 10, 10) 
    print(myrect.colliderect(another)) # 1 
    

    由於myrect另一重疊,當你調用colliderect它返回1,表明有兩個矩形之間的衝突。


我真的很喜歡pygame的,所以我不介意重寫你的程序應用這些建議。希望它有幫助:

import pygame 

# Constants 
WIDTH = 700 
HEIGHT = 500 
SCREEN_AREA = pygame.Rect(0, 0, WIDTH, HEIGHT) 
BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

# Initialization 
pygame.init() 
screen = pygame.display.set_mode([WIDTH, HEIGHT]) 
pygame.mouse.set_visible(0) 
pygame.display.set_caption("Breakout Recreation WIP") 
clock = pygame.time.Clock() 

# Variables 
paddle = pygame.Rect(350, 480, 50, 10) 
ball = pygame.Rect(10, 250, 15, 15) 
paddle_movement_x = 0 
ball_direction = (1, 1) 
balls = 3 
done = False 

while not done and balls > 0: 

    # Process events 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     keys = pygame.key.get_pressed() 
     if keys[pygame.K_LEFT]: 
      paddle_movement_x = -2 
     elif keys[pygame.K_RIGHT]: 
      paddle_movement_x = 2 
     else: 
      paddle_movement_x = 0 

    # Move paddle 
    paddle.move_ip(paddle_movement_x, 0) 
    paddle.clamp_ip(SCREEN_AREA) 

    # Move ball 
    ball.move_ip(*ball_direction) 
    if ball.right > WIDTH or ball.left < 0: 
     ball_direction = -ball_direction[0], ball_direction[1] 
    elif ball.top < 0 or ball.bottom > HEIGHT or paddle.colliderect(ball): 
     ball_direction = ball_direction[0], -ball_direction[1] 
    ball.clamp_ip(SCREEN_AREA) 

    # Redraw screen 
    screen.fill(BLACK) 
    pygame.draw.rect(screen, WHITE, paddle) 
    pygame.draw.rect(screen, WHITE, ball) 
    pygame.display.flip() 
    clock.tick(100) 

pygame.quit() 
+0

謝謝!你能解釋一下新命令是如何工作的嗎?我從來沒有使用過它們。我喜歡你如何保留它的大部分,但我不知道move_ip是如何工作的或鉗子是如何工作的......謝謝!另外,現在是否有一種簡單的方法來檢測球是否碰到槳下方的底部? – Pip 2013-04-07 16:41:34

+0

@PythonInProgress我已經添加了小代碼示例來說明每種方法,並且我還修復了彈跳球運動的方向(出現了一個小錯誤)。 – 2013-04-07 17:30:09

+0

謝謝Rodas!最有幫助:P! – Pip 2013-04-09 21:20:39