如果对象在pygame中击中边界,如何停止移动

时间:2015-08-04 15:53:02

标签: python pygame

import pygame
import random

pygame.init()
black = (0,0,0)
red = (255,0,0)

display_width = 800
display_height = 600
FPS = 20

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("The Space Jumpers")

img = pygame.image.load('starship2.png')
spritesize = 50
boundlimit = 200

clock = pygame.time.Clock()

font = pygame.font.SysFont(None, 25)

def gameLoop():
    gameExit = False
    gameOver = False
    lead_x = display_width / 2
    lead_y = display_height / 2
    xchange = 0
    ychange = 0

    randBlockX = random.randrange(0,boundlimit+1)
    randBlockY = random.randrange(0,575)

    while not gameExit:
        gameDisplay.blit(img, [lead_x,lead_y])
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    xchange = -spritesize / 2
                    ychange = 0
                if event.key == pygame.K_RIGHT:
                    xchange = spritesize / 2
                    ychange = 0
                if event.key == pygame.K_UP:
                    ychange = -spritesize / 2
                    xchange = 0
                if event.key == pygame.K_DOWN:
                    ychange = spritesize / 2
                    xchange = 0
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    xchange = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    ychange = 0











        lead_x += xchange
        lead_y += ychange 

        gameDisplay.fill(black)
        pygame.draw.rect(gameDisplay,red, [randBlockX, randBlockY, 600, 25])

        if (lead_x+spritesize < randBlockX and randBlockY<lead_y<randBlockY+25) :
            randBlockX = random.randrange(0,boundlimit+1)
            randBlockY = random.randrange(0,575)
        elif (lead_x+spritesize < randBlockX and randBlockY<lead_y<randBlockY+25 ):
            randBlockX = random.randrange(0,boundlimit+1)
            randBlockY = random.randrange(0,575)
        elif (lead_x > randBlockX+600 and randBlockY<lead_y<randBlockY+25):
            randBlockX = random.randrange(0,boundlimit+1)
            randBlockY = random.randrange(0,575)
        elif (lead_x > randBlockX+600 and randBlockY<lead_y<randBlockY+25):
            randBlockX = random.randrange(0,boundlimit+1)
            randBlockY = random.randrange(0,575)






        clock.tick(FPS)   


    pygame.quit()
    quit()

gameLoop()

这是我当前的代码,在这段代码中,当对象(精灵)碰到边界时,它会继续移动,但我想要做的是,我想要阻止对象在到达边界时的移动,例如,当物体撞击左边界时,它不应再向左移动。你有点想法,它是一个简单的游戏

3 个答案:

答案 0 :(得分:1)

不使用两个变量(lead_xlead_y)来存储对象的位置,而是使用Rect。它就像

一样简单
gameDisplay = pygame.display.set_mode((display_width,display_height))
gameDisplay_rect = gameDisplay.get_rect()

img = pygame.image.load('starship2.png')
img_rect = img.get_rect(center=gameDisplay_rect.center)

要绘制对象,只需执行以下操作:

gameDisplay.blit(img, img_rect)

现在,移动你的对象,而不是

 lead_x += xchange
 lead_y += ychange 

你可以做到

 img_rect.move_ip(lead_x, lead_y)
 img_rect.clamp_ip(gameDisplay_rect)

clamp_ip会阻止您的对象离开屏幕。

答案 1 :(得分:0)

我认为这会奏效: 尝试将你的if语句(如果pygame.key == pygame.K_LEFT :)更改为(如果pygame.key == pygame.K_LEFT和x&gt; 0:)

我一直在为一个学校项目挣扎同样的事情并且已经得到它以便在你触摸边界时停止精灵,但如果你垃圾邮件那么你可以通过。我目前有一个if语句说(如果x&lt; 0:x_change = 0),但我没有尝试过我建议的那个。我希望它有效。

答案 2 :(得分:0)

sloth's method肯定会在很多方面做得更好,但如果您仍想保留旧的lead_xlead_y结构,则可以在事件循环之外添加单独的语句:

if lead_x <= 0:
    lead_x += 10 # just use any small distance to push you back to place every frame
elif lead_x >= display_width:
    lead_x -= 10

以及每个方向的等等。