Python 类对象不可调用

Python 类对象不可调用,python,pygame,Python,Pygame,我正在尝试重新制作一个旧的2d太空射击游戏,并且已经完成了大部分的工作,但是我仍然停留在拍摄的实际部分 我还会用毕达哥拉斯定理来计算子弹和敌人之间的碰撞,以及敌人和玩家之间的碰撞吗 代码如下: import pygame, random, os pygame.init() w, h = 1366, 768 screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) pygame.display.set_caption('SPACESH

我正在尝试重新制作一个旧的2d太空射击游戏,并且已经完成了大部分的工作,但是我仍然停留在拍摄的实际部分

我还会用毕达哥拉斯定理来计算子弹和敌人之间的碰撞,以及敌人和玩家之间的碰撞吗

代码如下:

import pygame, random, os

pygame.init()
w, h = 1366, 768
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
pygame.display.set_caption('SPACESHIPSHOOTER')
clock = pygame.time.Clock()

class player:
    def __init__(self, pos=[w//2, h//7]):
        self.pos = pos
        self.player = pygame.image.load(os.path.join('GameData', 'player.png'))
        self.player = pygame.transform.scale(self.player, (100, 83))

class enemy:
    def __init__(self, pos=[random.randint(0, 1366), 700]):
        self.pos = pos
        self.enemy = pygame.image.load(os.path.join('GameData', 'enemy.png'))
        self.enemy = pygame.transform.scale(self.enemy, (100, 83))

class bullet:
    def __init__(self, pos):
        self.pos = pos
        self.bullet = pygame.image.load(os.path.join('GameData', 'missile.png'))
        self.bullet = pygame.transform.scale(self.bullet, (50, 41))
        self.exist = 0
    def update(self):
        if self.pos[1] < 700 and self.exist == 1:
            self.pos[1] -= 5

you = player()
enemies = [enemy()]
bullets = []

running = True
speed = 1.2
clock = 0
xv = 0

while running:
    screen.fill((0, 0, 0))
    clock += 1
    for event in pygame.event.get():
        if event.type == pygame.QUIT: running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            if event.key == pygame.K_d:
                xv = 8
            if event.key == pygame.K_a:
                xv = -8
            if event.key == pygame.K_SPACE:
                bullets.append(bullet([you.pos[0], you.pos[1]]))
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_d or event.key == pygame.K_a:
                xv = 0
    you.pos[0] += xv
    if len(bullets) > 0:
        for bullet in bullets:
            bullet.exist=1
            bullet.update()
    for badguy in enemies:
        if badguy.pos[1] <= 5:
            del enemies[enemies.index(badguy)]
            enemies.append(enemy([random.randint(0, 1366), 700]))
        badguy.pos[1] = badguy.pos[1] - speed
        screen.blit(badguy.enemy, (badguy.pos[0], badguy.pos[1]))
    if clock % 750 == 0:
        speed += 0.05
    if clock % 1200 == 0:
        enemies.append(enemy([random.randint(0, 1366), 700]))
    screen.blit(you.player, (you.pos[0], you.pos[1]))
    pygame.display.flip()

pygame.quit()
quit()
导入pygame,随机,操作系统
pygame.init()
w、 h=1366768
screen=pygame.display.set_模式((0,0),pygame.FULLSCREEN)
pygame.display.set_标题('SPACESHIPSHOOTER'))
clock=pygame.time.clock()
职业球员:
定义初始化(self,pos=[w//2,h//7]):
self.pos=pos
self.player=pygame.image.load(os.path.join('GameData','player.png'))
self.player=pygame.transform.scale(self.player,(100,83))
阶级敌人:
定义初始化(self,pos=[random.randint(01366),700]):
self.pos=pos
self.defey=pygame.image.load(os.path.join('GameData','defey.png'))
self.敌军=pygame.transform.scale(self.敌军,(100,83))
类别项目符号:
定义初始(自我,位置):
self.pos=pos
self.bullet=pygame.image.load(os.path.join('GameData','smile.png'))
self.bullet=pygame.transform.scale(self.bullet,(50,41))
self.exist=0
def更新(自我):
如果self.pos[1]<700且self.exist==1:
自身位置[1]-=5
你=玩家()
敌人=[敌人()]
项目符号=[]
运行=真
速度=1.2
时钟=0
xv=0
运行时:
屏幕填充((0,0,0))
时钟+=1
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:running=False
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_退出:
运行=错误
如果event.key==pygame.K\u d:
xv=8
如果event.key==pygame.K_a:
xv=-8
如果event.key==pygame.K_空间:
项目符号.append(项目符号([you.pos[0],you.pos[1]]))
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_d或event.key==pygame.K_a:
xv=0
you.pos[0]+=xv
如果长度(项目符号)>0:
对于子弹中的子弹:
bullet.exist=1
bullet.update()
对于《敌人》中的坏人:

如果badguy.pos[1]
用于项目符号中的项目符号:
定义了一个同名变量
bullet
,该变量将覆盖类对象。重命名类或变量

按照惯例,类名称使用大写字母
CamelCase
,变量使用小写字母


对于项目符号中的项目符号:
定义了一个同名的变量
项目符号
,该变量将覆盖类对象。重命名类或变量

按照惯例,类名称使用大写字母
CamelCase
,变量使用小写字母


问题出在线路上

for bullet in bullets:

使用变量
bullet
覆盖类
bullet
。这就是为什么存在用大写字母
Bullet
编写类的约定问题在于行

for bullet in bullets:

使用变量
bullet
覆盖类
bullet
。这就是为什么存在使用大写字母
Bullet

编写类的约定,最好给出有关重命名的具体建议。例如,传统的做法是给类赋予
大写的名称
,而(其他变量使用带有下划线的
小写字母\u名称。\u
@Blckknght我会在编程时尽量记住这一点。@Blckknght我的答案有一点改进。@Slipknot1一般来说,你不应该在两个不同的目的中使用完全相同的名称。你在这里很幸运,因为编译器能够检测到这个错误。经常重复使用名称将导致更难追踪的错误。提供有关重命名内容的具体建议可能是一个好主意。例如,传统做法是为类指定
大写名称
,而为实例指定(其他变量使用带有下划线的
小写字母\u名称。\u
@Blckknght我会在编程时尽量记住这一点。@Blckknght我的答案有一点改进。@Slipknot1一般来说,你不应该在两个不同的目的中使用完全相同的名称。你在这里很幸运,因为编译器能够检测到这个错误。经常重复使用名字会导致更难追踪的错误。