鱼C论坛

 找回密码
 立即注册
查看: 967|回复: 5

用Spyder编译飞机大战bullet1[bullet1_index].reset(me.rect.midtop)无法调用reset

[复制链接]
发表于 2018-10-10 15:36:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import pygame
from pygame.locals import *
import sys
import myplane
import enemyplane
import bullet

pygame.init()
pygame.mixer.init()

bg_size = width,height = 400,650
screen = pygame.display.set_mode(bg_size)

#加载背景
background = pygame.image.load("images/background.png").convert()
#加载音乐
pygame.mixer.music.load("sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)

bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
bullet_sound.set_volume(0.2)

bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
bomb_sound.set_volume(0.2)

supply_sound = pygame.mixer.Sound("sound/supply.wav")
supply_sound.set_volume(0.2)

get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)

get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
get_bullet_sound.set_volume(0.2)

upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
upgrade_sound.set_volume(0.2)

supply_sound = pygame.mixer.Sound("sound/supply.wav")
supply_sound.set_volume(0.2)

enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.1)

enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)

enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.5)

enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
enemy3_fly_sound.set_volume(0.2)

me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
me_down_sound.set_volume(0.2)

#加载敌机数量
def add_small_enemies(group1,group2,num):
    for i in range(num):
        e1 = enemyplane.Smallenemy()
        e1._init_(bg_size)
        group1.add(e1)
        group2.add(e1)

def add_mid_enemies(group1,group2,num):
    for i in range(num):
        e2 = enemyplane.Midenemy()
        e2._init_(bg_size)
        group1.add(e2)
        group2.add(e2)

def add_big_enemies(group1,group2,num):
    for i in range(num):
        e3 = enemyplane.Bigenemy()
        e3._init_(bg_size)
        group1.add(e3)
        group2.add(e3)
        

   

