Python 我如何让我的角色移动,同时也让子弹在上面繁殖?

Python 我如何让我的角色移动,同时也让子弹在上面繁殖?,python,pygame,Python,Pygame,我一直在尝试用Python制作一个bullet hell(dankamu)游戏,当我尝试用这些子弹为角色的动作设置动画时,我遇到了一些问题。根据我将重画GameWindow()函数放置在何处,子弹可能无法生成,或者我的游戏角色根本无法移动。我想这可能是因为我的移动功能与我用于子弹的for循环是分开的?如果是这样的话,我不知道如何将它们合并在一起,以便同时运行这两者 class mc(object): def __init__(self, x, y, width, height):

我一直在尝试用Python制作一个bullet hell(dankamu)游戏,当我尝试用这些子弹为角色的动作设置动画时,我遇到了一些问题。根据我将
重画GameWindow()
函数放置在何处,子弹可能无法生成,或者我的游戏角色根本无法移动。我想这可能是因为我的移动功能与我用于子弹的for循环是分开的?如果是这样的话,我不知道如何将它们合并在一起,以便同时运行这两者

class mc(object):
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.hitbox = (self.x, self.y, 30, 30)
    def draw(self, win):
        win.blit(char, (self.x, self.y))
        self.hitbox = (self.x, self.y, 30, 30)
        pygame.draw.rect(win, (255,0,0), self.hitbox,2)
    def hit(self):
        print("Hit")
def redrawGameWindow(mainchar, bullet, bullets):
    win.blit(bg, (0,0))
    mainchar.draw(win)
    pygame.display.update()
    for bullet in bullets:
        bullet.draw(win)
