为了账号安全,请及时绑定邮箱和手机立即绑定

碰撞发生时如何显示爆炸图像?

碰撞发生时如何显示爆炸图像?

守候你守候我 2023-10-31 21:30:07
不知道为什么没有爆炸效果。其他图都画得很好,唯独爆炸图不行explosion = pygame.image.load(os.path.join(image_path, "explosion.png"))explosion_size = explosion.get_rect().sizeexplosion_width = explosion_size[0]for missile_idx, missile_val in enumerate(missiles):    missile_pos_x = missile_val[0]    missile_pos_y = missile_val[1]    #weapon information upgrade    missile_rect = missile.get_rect()    missile_rect.left = missile_pos_x    missile_rect.top = missile_pos_y    if missile_rect.colliderect(rock_rect):        explosion_sound.play()        **explosion_pos_x = missile_pos_x        explosion_pos_y = missile_pos_y        screen.blit(explosion,(explosion_pos_x,explosion_pos_y))**        del(rock)        del(missiles)        missiles = []        # missile position coordination        missiles = [[m[0], m[1] - missile_speed] for m in missiles]        # top missile elimination        missiles = [[m[0], m[1]] for m in missiles if m[1]>0]
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

爆炸只显示了一小会儿。用于pygame.time.get_ticks()返回自调用以来的毫秒数pygame.init()。计算必须删除爆炸图像之后的时间点。将爆炸的坐标和结束时间点添加到列表的头部 ( explosionList )。在主应用程序循环中绘制爆炸。从列表尾部删除过期的爆炸:

explosionList = []


while run:

    current_time = pygame.time.get_ticks()

    # [...]


    for missile_idx, missile_val in enumerate(missiles)

        # [...]


        if missile_rect.colliderect(rock_rect):

            explosion_sound.play()


            explosion_pos_x = missile_pos_x

            explosion_pos_y = missile_pos_y

            end_time = current_time + 2000 # 2000 milliseconds = 2 seconds

            explosionList.insert(0, (end_time, explosion_pos_x, explosion_pos_y))


            # [...]


    for i in range(len(explosionList)):

        if current_time < explosionList[i][0]:

            screen.blit(explosion, (explosionList[i][1], explosionList[i][2]))

        else:

            explosionList = explosionList[:i]

            break

    

    # [...]

使用该算法可以管理多次爆炸。


import pygame

pygame.init()

window = pygame.display.set_mode((210, 210))


def create_rectangles():

    global rectangles

    w, h = window.get_size()

    rectangles = []

    for x in range(0, w - 60, 60):

        for y in range(0, h - 60, 60):

            rectangles.append(pygame.Rect(x + 30, y + 30, 30, 30))


create_rectangles()

hit_list = []

fade_out_time = 3000


run = True

while run:

    current_time = pygame.time.get_ticks()

    

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            run = False


    point = pygame.mouse.get_pos()

    collideindex = pygame.Rect(point, (1, 1)).collidelist(rectangles)

    if collideindex >= 0:

        end_time = current_time + fade_out_time

        hit_list.insert(0, (end_time, rectangles[collideindex].center))

        del rectangles[collideindex]

    if not hit_list and not rectangles:

        create_rectangles()


    window.fill(0)

    for r in rectangles:

        pygame.draw.rect(window, (255, 0, 0), r)

    for i in range(len(hit_list)):

        delta_time = hit_list[i][0] - current_time

        if delta_time > 0:

            radius = round(30 * delta_time / fade_out_time)

            pygame.draw.circle(window, (255, 255, 0), hit_list[i][1], radius)

        else:

            hit_list = hit_list[:i]

            break

    pygame.display.flip()


查看完整回答
反对 回复 2023-10-31
?
智慧大石

TA贡献1946条经验 获得超3个赞

如果您想显示爆炸图像一段时间,此方法可能很有用。


explosion_list = [] # list for explosion effect

running = True

while running:

     start_time = pygame.time.get_ticks() # add time for explosion effect


     for missile_idx, missile_val in enumerate(missiles):

         missile_pos_x = missile_val[0]

         missile_pos_y = missile_val[1]


         #weapon information upgrade

         missile_rect = missile.get_rect()

         missile_rect.left = missile_pos_x

         missile_rect.top = missile_pos_y


         if missile_rect.colliderect(rock_rect):

             explosion_sound.play()

             explosion_pos_x = missile_pos_x

             explosion_pos_y = missile_pos_y

             explosion_time = start_time + 2000 # 1000 milliseconds = 2 seconds

             **explosion_list.insert(0, (explosion_time, explosion_pos_x, explosion_pos_y))**

             del(rock)

             del(missiles)

             missiles = []

            

             # missile position coordination

             missiles = [[m[0], m[1] - missile_speed] for m in missiles]


             # top missile elimination

             missiles = [[m[0], m[1]] for m in missiles if m[1]>0]

                        

             **for i in range(len(explosion_list)):

                 if start_time < explosion_time:

                    pygame.display.update()

                    screen.blit(explosion, (explosion_pos_x - 30, explosion_pos_y - 30))

                    pygame.time.delay(10)**

                    else:

                         explosion_list = explosion_list[:i]


查看完整回答
反对 回复 2023-10-31
  • 2 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信