发生碰撞时如何显示爆炸图像? [英] How can I show explosion image when collision happens?

查看:46
本文介绍了发生碰撞时如何显示爆炸图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

不知道为什么没有爆炸效果.
其他图画得很好,但只有爆炸图没有

explosion = pygame.image.load(os.path.join(image_path, "explosion.png"))爆炸大小 = 爆炸.get_rect().size爆炸宽度 = 爆炸尺寸[0]

对于enumerate(missiles)中的导弹idx、导弹_val:导弹_pos_x = 导弹_val[0]导弹_pos_y = 导弹_val[1]#武器信息升级导弹_rect = 导弹.get_rect()导弹_rect.left = 导弹_pos_x导弹_rect.top = 导弹_pos_y如果 missile_rect.colliderect(rock_rect):爆炸声音播放()**explosion_pos_x = missile_pos_x爆炸位置 y = 导弹位置位置screen.blit(爆炸,(explosion_pos_x,explosion_pos_y))**德尔(摇滚)删除(导弹)导弹 = []# 导弹位置协调导弹 = [[m[0], m[1] - missile_speed] 导弹中的 m]# 顶级导弹消除导弹 = [[m[0], m[1]] 表示导弹中的 m 如果 m[1]>0]

解决方案

爆炸只是片刻显示.使用

导入pygamepygame.init()窗口 = pygame.display.set_mode((210, 210))def create_rectangles():全局矩形w, h = window.get_size()矩形 = []对于范围内的 x (0, w - 60, 60):对于范围内的 y (0, h - 60, 60):rectangles.append(pygame.Rect(x + 30, y + 30, 30, 30))创建矩形()hit_list = []淡出时间 = 3000运行 = 真运行时:current_time = pygame.time.get_ticks()对于 pygame.event.get() 中的事件:如果 event.type == pygame.QUIT:运行 = 错误点 = pygame.mouse.get_pos()collideindex = pygame.Rect(point, (1, 1)).collidelist(rectangles)如果碰撞指数 >= 0:结束时间 = 当前时间 + 淡出时间hit_list.insert(0, (end_time, rectangles[collideindex].center))删除矩形[碰撞索引]如果不是 hit_list 而不是矩形:创建矩形()window.fill(0)对于矩形中的 r:pygame.draw.rect(窗口, (255, 0, 0), r)对于我在范围内(len(hit_list)):delta_time = hit_list[i][0] - current_time如果 delta_time >0:半径 = 圆(30 * delta_time/fade_out_time)pygame.draw.circle(window, (255, 255, 0), hit_list[i][1], radius)别的:hit_list = hit_list[:i]休息pygame.display.flip()

I don't know why explosion effect doesn't happen.
The other images were drawn well, but only explosion image didn't

explosion = pygame.image.load(os.path.join(image_path, "explosion.png"))
explosion_size = explosion.get_rect().size
explosion_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]

解决方案

The explosion is just shown for a short moment. Use pygame.time.get_ticks() to return the number of milliseconds since pygame.init() was called. Calculate the point in time after that the explosion image has to be removed. Add the coordinates of the explosion and the end time point to the head of a list (explosionList ). Draw the explosion(s) in the main application loop. Remove the expired explosions from the tail of the list:

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
    
    # [...]

With this algorithm it is possible to manage multiple explosions.


Minimal example

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()

这篇关于发生碰撞时如何显示爆炸图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