如何解决有人知道为什么吃豆子不尊重墙壁吗?当我按下按键在墙壁之间移动吃豆子时
我正在尝试制作一个像 pygame 一样的吃豆人游戏,现在我只想让他穿过迷宫而不超出迷宫的墙壁。但是我遇到了一些问题,当我按下按键移动吃豆人时,他最终在墙之间打电话,虽然他没有超过墙,但最终会干扰坐标系并在游戏命令期间开始出现一系列错误.有谁知道为什么会发生这种情况以及如何解决?
import pygame
pygame.init()
window = pygame.display.set_mode((800,600),0)
# Color used in the game
YELLOW = (255,255,0)
BLACK = (0,0)
BLUE = (13,56,143)
speed = 1
class Scenery:
def __init__(self,size,character):
self.character = character
self.size = size
self.matrix = [
[2,2,2],[2,1,2]
]
def paint_line(self,surface,line_index,line):
for column_index,column in enumerate(line):
x_Box = column_index * self.size
y_Box = line_index * self.size
half_size = self.size // 2
color = BLACK
if column == 2:
color = BLUE
pygame.draw.rect(surface,color,(x_Box,y_Box,self.size,self.size),0)
if column == 1:
pygame.draw.circle(surface,YELLOW,(x_Box + half_size,y_Box + half_size),self.size//10,0)
def paint_scenery(self,surface):
for line_index,line in enumerate(self.matrix):
self.paint_line(surface,line)
def calculate_rules(self):
column_character = self.character.intention_column
line_character = self.character.intention_line
if 0 <= column_character < 28 and 0 <= line_character < 29:
if self.matrix[line_character][column_character] != 2:
self.character.aprove_movement()
class Pacman:
def __init__(self,size):
self.column = 1
self.line = 1
self.x_center = 400
self.y_center = 300
self.size = size # 2x radius and size/number of the cells
self.speed_x = 0
self.speed_y = 0
self.radius = self.size // 2
self.intention_column = self.column
self.intention_line = self.line
def calculate_rules(self):
# calculate the movimentantion
self.intention_column = self.intention_column + self.speed_x
self.intention_line = self.intention_line + self.speed_y
self.x_center = int( self.column * self.size + self.radius )
self.y_center = int( self.line * self.size + self.radius )
def draw_pacman(self,surface):
# Draw pacman's character
pacman_body = pygame.draw.circle(surface,(self.x_center,self.y_center),self.radius,0)
# Coordinates
x_eye_position = ( self.x_center + int( self.radius/4 ) )
y_eye_position = ( self.y_center - int( (self.radius/2) ) )
point_a = (self.x_center,self.y_center) # Center
point_b = ((self.x_center + self.radius),self.y_center) # Right Center
point_c = ((self.x_center + self.radius),(self.y_center - self.radius)) # Superior Right Center
points = [point_a,point_b,point_c]
# Pacman
pacman_eye = pygame.draw.circle(surface,BLACK,(x_eye_position,y_eye_position),int(self.radius/10),0)
pacman_mouth = pygame.draw.polygon(surface,points,0)
# Make the draws
pacman_body
pacman_eye
pacman_mouth
def calculate_events(self,events):
for e in events:
if e.type == pygame.QUIT: # check if the user have clicked on the X Box to quit
exit()
elif e.type == pygame.KEYDOWN:
if e.key == pygame.K_RIGHT or e.key == pygame.K_d:
self.speed_x = speed
elif e.key == pygame.K_LEFT or e.key == pygame.K_a:
self.speed_x = -speed
elif e.key == pygame.K_UP or e.key == pygame.K_w:
self.speed_y = -speed
elif e.key == pygame.K_DOWN or e.key == pygame.K_s:
self.speed_y = speed
elif e.type == pygame.KEYUP:
if e.key == pygame.K_RIGHT or e.key == pygame.K_d:
self.speed_x = 0
elif e.key == pygame.K_LEFT or e.key == pygame.K_a:
self.speed_x = 0
elif e.key == pygame.K_UP or e.key == pygame.K_w:
self.speed_y = 0
elif e.key == pygame.K_DOWN or e.key == pygame.K_s:
self.speed_y = 0
def aprove_movement(self):
self.column = self.intention_column
self.line = self.intention_line
if __name__ == '__main__':
size = 600 // 30
pacman = Pacman(size)
scenary = Scenery(size,pacman)
while True:
# Game Rules
pacman.calculate_rules()
scenary.calculate_rules()
# figures
window.fill(BLACK)
scenary.paint_scenery(window)
pacman.draw_pacman(window)
pygame.display.update()
pygame.time.delay(100)
events = pygame.event.get()
pacman.calculate_events(events)
所以每次我按住键移动几秒钟,吃豆人就会越过项目的蓝色墙壁,有谁知道为什么以及如何修复它?
看起来他只是传送到另一边,而不是角色坐标系的错误
解决方法
有两个问题:
-
intention_column
和intention_line
取决于当前的colume
和line
,而不是之前的intention_column
和intention_line
。即使有墙,intention_column
和intention_line
也会递增。colume
和line
但是只有在可能移动时才会增加:
class Pacman:
# [...]
def calculate_rules(self):
# calculate the movimentantion
self.intention_column = self.column + self.speed_x
self.intention_line = self.line + self.speed_y
- 仅在更改
x_center
或y_center
时更新column
和line
:
class Pacman:
# [...]
def aprove_movement(self):
self.column = self.intention_column
self.line = self.intention_line
self.x_center = int( self.column * self.size + self.radius )
self.y_center = int( self.line * self.size + self.radius )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。