在pygame中使用非常规字符类叠加精灵?

2024-04-26 07:51:26 发布

您现在位置:Python中文网/ 问答频道 /正文

预先警告这是我在stackoverflow上的第一篇文章,如果我的格式有误或者我不清楚,我很高兴听到你的建设性批评。谢谢你的理解!!下次我会做得更好!!在

所以: 我正在尝试创建一个游戏,我的角色在屏幕上运行,类似于《大地行》。我很难正确划分我的精灵。我希望我的受控角色出现在其他物体的后面,当他“在前面”时出现在前面。在

我看过很多关于精灵分层的帖子,我发现了一些关于LayeredUpdates组的有用信息,以及简单地以“画家视角”绘制图像来在我的游戏中创造深度的错觉。在

我的问题可能在于我构建角色分类的方式。。在

def __init__(self,file_path,x,y,rate=3):
    pygame.sprite.Sprite.__init__(self)
    self.rate=rate

    token_path = SpriteSheet('token.png')
    self.image = token_path.get_image(0,0,RECT_WIDTH,RECT_HEIGHT)
    self.rect = self.image.get_rect()
    self.rect.x = x
    self.rect.y = y+(48-RECT_HEIGHT)

我使用一个透明的令牌图像作为我的rect对象(用于碰撞检测),然后根据我的令牌rect位置将所有pyganim动画blit到屏幕上。。。是这样的:

^{pr2}$

当我把这些精灵添加到我的组中时,它并没有添加实际的动画,而是添加了清除标记,所以当涉及到分层时,我最终创建了一个漂亮的透明标记堆栈,而不是一个分层的精灵显示。在

我尝试通过绘制顺序分层,每个组中有一个精灵:

def layer(self,dudes,surface):
    for dude in dudes:
        if self.rect.bottom>dude.rect.y+5:
            dude.draw(surface)
            self.draw(surface)
        else:
            self.draw(surface)
            dude.draw(surface)

但是当我向迭代组中添加更多精灵时,它们并没有正确地分层。在

我有没有办法用我构建角色类的方式来实现分层系统?

这是我的精灵组相关代码:

visibles = pygame.sprite.LayeredUpdates()
prot = pygame.sprite.LayeredUpdates()

prot.add(nes)

visibles.add(aloysius)
visibles.add(bluecapboy)
visibles.add(applekid)

下面是我的完整字符代码:

class Main_Character(pygame.sprite.DirtySprite):
layer=1
moveUp=moveDown=moveLeft=moveRight=False
moveUp_left=moveUp_right=moveDown_left=moveDown_right = False
direction = DOWN
animObjs={}

