gpt4 book ai didi

python - 我如何在pygame中创建一个 "rpg door"效果,我的方法有什么问题?

转载 作者:行者123 更新时间:2023-12-04 15:16:44 25 4
gpt4 key购买 nike

我正在创建一个游戏,在这个游戏中,靠近一扇门(使用 Rect 函数定义)会调用一个函数,该函数会加载一个新的游戏屏幕,从而产生穿过屋内那扇门的效果。我尝试对 coming out 机制做同样的事情,我尝试用一​​个 Rect 对象定义一个区域并制作它,以便当玩家靠近它时调用主游戏循环并且它会产生 coming out 的效果door 但这样做会使玩家陷入屏幕逐渐消失的无限循环中。下面附上部分代码,完整代码为here

这是门碰撞检测

    out = pygame.Rect(360, 580, 80, 10)
player_rect = playerImgXL.get_rect(topleft=(playerXxl, playerYxl))

if player_rect.colliderect(out):
game() # coming out of the house

这是游戏循环函数

def game():
global present_dialogue
global current_dialogue
global playerX
global playerY
clock.tick(12)
mixer.music.pause()
mixer.music.load('pallet_music.mp3')
# mixer.music.play(100)
playerX_change = 0
playerY_change = 0
running = True
while running:
present_dialogue = None
current_dialogue = None
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
redrawgamewindow()
pygame.display.update()

这不是整个游戏循环,只有 sys.exit 语句和显示更新语句之间的事件检测和碰撞检测

这是我在游戏循环结束时调用的 redrawgamewindow 函数

def redrawgamewindow():
global walkcount
scr.fill((0, 0, 0))
scr.blit(pallet, (60, 0))
if current_dialogue:
scr.blit(*current_dialogue)
npc_one_dialogue()
if walkcount + 1 >= 29:
walkcount = 0
if up:
scr.blit(WalkFront[walkcount // 7], (playerX, playerY))
walkcount += 1
elif down:
scr.blit(WalkBack[walkcount // 7], (playerX, playerY))
walkcount += 1
elif left:
scr.blit(WalkLeft[walkcount // 7], (playerX, playerY))
walkcount += 1
elif right:
scr.blit(WalkRight[walkcount // 7], (playerX, playerY))
walkcount += 1
else:
player(playerX, playerY)
if present_dialogue:
scr.blit(*present_dialogue)
npc_two_dialogue()

最佳答案

需要进行一些更改以防止淡入淡出循环:

  • inhouse_oak函数中,重置玩家进入房间时的起始位置

  • 当玩家退出房间时,回到主游戏循环

    def inhouse_oak():
    global playerXxl
    global playerYxl
    playerXxl = 365 # reset starting position
    playerYxl = 480
    ...........
    while running:
    .................
    if player_rect.colliderect(out):
    return # return to main loop
    # game() # coming out of the house
  • 在主循环中,当玩家离开房间时,将玩家移离门

      door3 = pygame.Rect(462, 348, 25, 5)
    if player_rect.colliderect(door3):
    fade(800, 600)
    inhouse_oak() # Oak's Lab door
    playerY_change = playerX_change = 0 # stop player movement
    playerY += 10 # move away from door

要在离开房间时添加淡入淡出,请进行以下更改:

  • 泛化 fade 函数。

    def fade(x, y, rgw):  # last parameter is screen function to call
    fade = pygame.Surface((x, y))
    fade.fill((0, 0, 0))
    for alpha in range(0, 300):
    fade.set_alpha(alpha)
    rgw(True) # fading = True
    scr.blit(fade, (0, 0))
    pygame.display.update()
  • 将淡入淡出参数添加到主游戏函数。

    def redrawgamewindow(fading=False):
  • 在房间函数中加入fading参数,并在更新屏幕前检查该参数,防止屏幕闪屏。

    def redrawgamewindow_oak(fading=False):
    .........
    if not fading: pygame.display.update() # prevent flash if fading
  • 更新 redrawgamewindow 函数中的淡入淡出调用。

      door3 = pygame.Rect(462, 348, 25, 5)
    if player_rect.colliderect(door3):
    fade(800, 600, redrawgamewindow) # fade main game
    inhouse_oak() # Oak's Lab door
    playerY_change = playerX_change = 0
    playerY += 10 #playerX_change
  • redrawgamewindow_oak中,离开房间时,调用fade函数。

      if player_rect.colliderect(out):
    fade(800, 600, redrawgamewindow_oak) # fade room
    return # return to main loop
    #game() # coming out of the house

关于python - 我如何在pygame中创建一个 "rpg door"效果,我的方法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64195475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com