微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame kill 方法由于某种原因只删除图像而不是矩形

如何解决Pygame kill 方法由于某种原因只删除图像而不是矩形

当我测试我的子弹和敌人之间的碰撞并使用 .kill() 方法时,图像会立即被移除,但矩形会保留一点,然后在某个点被移除,这对我来说没有意义.我已经被这个问题困住了一段时间,如果有人能提供帮助,那就太好了。

import pygame,sys

# General Setup
pygame.init()
myfont = pygame.font.SysFont('Comic Sans MS',30)
clock = pygame.time.Clock()

# Game Settings
RED = (255,0)

# Game Screen
screen = pygame.display.set_mode((1280,447))
pygame.display.set_caption("1st Game")



class Knight(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        sprite_width = 225
        sprite_height = 225
        self.standing = [pygame.transform.scale(pygame.image.load('idle001.png').convert(),(sprite_height,sprite_width)),pygame.transform.scale(pygame.image.load('idle002.png').convert(),pygame.transform.scale(pygame.image.load('idle003.png').convert(),pygame.transform.scale(pygame.image.load('idle004.png').convert(),pygame.transform.scale(pygame.image.load('idle005.png').convert(),pygame.transform.scale(pygame.image.load('idle006.png').convert(),pygame.transform.scale(pygame.image.load('idle007.png').convert(),pygame.transform.scale(pygame.image.load('idle008.png').convert(),pygame.transform.scale(pygame.image.load('idle009.png').convert(),pygame.transform.scale(pygame.image.load('idle010.png').convert(),sprite_width))]
        self.walkRight = [pygame.transform.scale(pygame.image.load('run001.png').convert(),pygame.transform.scale(pygame.image.load('run002.png').convert(),pygame.transform.scale(pygame.image.load('run003.png').convert(),pygame.transform.scale(pygame.image.load('run004.png').convert(),pygame.transform.scale(pygame.image.load('run005.png').convert(),pygame.transform.scale(pygame.image.load('run006.png').convert(),sprite_width))]
        self.walkLeft = [
            pygame.transform.scale((pygame.transform.flip(pygame.image.load('run001.png').convert(),True,False)),pygame.transform.scale((pygame.transform.flip(pygame.image.load('run002.png').convert(),pygame.transform.scale((pygame.transform.flip(pygame.image.load('run003.png').convert(),pygame.transform.scale((pygame.transform.flip(pygame.image.load('run004.png').convert(),pygame.transform.scale((pygame.transform.flip(pygame.image.load('run005.png').convert(),pygame.transform.scale((pygame.transform.flip(pygame.image.load('run006.png').convert(),sprite_width))]
        self.jumpSprite = [
            pygame.transform.scale(pygame.image.load('jump001.png').convert(),pygame.transform.scale(pygame.image.load('jump002.png').convert(),sprite_width))]
        self.attack3 = [pygame.transform.scale(pygame.image.load('attack3001.png').convert(),pygame.transform.scale(pygame.image.load('attack3002.png').convert(),pygame.transform.scale(pygame.image.load('attack3003.png').convert(),pygame.transform.scale(pygame.image.load('attack3004.png').convert(),pygame.transform.scale(pygame.image.load('attack3005.png').convert(),sprite_width))]
        self.fallSprite = [
            pygame.transform.scale(pygame.image.load('fall001.png').convert(),pygame.transform.scale(pygame.image.load('fall002.png').convert(),sprite_width))]

        self.isJump = False
        self.jumpCount = 10
        self.player_movement = 225
        self.walkCount = 0
        self.bulletCount = 5
        self.image = self.standing[self.walkCount]
        self.rect = self.image.get_rect(topleft=(50,225))
        self.hitBox = pygame.Rect(255,300,50,70)
        self.textsurface = myfont.render("AMMO: {}".format(self.bulletCount),False,(0,0))
    def update(self,keys_pressed,mouse_pressed):
        if keys_pressed[pygame.K_d]:
            self.rect.x += 4
            self.walkCount += 0.1
            if self.walkCount >= len(self.walkRight):
                self.walkCount = 0
            self.image = self.walkRight[int(self.walkCount)]
        elif keys_pressed[pygame.K_a]:
            self.rect.x -= 4
            self.walkCount += 0.1
            if self.walkCount >= len(self.walkLeft):
                self.walkCount = 0
            self.image = self.walkLeft[int(self.walkCount)]
        elif mouse_pressed:
            self.walkCount += 0.1
            if self.walkCount >= len(self.attack3):
                self.walkCount = 0
            self.image = self.attack3[int(self.walkCount)]
        elif keys_pressed[pygame.K_SPACE]:
            self.walkCount += 0.1
            if self.walkCount >= len(self.jumpSprite):
                self.walkCount = 0
            self.image = self.jumpSprite[int(self.walkCount)]
        elif keys_pressed[pygame.K_s] and self.rect.y < 225:
            self.walkCount += 0.1
            if self.walkCount >= len(self.fallSprite):
                self.walkCount = 0
            self.image = self.fallSprite[int(self.walkCount)]
        else:
            self.walkCount += 0.1
            if self.walkCount >= len(self.standing):
                self.walkCount = 0
            self.image = self.standing[int(self.walkCount)]
        if not (self.isJump):
            if keys_pressed[pygame.K_SPACE]:
                self.isJump = True
        else:
            if self.jumpCount >= -10:
                self.player_movement -= (self.jumpCount * abs(self.jumpCount)) * 0.3
                self.jumpCount -= 1
            else:
                self.jumpCount = 10
                self.isJump = False
        self.rect.y = self.player_movement

        if keys_pressed[pygame.K_r]:
            self.bulletCount = 5

        if self.rect.left < 50:
            self.rect.left = 50
    def create_bullet(self):

        return Bullet(knight.hitBox.x,knight.hitBox.y)

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy,self).__init__()
        enemy_height = 200
        enemy_width = 200
        self.EnemyWalkLeft = [pygame.transform.scale((pygame.transform.flip(pygame.image.load('skeletonrun001.png').convert(),(enemy_height,enemy_width)),pygame.transform.scale((pygame.transform.flip(pygame.image.load('skeletonrun002.png').convert(),pygame.transform.scale((pygame.transform.flip(pygame.image.load('skeletonrun003.png').convert(),pygame.transform.scale((pygame.transform.flip(pygame.image.load('skeletonrun004.png').convert(),enemy_width))]
        self.walkCount = 0
        self.image = self.EnemyWalkLeft[self.walkCount]
        self.rect = self.image.get_rect(topleft=(1100,236))
        self.hitBox = pygame.Rect(1100,236,70)
    def update(self):
        self.rect.x -= 2
        if self.rect.right < 0:
            self.kill()
        self.walkCount += 0.1
        if self.walkCount >= len(self.EnemyWalkLeft):
            self.walkCount = 0
        self.image = self.EnemyWalkLeft[int(self.walkCount)]


class Background():
    def __init__(self):
        self.bgimage = pygame.image.load('bg.png')
        self.rectbgimg = self.bgimage.get_rect()
        self.bgY1 = 0
        self.bgX1 = 0
        self.bgY2 = 0
        self.bgX2 = self.rectbgimg.width
        self.moving_speed = 1
    def update(self,keys_pressed):
        if keys_pressed[pygame.K_d]:
            self.bgX1 -= self.moving_speed
            self.bgX2 -= self.moving_speed
        if keys_pressed[pygame.K_a]:
            self.bgX1 += self.moving_speed
            self.bgX2 += self.moving_speed
        if self.bgX1 <= -self.rectbgimg.width:
            self.bgX1 = self.rectbgimg.width
        if self.bgX2 <= - self.rectbgimg.width:
            self.bgX2 = self.rectbgimg.width
    def draw(self):
        screen.blit(self.bgimage,(self.bgX1,self.bgY1))
        screen.blit(self.bgimage,(self.bgX2,self.bgY2))


class Bullet(pygame.sprite.Sprite):
    def __init__(self,pos_x,pos_y):
        super().__init__()
        self.image = pygame.Surface((15,5))
        self.image.fill((255,0))
        self.rect = self.image.get_rect(center = (pos_x,pos_y))

    def update(self):

        self.rect.x += 12

        if self.rect.x >= 1280:
            self.kill()



# Creating the sprites and groups
hit_Box = pygame.sprite.Group()
moving_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
knight = Knight()
enemy = Enemy()
background = Background()
enemies.add(enemy)
moving_sprites.add(knight)
moving_sprites.add(enemy)

# Create a custom event for adding a new enemy
ADDENEMY = pygame.USEREVENT
pygame.time.set_timer(ADDENEMY,4000)




run = True
while run:
    # Handling events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == ADDENEMY:
            enemy = Enemy()
            enemies.add(enemy)
            moving_sprites.add(enemy)
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_c:
                if knight.bulletCount > 0:
                    knight.bulletCount -= 1
                    bullet_group.add(knight.create_bullet())

    if knight.hitBox.colliderect(enemy.hitBox):
        knight.kill()

    if pygame.sprite.groupcollide(bullet_group,enemies,True):
        enemy.kill()


    keys_pressed = pygame.key.get_pressed()
    mouse_pressed = pygame.mouse.get_pressed()[0]

    # Drawing
    screen.blit(background.bgimage,background.rectbgimg)
    background.draw()
    bullet_group.draw(screen)
    moving_sprites.draw(screen)
    enemies.draw(screen)
    screen.blit(knight.textsurface,0))
    pygame.draw.rect(screen,RED,enemy.rect,1)
    pygame.draw.rect(screen,knight.rect,255),knight.hitBox,enemy.hitBox,1)



    # Update
    bullet_group.update()
    enemy.update()
    enemies.update()
    knight.update(keys_pressed,mouse_pressed)
    background.update(keys_pressed)
    knight.hitBox.center = knight.rect.center
    enemy.hitBox.center = enemy.rect.center
    # Render the screen
    pygame.display.update()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。