def __init__(self,file_path,x,y,rate=3):
    pygame.sprite.Sprite.__init__(self)
    self.rate=rate

    token_path = SpriteSheet('token.png')
    self.image = token_path.get_image(0,0,RECT_WIDTH,RECT_HEIGHT)
    self.rect = self.image.get_rect()
    self.rect.x = x
    self.rect.y = y+(48-RECT_HEIGHT)

    path = SpriteSheet(file_path)

    self.down1 = pygame.transform.scale((path.get_image(0,0,16,24)),(32,48))
    self.down2 = pygame.transform.scale((path.get_image(16,0,16,24)),(32,48))
    self.up1 = pygame.transform.scale((path.get_image(32,0,16,24)),(32,48))
    self.up2 = pygame.transform.flip(self.up1,True,False)
    self.left1 = pygame.transform.scale((path.get_image(48,0,16,24)),(32,48))
    self.left2 = pygame.transform.scale((path.get_image(64,0,16,24)),(32,48))
    self.right1 = pygame.transform.flip(self.left1,True,False)
    self.right2 = pygame.transform.flip(self.left2,True,False)

    self.up_left1 = pygame.transform.scale((path.get_image(32,24,16,24)),(32,48))
    self.up_left2 = pygame.transform.scale((path.get_image(48,24,16,24)),(32,48))
    self.up_right1 = pygame.transform.flip(self.up_left1,True,False)
    self.up_right2 = pygame.transform.flip(self.up_left2,True,False)
    self.down_left1 = pygame.transform.scale((path.get_image(0,24,16,24)),(32,48))
    self.down_left2 = pygame.transform.scale((path.get_image(16,24,16,24)),(32,48))
    self.down_right1 = pygame.transform.flip(self.down_left1,True,False)
    self.down_right2 = pygame.transform.flip(self.down_left2,True,False)


    self.animObjs['walk_down']=pyganim.PygAnimation([(self.down1,.1),(self.down2,.1)])
    self.animObjs['walk_up']=pyganim.PygAnimation([(self.up1,.1),(self.up2,.1)])
    self.animObjs['walk_left']=pyganim.PygAnimation([(self.left2,.1),(self.left1,.1)])
    self.animObjs['walk_right']=pyganim.PygAnimation([(self.right2,.1),(self.right1,.1)])
    self.animObjs['walk_up_left']=pyganim.PygAnimation([(self.up_left1,.1),(self.up_left2,.1)])
    self.animObjs['walk_up_right']=pyganim.PygAnimation([(self.up_right1,.1),(self.up_right2,.1)])
    self.animObjs['walk_down_left']=pyganim.PygAnimation([(self.down_left1,.1),(self.down_left2,.1)])
    self.animObjs['walk_down_right']=pyganim.PygAnimation([(self.down_right1,.1),(self.down_right2,.1)])

    self.moveConductor = pyganim.PygConductor(self.animObjs)


def go_up(self):
    self.moveUp = True
    self.moveDown = False
    if self.moveLeft:
        self.direction = UP_LEFT
    elif self.moveRight:
        self.direction = UP_RIGHT
    if not self.moveLeft and not self.moveRight:
        self.direction = UP

def go_left(self):
    self.moveLeft = True
    self.moveRight = False
    if self.moveUp:
        self.direction = UP_LEFT
    elif self.moveDown:
        self.direction = DOWN_LEFT
    elif not self.moveUp and not self.moveDown:
        self.direction = LEFT

def go_down(self):
    self.moveDown = True
    self.moveUp = False
    if self.moveLeft:
        self.direction = DOWN_LEFT
    elif self.moveRight:
        self.direction = DOWN_RIGHT
    if not self.moveLeft and not self.moveRight:
        self.direction = DOWN

def go_right(self):
    self.moveRight=True
    self.moveLeft = False
    if self.moveUp and self.moveRight:
        self.direction = UP_RIGHT
    elif self.moveDown and self.moveRight:
        self.direction = DOWN_RIGHT
    elif not self.moveUp and not self.moveDown:
        self.direction = RIGHT


def stop_up(self):
    self.moveUp = False
    if self.moveLeft:
        self.direction = LEFT
    if self.moveRight:
        self.direction = RIGHT

def stop_left(self):
    self.moveLeft = False
    if self.moveUp:
        self.direction = UP
    if self.moveDown:
        self.direction = DOWN

def stop_down(self):
    self.moveDown = False
    if self.moveLeft:
        self.direction = LEFT
    if self.moveRight:
        self.direction = RIGHT

def stop_right(self):
    self.moveRight = False
    if self.moveUp:
        self.direction = UP
    if self.moveDown:
        self.direction = DOWN