class projectile(object):
    def __init__(self,x,y,radius,color,facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.facing = facing
        self.vel = 8 * facing
    def draw(self,win):
        pygame.draw.circle(win, self.color, (self.x,self.y), self.radius)
def dankamu(enemy):
    mainchar = mc(200, 410, 64, 64)
    run = True
    bullets = []
    while run:
        pygame.time.delay(10)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and mainchar.x > 0:
            mainchar.x -= mainchar.vel
        if keys[pygame.K_RIGHT] and mainchar.x < 470:
            mainchar.x += mainchar.vel
        if keys[pygame.K_DOWN] and mainchar.y < 470:
            mainchar.y += mainchar.vel
        if keys[pygame.K_UP] and mainchar.y > 0:
            mainchar.y -= mainchar.vel
        if keys[pygame.K_LSHIFT] and mainchar.vel > 0:
            mainchar.vel = 3
        if keys[pygame.K_RSHIFT]:
            mainchar.vel = 5
        win.fill((255, 255, 255))
        if enemy == "skeleton":
            for i in range (30):
                bullets.append(projectile(250, 250, 6, (0, 0, 0), 1))
            for bullet in bullets:
                if bullet.y - bullet.radius < mainchar.hitbox[1] + mainchar.hitbox[3] and bullet.y + bullet.radius > mainchar.hitbox[1]:
                    if bullet.x + bullet.radius > mainchar.hitbox[0] and bullet.x - bullet.radius < mainchar.hitbox[0] + mainchar.hitbox[2]:
                        mainchar.hit()
                        bullets.pop(bullets.index(bullet))
                elif bullet.x < 500 and bullet.x > 0:
                    bullet.x += bullet.vel
                else:
                    bullets.pop(bullets.index(bullet))
                redrawGameWindow(mainchar, bullet, bullets)
            run = False


    pygame.quit()


#Actual Running
dankamu("skeleton")
print("Dankamu success")
mc类(对象):
定义初始值(自、x、y、宽度、高度):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.vel=5
self.hitbox=(self.x,self.y,30,30)
def抽签(自我,赢):
win.blit(char,(self.x,self.y))
self.hitbox=(self.x,self.y,30,30)
pygame.draw.rect(赢,(255,0,0),self.hitbox,2)
def命中(自身):
打印(“点击”)
def重画游戏窗口(主字符、项目符号、项目符号):
温·布利特(背景,(0,0))
mainchar.draw(赢)
pygame.display.update()
对于子弹中的子弹:
子弹。抽签(赢)
类(对象):
定义初始(自、x、y、半径、颜色、面):
self.x=x
self.y=y
自半径=半径
self.color=颜色
自我面对
self.vel=8*端面
def抽签(自我,赢):
pygame.draw.circle(赢,self.color,(self.x,self.y),self.radius)
德夫丹卡姆(敌人):
mainchar=mc(200410,64,64)
运行=真
项目符号=[]
运行时:
pygame。时间。延迟(10)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
如果键[pygame.K_LEFT]和mainchar.x>0:
mainchar.x-=mainchar.vel
如果键[pygame.K_RIGHT]和mainchar.x<470:
mainchar.x+=mainchar.vel
如果键[pygame.K_DOWN]和mainchar.y<470:
mainchar.y+=mainchar.vel
如果键[pygame.K_UP]和mainchar.y>0:
mainchar.y-=mainchar.vel
如果键[pygame.K_LSHIFT]和mainchar.vel>0:
mainchar.vel=3
如果键[pygame.K_RSHIFT]:
mainchar.vel=5
win.fill((255,255,255))
如果敌人==“骷髅”:
对于范围(30)内的i:
子弹。附加(射弹(250250,6,(0,0,0,1))
对于子弹中的子弹:
如果bullet.y-bullet.radiusmainchar.hitbox[1]:
如果bullet.x+bullet.radius>mainchar.hitbox[0]和bullet.x-bullet.radius0:
bullet.x+=bullet.vel
其他:
子弹.弹孔(子弹.索引(子弹))
重画游戏窗口(主字符、项目符号、项目符号)
运行=错误
pygame.quit()
#实际运行
丹卡姆(“骨架”)
打印(“丹卡姆成功”)

生成子弹时,必须在玩家位置上方生成子弹:

bullets.append(投射物(250250,6,(0,0,0,1))

bullets.append(投射(mainchar.x,0,6,(0,0,0,1))
由于项目符号必须从底部向顶部移动,因此必须增加项目符号的y坐标:

bullet.x+=bullet.vel

bullet.y+=bullet.vel
在更新显示之前绘制项目符号:

def重画游戏窗口(mainchar、bullet、bullet):
温·布利特(背景,(0,0))
mainchar.draw(赢)
对于子弹中的子弹:
子弹。抽签(赢)
pygame.display.update()
不要一次添加所有项目符号:

如果项目符号\u帧\u计数=0:
子弹头\帧\计数=10
如果透镜(子弹)<30:
项目符号。追加(项目符号(mainchar.x,0,6,(0,0,0),1))
其他:
项目符号\u帧\u计数-=1
用于碰撞测试:

bullet\u rect=pygame.rect(bullet.x-bullet.radius,bullet.y-bullet.radius,bullet.radius*2,bullet.radius*2)
如果bullet_rect.colliderect(mainchar.hitbox):
mainchar.hit()
子弹.弹孔(子弹.索引(子弹))
请阅读


完成dankamu的
功能:

def dankamu(敌人):
mainchar=mc(200410,64,64)
运行=真
项目符号=[]
计数=0
运行时:
pygame。时间。延迟(10)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
mainchar.x=mainchar.x+(键[pygame.K_RIGHT]-键[pygame.K_LEFT])*mainchar.vel
mainchar.y=mainchar.y+(键[pygame.K_DOWN]-键[pygame.K_UP])*mainchar.vel
mainchar.x=最大值(0,最小值(470,mainchar.x))
mainchar.y=最大值(0,最小值(470,mainchar.y))
如果键[pygame.K_LSHIFT]和mainchar.vel>0:
mainchar.vel=3
如果键[pygame.K_RSHIFT]:
mainchar.vel=5
如果敌人==“骷髅”:
如果计数=0:
计数=10
如果透镜(子弹)<30:
项目符号。追加(项目符号(mainchar.x,0,6,(0,0,0),1))
其他:
计数-=1
对于项目符号中的项目符号[:]:
bullet_rect=pygame.rect(bullet.x-bullet.radius,bullet.y-bullet.radius,bullet.radius*2,bullet.radius*2)
如果bullet_rect.colliderect(mainchar.hitbox):
mainchar.hit()
子弹.弹孔(子弹.索引(子弹))
elif项目符号y<500:
bullet.y+=bullet.vel
其他:
子弹.弹孔(子弹.索引(子弹))
红色