对象离开屏幕

2024-06-28 19:36:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

好吧,我有两个球拍在这个乒乓球游戏称为蓝色和黄色矩形。我可以移动它们,但它们会离开屏幕。我该怎么预防呢。我在网上看了一下,但似乎什么也没用。我考虑过在屏幕周围放一些矩形来做一个碰撞点的论证,当蓝色/黄色的桨碰到它时,它们不会再移动了,但是我不确定如何在应该破坏代码的情况下做到这一点?谢谢你的帮助。。在


Tags: orthekeyrecteventifbluechange
3条回答

在改变y坐标之前,你应该检查一下它是否离开了屏幕的边缘。看到了吗

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

虽然正如您所见,使用数字可能会有点混乱,这就是为什么您应该避免硬编码。最好有一个display_heightdisplay_width,和y_speed变量。基本上,除了初始化变量之外,你应该只使用0作为数字。另外,请注意在if语句中省略+ y_speed时会发生什么。在

看起来你把屏幕的高度设置为500像素。也许你可以在移动之前检查一下你的球拍是否在屏幕的极限。在

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

我建议您开始使用^{} class,因为它使处理此类情况变得容易。而且,您的代码将变得更干净和更短。在

下面是一个使用Rect的示例。请注意,我只是使用^{}来确保玩家的划桨不会离开屏幕:

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

相关问题 更多 >