def draw(self,surface):
    surface.blit(self.image,(self.rect.x,self.rect.y))
    if self.moveUp or self.moveDown or self.moveLeft or self.moveRight:
        self.moveConductor.play()
        if self.direction == UP:
            self.animObjs['walk_up'].blit(surface,(self.rect.x,self.rect.y-36))
        if self.direction == DOWN:
            self.animObjs['walk_down'].blit(surface,(self.rect.x,self.rect.y-36))
        if self.direction == LEFT:
            self.animObjs['walk_left'].blit(surface,(self.rect.x,self.rect.y-36))
        if self.direction == RIGHT:
            self.animObjs['walk_right'].blit(surface,(self.rect.x,self.rect.y-36))
        if self.direction == UP_LEFT:
            self.animObjs['walk_up_left'].blit(surface,(self.rect.x,self.rect.y-36))
        if self.direction == UP_RIGHT:
            self.animObjs['walk_up_right'].blit(surface,(self.rect.x,self.rect.y-36))
        if self.direction == DOWN_LEFT:
            self.animObjs['walk_down_left'].blit(surface,(self.rect.x,self.rect.y-36))
        if self.direction == DOWN_RIGHT:
            self.animObjs['walk_down_right'].blit(surface,(self.rect.x,self.rect.y-36))


    else:
        self.moveConductor.stop()
        if self.direction == UP:
            surface.blit(self.up1,(self.rect.x,self.rect.y-36))
        elif self.direction == DOWN:
            surface.blit(self.down1,(self.rect.x,self.rect.y-36))
        elif self.direction == LEFT:
            surface.blit(self.left1,(self.rect.x,self.rect.y-36))
        elif self.direction == RIGHT:
            surface.blit(self.right1,(self.rect.x,self.rect.y-36))
        elif self.direction == UP_LEFT:
            surface.blit(self.up_left1,(self.rect.x,self.rect.y-36))
        elif self.direction == UP_RIGHT:
            surface.blit(self.up_right1,(self.rect.x,self.rect.y-36))
        elif self.direction == DOWN_LEFT:
            surface.blit(self.down_left1,(self.rect.x,self.rect.y-36))
        elif self.direction == DOWN_RIGHT:
            surface.blit(self.down_right1,(self.rect.x,self.rect.y-36))
def update(self):
    if self.moveUp: self.rect.y-=self.rate
    if self.moveDown: self.rect.y+=self.rate
    if self.moveLeft: self.rect.x-=self.rate
    if self.moveRight: self.rect.x+=self.rate

def collision(self,dudes):
    for dude in dudes:
        if self.rect.colliderect(dude):
            if self.direction==RIGHT and self.rect.right < dude.rect.left+5:
                self.rect.x -= self.rate
            if self.direction==LEFT and self.rect.left > dude.rect.right-5:
                self.rect.x += self.rate
            if self.direction==DOWN and self.rect.bottom < dude.rect.top+5:
                self.rect.y -=self.rate
            if self.direction==UP and self.rect.top > dude.rect.bottom-5:
                self.rect.y += self.rate
            if self.direction==DOWN_RIGHT and self.rect.bottom<dude.rect.top+5 or self.direction==DOWN_RIGHT and self.rect.right<dude.rect.left+5:
                self.rect.x-=self.rate
                self.rect.y-=self.rate
            if self.direction==DOWN_LEFT and self.rect.bottom<dude.rect.top+5 or self.direction == DOWN_LEFT  and self.rect.left>dude.rect.right-5:
                self.rect.x+=self.rate
                self.rect.y-=self.rate
            if self.direction==UP_RIGHT and self.rect.top < dude.rect.bottom+5 or self.direction==UP_RIGHT and self.rect.right<dude.rect.left+5:
                self.rect.x-=self.rate
                self.rect.y+=self.rate
            if self.direction==UP_LEFT and self.rect.top < dude.rect.bottom+5 or self.direction==UP_LEFT and self.rect.left>dude.rect.right+5:
                self.rect.x+=self.rate
                self.rect.y+=self.rate

def layer(self,dudes,surface):
    for dude in dudes:
        if self.rect.bottom>dude.rect.y+5:
            dude.draw(surface)
            self.draw(surface)
        else:
            self.draw(surface)
            dude.draw(surface)

谢谢你的阅读!在


Tags: rectselfifrateleftsurfacepygamedown