def main():
    pygame.mixer.music.play(-1)
    #导入我方飞机
    me = myplane.Myplane()
    me._init_(bg_size)
    #导入敌机
    #定义精灵组
    enemies = pygame.sprite.Group()
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies,enemies,15)
   
    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies,enemies,8)
   
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies,enemies,3)
    #坠机索引
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0
    #子弹索引组
    bullet1=[]
    bullet1_index = 0
    BULLET1_NUM = 4
   
    #实例化
    b1 = bullet.Bullet1()
    b1._init_(me.rect.midtop)
    for i in range(BULLET1_NUM):   
        bullet1.append(b1._init_(me.rect.midtop))
      

   
        
        
   
   
   
   
   
   
    clock = pygame.time.Clock()
   
    running = True
    #切换我方飞机
    switch = True
    #飞机切换延迟
    delay = 100
   
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        #检测键盘输入
        key_pressed = pygame.key.get_pressed()
        
        if key_pressed[K_w] or key_pressed[K_UP]:
            me.moveUp()
        
        if key_pressed[K_s] or key_pressed[K_DOWN]:
            me.moveDown()
            
        if key_pressed[K_a] or key_pressed[K_LEFT]:
            me.moveLeft()
            
        if key_pressed[K_d] or key_pressed[K_RIGHT]:
            me.moveRight()
        
         #绘制背景      
        screen.blit(background,(0,0))
           #绘制子弹
        #每十帧绘制每发子弹的起始位置
        if not (delay % 10):
           
            bullet1[bullet1_index].reset(me.rect.midtop)
            bullet1_index = (bullet1_index + 1) % BULLET1_NUM
         
        #检测是否中弹
        for each in bullet1:
            if each.active:
                each.move()
                screen.blit(each.image,each.rect)
                #中弹列表
                enemy_hit = pygame.sprite.spritecollide(each,enemies,False,pygame.sprite.collide_mask)
                if enemy_hit:
                    each.active = False
                    for i in range(enemy_hit):
                        i.active = False
        #敌我碰撞检测
        #第一个是单个精灵,第二个为精灵族,为True时删除碰撞精灵
        enemies_down = pygame.sprite.spritecollide(me,enemies,False,pygame.sprite.collide_mask)
        #enemies_down 为列表
        if enemies_down:
           # me.active = False
            for i in enemies_down:
                i.active = False
            
        
        #绘制我方飞机
        if me.active:     
            if switch:   
                screen.blit(me.image1,me.rect)      
            else:
                screen.blit(me.image2,me.rect)  
        #坠毁
        else:
            
            if not (delay % 3):
                screen.blit(me.destroy_images[me_destroy_index],me.rect)
                me_destroy_index = (me_destroy_index + 1) % 4
                if me_destroy_index == 0:
                    me_down_sound.play()
                    print("游戏结束")
                    running = False
        #绘制敌方飞机
        #大型敌机
        for each in big_enemies:
            #幸存
            if each.active:   
                each.move()
                if switch:
                    screen.blit(each.image1,each.rect)
                else:
                    screen.blit(each.image2,each.rect)
                if each.rect.bottom == -50:
                    enemy3_fly_sound.play(-1)
            #坠毁
            else:
               
                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:
                        enemy3_fly_sound.stop()
                        enemy3_down_sound.play()
                        
                        each.reset()
                    
                    
               
               
               
        #小中型
        for each in small_enemies:
            if each.active:
                each.move()
                screen.blit(each.image,each.rect)
                #坠毁
            else:
               
                if not (delay % 3):
                    screen.blit(each.destroy_images[e1_destroy_index],each.rect)
                    e1_destroy_index = (e1_destroy_index + 1) % 4
                    if e1_destroy_index == 0:
                        enemy1_down_sound.play()
                        each.reset()
            
        for each in mid_enemies:
            if each.active:  
                each.move()
                screen.blit(each.image,each.rect)
                #坠毁
            else:
               
                if not (delay % 3):
                    screen.blit(each.destroy_images[e2_destroy_index],each.rect)
                    e2_destroy_index = (e2_destroy_index + 1) % 4
                    if e2_destroy_index == 0:
                        enemy2_down_sound.play()
                        each.reset()
                        
     
                    
            
               
            
           
           
           
        
        
        
        #切换延迟
        delay-=1
        switch = not switch
        if delay % 5 == 0:   
             switch = not switch
        if delay == 0:
            delay = 100
        pygame.display.flip()
        clock.tick(60)

a = main()
print(a)   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-10 15:41:40 | 显示全部楼层
发错误信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-10 15:46:45 | 显示全部楼层

bullet1[bullet1_index].reset(me.rect.midtop)

AttributeError: 'NoneType' object has no attribute 'reset'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 15:51:12 | 显示全部楼层
你这bullet1列表对应元素是None
初始化不是这么写的吧
b1 = bullet.Bullet1()
    b1._init_(me.rect.midtop)
    for i in range(BULLET1_NUM):   
        bullet1.append(b1._init_(me.rect.midtop))
bullet1每次添加b1的init结果?init无返回值的,要实例对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-10 16:09:42 | 显示全部楼层
塔利班 发表于 2018-10-10 15:51
你这bullet1列表对应元素是None
初始化不是这么写的吧
b1 = bullet.Bullet1()

  源码这样写bullet1.append(bullet.Bullet1(me.rect.midtop)),但是编译时提示

  File "E:\anacoda\lib\site-packages\pygame\sprite.py", line 124, in __init__
    self.add(*groups)

  File "E:\anacoda\lib\site-packages\pygame\sprite.py", line 142, in add
    self.add(*group)

  File "E:\anacoda\lib\site-packages\pygame\sprite.py", line 142, in add
    self.add(*group)

TypeError: add() argument after * must be an iterable, not int
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 16:12:54 | 显示全部楼层
感觉你源码错误描述也没整对,append是列表方法
add是pygame.sprite.Group方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 07:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表