Pygame当移动到另一个对象时,玩家对象应该停止



我正在pygame中开发这个原型,在那里你可以控制一个正方形,我目前正在处理与其他对象的碰撞。当玩家与物体碰撞时,玩家应该无法移动到物体中。

import pygame,sys
pygame.init()
Clock = pygame.time.Clock()
FPS = 60
size = [1000,800]
bg = [0,0,0]
screen = pygame.display.set_mode(size)
pygame.display.set_caption('Movement')

class Player:
def __init__(self,vel,x,y):
self.vel = vel

self.x = x
self.y = y
self.jump = False
def move(self):
k = pygame.key.get_pressed()
if k[pygame.K_a]:
self.x -= self.vel
if k[pygame.K_d]:
self.x += self.vel
if k[pygame.K_w]:
self.y -= self.vel
if k[pygame.K_s]:
self.y += self.vel

def draw(self):
pygame.draw.rect(screen,"red",(self.x,self.y,50,50))
def bordercollsion(self):
if self.x <=0:
self.x=0
if self.x >=950:
self.x=950
if self.y <=0:
self.y=0
if self.y >=750:
self.y=750


def do(self):
self.move()
self.draw()
self.bordercollsion()


player = Player(1,500,600)
while True:
screen.fill(bg)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
print(pygame.key.name(event.key))
if event.key == pygame.K_ESCAPE:
run = False
pygame.quit
sys.exit()

player.do()
en = pygame.draw.rect(screen,"blue",(10,20,50,50))
pygame.display.update()

请参阅如何在pygame中检测碰撞?。使用pygame.Rect/colliderect来检测矩形的冲突。

存储玩家的位置

player_pos = player.x, player.y

移动播放器:

player.do()

为玩家和障碍物设置一个矩形:

player_rect = pygame.Rect(player.x, player.y, 50, 50)
obstacle_rect = pygame.Rect(10, 20, 50, 50)

当矩形碰撞时,重置玩家的位置:

if player_rect.colliderect(obstacle_rect):
player.x, player.y = player_pos

完成应用程序循环

while True:
screen.fill(bg)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
print(pygame.key.name(event.key))
if event.key == pygame.K_ESCAPE:
run = False
pygame.quit
sys.exit()

player_pos = player.x, player.y
player.do()
player_rect = pygame.Rect(player.x, player.y, 50, 50)
obstacle_rect = pygame.Rect(10, 20, 50, 50)
if player_rect.colliderect(obstacle_rect):
player.x, player.y = player_pos
en = pygame.draw.rect(screen,"blue",(10,20,50,50))
pygame.display.update()

我看到有人已经发布了你的问题的好答案,但我的答案已经被塞进了你的原始代码中。我已将更改标记为"###",以便更容易查找/识别。

PyGame中有几种检测碰撞的方法;这演示了PyGamescolliderect()方法。还有一种使用精灵和遮罩的方法。你使用的方法取决于你需要什么。

import pygame,sys
pygame.init()
Clock = pygame.time.Clock()
FPS = 60
size = [1000,800]
bg = [0,0,0]
screen = pygame.display.set_mode(size)
pygame.display.set_caption('Movement')

class Buscemi():    ### new class for the blue square
'''Blue rectangle with which we must collide!'''    ###
# def __init__(self):
# pass
# Normally you'd have an __init__() method, but this is one of
#   those unusual cases were we don't actually need one.  It still
#   returns a Buscemi object

def draw(self):                                             ###
'''Draws the rectangle and returns the Rect().'''       ###
return pygame.draw.rect(screen,"blue",(10,20,50,50))    ###

class Player:
def __init__(self,vel,x,y,buscemi): ### added buscemi argument
self.vel = vel
self.buscemi=buscemi    ### blue rectangle
self.x = x
self.y = y
self.xold = None    ### for storing x before moving
self.yold = None    ### for storing y before moving
self.jump = False
self.draw()     ### because we need self.dude
def move(self):
if not self.dude.colliderect(self.buscemi.draw()):  ### redraw blue and check collision
k = pygame.key.get_pressed()
self.xold = self.x  ###
self.yold = self.y  ###
if k[pygame.K_a]:
self.x -= self.vel
if k[pygame.K_d]:
self.x += self.vel
if k[pygame.K_w]:
self.y -= self.vel
if k[pygame.K_s]:
self.y += self.vel
else:   ### restore x and y
self.x = self.xold  ###
self.y = self.yold  ###

def draw(self):
self.dude = pygame.draw.rect(screen,"red",(self.x,self.y,50,50))    ### named the rectangle
def bordercollsion(self):
if self.x <=0:
self.x=0
if self.x >=950:
self.x=950
if self.y <=0:
self.y=0
if self.y >=750:
self.y=750


def do(self):
self.move()
self.draw()
self.bordercollsion()


en = Buscemi()  ### we need en as an object
player = Player(1,500,600,en)   ### added one more argument
while True:
screen.fill(bg)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
print(pygame.key.name(event.key))
if event.key == pygame.K_ESCAPE:
run = False
pygame.quit
sys.exit()

# en = pygame.draw.rect(screen,"blue",(10,20,50,50))    ### made a class out of this
player.do()
pygame.display.update()

最新更新