| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
视频讲解https://www.bilibili.com/video/BV1xs411Q799/?p=93&spm_id_from=pageDriver 
细心的读者朋友应该不难发现,上面main模块的代码其实有一个明显的bug,该bug导致的结果是部分音效无法正常播放! 
无论是敌方飞机还是我方飞机,当它们发生碰撞毁灭的时候,播放音效的代码是这么被执行的: 
…… 
            if each.active:  
                …… 
            else: # 若是False,则代表毁灭,执行以下代码… 
                enemy3_down_sound.play() # 播放死亡音效 
                if not(delay % 3):  
                    screen.blit(each.destroy_images[e3_destroy_index], each.rect)  
                    e3_destroy_index = (e3_destroy_index + 1) % 6  
                    if e3_destroy_index == 0:  
                        each.reset()  
…… 
以下对小甲鱼教学视频中从20:50处开始的口头讲解以及小甲鱼鼠标点击屏幕内容所做的记录并加自我注释如下: 
敌方飞机无论是大飞机、还是中飞机、还是小飞机,它们毁灭是怎么毁灭的? 
我们是检测它的active属性,如果为False的话, 
那就播放音效enemy3_down_sound.play() , 
e3_destroy_index初始化为0即对应第1张它毁灭的图片, 
所以screen.blit(each.destroy_images[e3_destroy_index], each.rect) 就是画第1张它毁灭的图片, 
【我的疑问1】若敌我双方飞机发生碰撞恰好delay的值递减到刚好不是3的倍数,if not(delay % 3)后面的代码就不会被执行,也就不会画敌方飞机毁灭的图片---有无可能出现此问题?或者换个方式表达“如何保证当敌我双方飞机发生碰撞后开始播放敌机毁灭图片时delay的值恰好为3的倍数呢”?这是否属于bug或应该考虑的问题? 
然后e3_destroy_index = (e3_destroy_index + 1) % 6 即e3_destroy_index=1也就是指向第2张它毁灭的图片, 
其后的代码即: 
if e3_destroy_index == 0:    
each.reset()  
不会被执行, 
这样就一帧过去了; 
然后第二帧, 
再次播放音效enemy3_down_sound.play() , 
当执行到if not(delay % 3): 时判断此时delay的值不是3的倍数, 
所以其后面的代码即: 
screen.blit(each.destroy_images[e3_destroy_index], each.rect)  
                    e3_destroy_index = (e3_destroy_index + 1) % 6  
                    if e3_destroy_index == 0:  
                        each.reset()  
就都不会被执行,这也就是小甲鱼在教学讲解视频里所说的“哦这里还进不去”的意思! 
接着第三帧, 
又再次播放音效enemy3_down_sound.play() , 
当执行到if not(delay % 3): 时判断此时delay的值又是3的倍数了, 
所以其后面的代码即: 
screen.blit(each.destroy_images[e3_destroy_index], each.rect)  
                    e3_destroy_index = (e3_destroy_index + 1) % 6  
                    if e3_destroy_index == 0:  
                        each.reset()  
会被执行,这也就是小甲鱼在教学讲解视频里所说的“嘿进去了”的意思! 
【我的疑问2】第三帧时应该还是进不去才对!!!因为delay的值仍然不是3的倍数,所以if not(delay % 3):后面的代码应该依然不会被执行!!! 
前面说过e3_destroy_index=1即指向第2张它毁灭的图片, 
所以screen.blit(each.destroy_images[e3_destroy_index], each.rect) 就是画第2张它毁灭的图片。 |   
 
 
 
 |