当前位置: 首页 > 知识库问答 >
问题:

PyGame hitbox闪烁

壤驷华辉
2023-03-14

我试图用pyplay制作一个游戏,我几乎完成了,但我想让被画在墙上的盒子不闪烁,这些红色的盒子在整个游戏中闪烁,我不想让它们闪烁,最后,我在一个if条件下调用player碰撞函数,在这里每当我制作新的碰撞器时,我每次都要在if条件下添加函数,我想要的是碰撞器对象自动调用这个函数,而不需要我在if语句中为碰撞器的每个实例调用它对象。请指导我如何这样做。

def redrawGameWindow():
    win.blit(bg, (-50,-200))
    man.draw(win)
    #man.drawhitbox(win)
    pygame.display.update()


#mainloop

man = player(200, 410, 64,64)
run = True
while run:
    collider1 = wall(500, 400, 200, 200, True)
    collider2 = wall(200,100,50, 50, False)
    collider3 = wall(700,100,50, 50, False)
    collider4 = wall(900,100,50,50, True)
    clock.tick(60)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    x, y = man.x, man.y

    if keys[pygame.K_a] and man.x > man.vel:
        x -= man.vel
        man.left = True
        man.right = False
    elif keys[pygame.K_d] and man.x < scrWidth - man.width - man.vel:
        x += man.vel
        man.right = True
        man.left = False
    elif keys[pygame.K_w] and man.y > man.vel:
        y -= man.vel
        man.left = False
        man.right = False
    elif keys[pygame.K_s] and man.y < scrHeight - man.height - man.vel:
        y+= man.vel
        man.left = False
        man.right = False
    else:
        man.right = False
        man.left = False
        man.walkCount = 0

    man.hitbox(15, 0, 31, 17)
    player_rect = pygame.Rect(x, y, 50, 55)
    if collider2.playerCollide(player_rect) == False and collider1.playerCollide(player_rect) == False and collider3.playerCollide(player_rect) == False and collider4.playerCollide(player_rect) == False:
        man.x, man.y = x, y
    redrawGameWindow()
pygame.quit()

共有1个答案

袁和通
2023-03-14

该问题是由对pygame的多次调用引起的。陈列更新()。删除对pygame的调用。陈列从类wall更新(),只需执行1个pygame。陈列update()重画游戏窗口的末尾
但是,在绘制框之前必须先绘制背景,否则背景将覆盖框:

def redrawGameWindow():
    # win.blit(bg, (-50,-200)) <--- DELETE
    man.draw(win)
    #man.drawhitbox(win)
    pygame.display.update()
run = True
while run:
    win.blit(bg, (-50,-200)) # <--- ADD

    collider1 = wall(500, 400, 200, 200, True)
    collider2 = wall(200,100,50, 50, False)
    collider3 = wall(700,100,50, 50, False)
    collider4 = wall(900,100,50,50, True)

    # [...]

    redrawGameWindow()

通过创建碰撞器列表简化代码:

colliders = [
   wall(500, 400, 200, 200, True),
   wall(200,100,50, 50, False),
   wall(700,100,50, 50, False),
   wall(900,100,50,50, True)] 
player_rect = pygame.Rect(x, y, 50, 55)
if not any(c.playerCollide(player_rect) for c in colliders):
    man.x, man.y = x, y
 类似资料:
  • 这是因为在开发模式下,为了通过 Webpack 实现热加载,CSS代码是打包在 JavaScript 代码中,并动态打到页面中去,从而元素重绘引起了闪烁。 不用担心,在生产模式下,CSS代码会单独打包至独立的文件并置于head标签内,不会出现页面闪烁的现象。

  • 我在Lollipop上的共享元素转换中看到了奇怪的事情。共享元素在开始动画之前闪烁(请看视频https://www.youtube.com/watch?v=DCoyyC_S-9A) 我不知道为什么会这样。但是,当我添加

  • 减低闪烁    以Interlace(交错扫描)方式在电视机输出PSP™规格软件的影像时,设定是否要减低画面的闪烁。 关 不减低画面的闪烁。 开 减低画面的闪烁。

  •        闪点(新增):主界面中,点击下方闪点图标即可打开闪点模板弹框。        当未配置闪点模板时,可通过点击右上方添加按钮跳转至模板配置页面进行模板配置。        模板配置页面包含:模板名称、存储位置、图标与名称、名称替换、描述等内容        存储位置:点击页面内中文件夹操作图标即可展开当前工程中的点位文件夹,选择后可将该文件夹内图标进行替换。        名称替换选项

  • 概述 闪电狗监控(flash-dog)起源于杭州斯凯网络科技有限公司一个真实项目,主要优点是轻巧快捷,非侵入式,不影响业务代码,只需加入几个jar包和修改log4j配置文件,就能监控任意指标,如CPU,内存、线程,游戏收入,在线人数等等。2012年开源后,在游戏、支付、教育等多种互联网公司广泛应用。 在线demo ,http://115.28.11.12:8080/flash-dog/ 用户 ad

  • 问题内容: 有什么简单的方法可以使文本在jQuery中闪烁并停止它?必须适用于IE,FF和Chrome。谢谢 问题答案: 例如 这也是一个非常简单的插件,您可以扩展它以停止动画并按需启动它。