我最近在程序中添加了碰撞检测功能,因此,pacman的运动已完全停止,我似乎无法弄清原因。在添加碰撞检测之前,运动很好。下面是我的代码,如果有人可以帮助我,我将不胜感激!
# Import relevant modules
import pygame, sys
from pygame.locals import *
# Colours
global BLACK
BLACK = (0,0,0)
def Pacman():
pygame.init()
# Creating screen
global screen
screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
screen = pygame.display.set_mode((0,0), pygame.RESIZABLE)
# Setting window caption
pygame.display.set_caption('Pacman')
# Loading two images
global pacman_image
global block_image
pacman_image = pygame.image.load("pacmanphoto.png").convert_alpha()
block_image = pygame.image.load("blockphoto.png").convert_alpha()
clock = pygame.time.Clock()
x = 10
y = 10
pygame.key.set_repeat(10, 10)
# Movement
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
y -= 10
if event.key == pygame.K_DOWN:
y += 10
if event.key == pygame.K_RIGHT:
x += 10
if event.key == pygame.K_LEFT:
x -= 10
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# Inside The Pacman Function
pac_x = 10
pac_y = 10
block_x = 50
block_y = 50
# getting the block's height and width
block_width, block_height = block_image.get_size()
##### where collision detection should be ####
if block_x + block_width > pac_x > block_x:
if block_y + block_height > pac_y > block_y:
print('Collision occurred.')
pac_x = block_x
pac_y = block_y
screen.blit(pacman_image, (x, y))
screen.blit(block_image, (block_x, block_y))
clock.tick(12)
pygame.display.update()
screen.fill(BLACK)
Pacman()
pygame.quit()
就像现在的代码一样,让“吃豆人”运动起来没有问题,但是碰撞检测代码没有任何作用。这是因为您正在使用元组(x,y)
将“吃豆人”绘制到屏幕上,而碰撞检测代码仅操纵另外两个局部变量pac_x
和pac_y
,而绘制代码从未使用过这些变量。解决方法是删除以下两行:
pac_x = 10
pac_y = 10
并更换所有出现pac_x
,并pac_y
有x
和y
。这样可以释放精灵来回移动。
冲突检测的问题仍然存在,不幸的是,该问题的解决方案比两个if
语句更复杂。最重要的是,您需要考虑吃豆人精灵的宽度,因此需要替换
if block_x + block_width > x > block_x:
用类似的东西
if x < block_x and (x + pac_width) > block_x:
发生左侧碰撞
if x < (block_x + block_width) and (x + pac_width) > (block_x + block_width):
发生右侧碰撞 应该对顶部和底部碰撞进行类似的检查,吃豆人应该被夹住的方向应该取决于碰撞发生的哪一侧。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句