我正在创建一个带有NPC的平铺游戏。我可以成功创建一个NPC,但是当我绘制多个NPC时,它们会在几秒钟的代码运行后共享相同的位置。我创建了这个示例来演示我的意思。
import pygame, random, math
screen = pygame.display.set_mode((800,600))
NPCP = {'Bob' : (2,6), 'John' : (4,4)} # 25, 19 max width and height
pygame.time.set_timer(pygame.USEREVENT, (100))
sMove = True
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.USEREVENT:
sMove = True
screen.fill((0,0,255))
for name in NPCP:
x,y = NPCP.get(name)
pygame.draw.rect(screen, (255,0,0), (x*32,y*32,50,50))
if sMove == True:
move = random.randint(1,4)
sMove = False
if move == 1:
if math.floor(y) > 2:
y -= 2
if move == 2:
if math.floor(y) < 17:
y += 2
if move == 3:
if math.floor(x) < 23:
x += 2
if move == 4:
if math.floor(x) > 2:
x -= 2
print(x,y)
NPCP[name] = (x,y)
pygame.display.flip()
在这种情况下,我使用字典来创建这些NPC或矩形。我用一个计时器和一个从1到4的随机数来移动它们,以选择要进行的移动。我使用for循环为每个NPC运行。我想知道如何让这些矩形不以相同的方式移动,并且使位置最终不要更改为相同的位置并以彼此不同的方式移动。我也希望它使用字典来做到这一点。
答案 0 :(得分:3)
如果要单独移动对象,则必须为每个对象生成随机方向。
在您的代码中,仅为所有对象生成方向信息,因为在生成第一个对象的方向后立即设置sMove
False
。该方向用于所有对象。
此外,移动方向(move
)永远不会重置为0。这将导致在所有后续帧中应用最后的随机方向,直到再次改变方向为止。
if sMove == True: move = random.randint(1,4) sMove = False
重置sMove
在循环后重置move
,并解决该问题:
for name in NPCP:
x,y = NPCP.get(name)
pygame.draw.rect(screen, (255,0,0), (x*32,y*32,50,50))
if sMove == True:
move = random.randint(1,4)
if move == 1:
if math.floor(y) > 2:
y -= 2
if move == 2:
if math.floor(y) < 16:
y += 2
if move == 3:
if math.floor(x) < 22:
x += 2
if move == 4:
if math.floor(x) > 2:
x -= 2
print(x,y)
NPCP[name] = (x,y)
sMove = False # wait for next timer
move = 0 # stop moving