物体移出屏幕

时间:2016-03-31 20:48:17

标签: python pygame

import pygame
#Colors, Allways you need colors!!!!
BLACK = ( 0, 0, 0)
GREEN = ( 0, 255, 0)
WHITE = ( 255, 255, 255)
RED = ( 255, 0, 0)
ORANGE = ( 255, 115, 0)
YELLOW = ( 242, 255, 0)
BROWN = ( 115, 87, 39)
PURPLE = ( 298, 0, 247)
GRAY = ( 168, 168, 168)
PINK = ( 255, 0, 234)
BLUE = ( 0, 0 , 255)
pygame.init()
# Screen
screen = pygame.display.set_mode([700,500])
#Name of thewindow
pygame.display.set_caption("Trial to make PONG")
# Any variables!

x_speed = 0
y_speed = 0

x_coord = 10
y_coord = 250

x = 670
y = 250
other_speed = 0
other_speed2 = 0

rect_x = 50
rect_y = 50

rect_change_x = 5
rect_change_y = 5
clock = pygame.time.Clock()
#Sounds,maybe needed?

#Main Loop__________

done = False

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

             # User pressed down on a key
        elif event.type == pygame.KEYDOWN:
            # Figure out if it was an arrow key. If so
            # adjust speed.

            if event.key == pygame.K_UP:
                y_speed = -5
            elif event.key == pygame.K_DOWN:
                y_speed = 5
            elif event.key == pygame.K_w:
                other_speed2 = -5
            elif event.key == pygame.K_s:
                other_speed2 = 5

    # User let up on a key
        elif event.type == pygame.KEYUP:
        # If it is an arrow key, reset vector back to zero
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                x_speed = 0
            elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                y_speed = 0
            elif event.key == pygame.K_w or event.key == pygame.K_s:
                other_speed2 = 0


# Move the object according to the speed vector.
    x_coord += x_speed
    y_coord += y_speed
    x +=  x_speed
    y +=  other_speed2


    screen.fill(BLACK)

    pygame.draw.rect(screen,BLUE,[x_coord,y_coord,20,60])
    pygame.draw.rect(screen,YELLOW,[x,y,20,60])

    if x > 650 or x < 0:

    # Draw the rectangle
    pygame.draw.ellipse(screen, BLUE, [rect_x, rect_y, 50, 50])

    # Move the rectangle starting point
    rect_x += rect_change_x
    rect_y += rect_change_y

    if rect_x > 650 or rect_x < 0:
        rect_change_x = rect_change_x * -1
    if rect_y > 450 or rect_y < 0:
        rect_change_y = rect_change_y * -1





    pygame.display.flip()
    clock.tick(60)

pygame.quit()

好的,所以我在这个乒乓球游戏中有2个桨,称为蓝色和黄色矩形。我可以移动他们,但他们离开了屏幕。我该如何防止这种情况。我看上去在线,但似乎没有任何工作。我想在屏幕周围放置矩形来制作一个碰撞点参数,当蓝色/黄色桨击中它时它们不会再移动,但是我不知道如何用破坏代码来做到这一点?谢谢你的帮助......

3 个答案:

答案 0 :(得分:4)

在更改y坐标之前,您应该检查它是否在屏幕边缘之外。参见

if y_coord + y_speed >= 0 and y_coord + y_speed + 60 <= 500:
    y_coord += y_speed

虽然你可以看到它使用数字会有点混乱,这就是你应该避免硬编码的原因。拥有display_heightdisplay_widthy_speed变量会更好。基本上,在初始化变量之外,您应该只有0作为数字。另外,请注意当您在if语句中省略+ y_speed时会发生什么。

答案 1 :(得分:3)

我建议您开始使用Rect class,因为这样可以轻松处理此类案例。此外,您的代码将变得更清晰,更短。

以下是使用Rect的示例。请注意,我只是使用clamp_ip来确保播放器拨片无法离开屏幕:

import pygame

BLACK = pygame.color.Color('Black')
YELLOW = pygame.color.Color('Yellow')
BLUE = pygame.color.Color('Blue')

pygame.init()
screen = pygame.display.set_mode([700,500])
screen_rect = screen.get_rect()

pygame.display.set_caption("Trial to make PONG")

blue_rect = pygame.Rect(10, 250, 20, 60)
yellow_rect = pygame.Rect(670, 250, 20, 60)
ball_rect = pygame.Rect(50, 50, 50, 50)

ball_x_speed = 5
ball_y_speed = 5

clock = pygame.time.Clock()

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    # check all pressed keys and move the paddles
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_UP]: blue_rect.move_ip(0, -5)
    if pressed[pygame.K_DOWN]: blue_rect.move_ip(0, 5)
    if pressed[pygame.K_w]: yellow_rect.move_ip(0, -5)
    if pressed[pygame.K_s]: yellow_rect.move_ip(0, 5)

    # ensure paddles stay on screen
    blue_rect.clamp_ip(screen_rect)
    yellow_rect.clamp_ip(screen_rect)

    # move the ball
    ball_rect.move_ip(ball_x_speed, ball_y_speed)

    # check if the ball needs to change direction
    if ball_rect.x  + ball_rect.width > screen_rect.width or ball_rect.x < 0:
        ball_x_speed = ball_x_speed * -1
    if ball_rect.y  + ball_rect.height> screen_rect.height or ball_rect.y < 0:
        ball_y_speed = ball_y_speed * -1

    # draw everything
    screen.fill(BLACK)
    pygame.draw.ellipse(screen, BLUE, ball_rect)
    pygame.draw.rect(screen,BLUE, blue_rect)
    pygame.draw.rect(screen,YELLOW, yellow_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

答案 2 :(得分:0)

您似乎将屏幕高度设置为500像素。也许你可以在移动之前检查你的拨片是否处于屏幕极限。

newY = y_coord + y_speed
if newY >= 0 and newY + PADDLE_HEIGHT < SCREEN_HEIGHT:
    y_coord = newy