问题描述
当我测试我的子弹和敌人之间的碰撞并使用 .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 (将#修改为@)