2013-04-07 4 views
0

에서 외륜을 치는 경우에만 공을 튀게 만드는 방법이 누구든 도와 줄 수 있습니까? 공이 패들에 부딪쳤을 때이를 감지하고 rect_change_y 변수를 변경하여 바운스를 감지하는 간단한 방법을 만드는 데 문제가 있습니다. 여기는 작동하는 코드이지만 공이 패들과 상호 작용하지 않거나 게임의 바닥에 닿았을 때 죽지 않습니다.공이 파이썬, 패기 (브레이크 아웃 레크 리 에이션)

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 클래스를 사용하고, 또한이 클래스가 제공하는 방법을 활용할 수 있습니다

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

  • Rect.move_ip이 자리에 사각형을 이동

    내역 왼쪽 위 모서리는 (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을 반환 이후.


    정말 파이 게임처럼, 그래서 이러한 제안을 적용하는 프로그램을 재 작성 괜찮다

. 도움이 되었기를 바랍니다.

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

+0

@PythonInProgress 각 메소드를 설명하기 위해 코드의 작은 샘플을 추가했으며 튀는 공 이동 방향도 수정했습니다 (작은 오류가 있음). –

+0

감사합니다 Rodas! 가장 도움이되는 : P! – Pip