问题描述
我的精灵“ Mob”没有在屏幕上绘制时出现问题。 我检查了它是否已添加到all_sprites组(在屏幕上绘制的蜂鸣声),并且它是否存在,但我找不到适当的解释来说明为什么它不起作用。 我对pygame还是很陌生,所以如果有人也可以尝试解释为什么代码不能按照我想要的方式工作,那将是很棒的。谢谢:)
我的sprites.py(缩短)
import pygame as pg
from settings import *
from random import choice,randrange
vec = pg.math.Vector2
# for movement
class Spritesheet:
def __init__(self,filename):
self.spritesheet = pg.image.load(filename).convert()
def get_image(self,x,y,width,height):
image = pg.Surface((width,height))
image.blit(self.spritesheet,(0,0),(x,height))
image = pg.transform.scale(image,(width // 2,height // 2))
return image
class Player(pg.sprite.Sprite):
....
class Platform(pg.sprite.Sprite):
....
class Pow(pg.sprite.Sprite):
....
class Mob(pg.sprite.Sprite):
def __init__(self,game):
self.groups = game.all_sprites,game.mobs
pg.sprite.Sprite.__init__(self,self.groups)
self.game = game
self.image_up = game.spritesheet.get_image(566,510,122,139)
self.image_up.set_colorkey(BLACK)
self.image_down = game.spritesheet.get_image(568,1534,135)
self.image_up.set_colorkey(BLACK)
self.image = self.image_up
self.rect = self.image.get_rect()
self.rect.centerx = choice([-100,WIDTH + 100])
self.vx = randrange(1,4)
if self.rect.centerx < WIDTH + 100:
self.vx *= -1
self.rect.y = randrange(HEIGHT / 2)
self.vy = 0
self.dy = 0.5
def update(self):
self.rect.x += self.vx
self.vy += self.dy
if self.vy > 3 or self.vy < -3:
self.dy *= -1
center = self.rect.center
# každý z obrázků má trochu jinou velikost = centrum je jinde
if self.dy < 0:
self.image = self.image_up
else:
self.image = self.image_down
self.rect = self.image.get_rect()
self.rect.center = center
self.rect.y += self.vy
if self.rect.left > WIDTH + 100 or self.rect.right < -100:
self.kill()
我的main.py:
import random
import pygame as pg
from settings import *
from sprites import *
from os import path
class Game:
def __init__(self):
# initialize the game window
self.running = True
pg.init()
pg.mixer.init()
self.screen = pg.display.set_mode((WIDTH,HEIGHT))
pg.display.set_caption('My game')
self.clock = pg.time.Clock()
self.font_name = pg.font.match_font(FONT_NAME)
self.load_data()
def load_data(self):
self.dir = path.dirname(__file__)
img_dir = path.join(self.dir,'img')
with open(path.join(self.dir,HS_FILE),'w') as f:
try:
self.highscore = int(f.read())
except:
self.highscore = 0
self.spritesheet = Spritesheet(path.join(img_dir,SPRITESHEET))
# import sound file
self.snd_dir = path.join(self.dir,'snd')
#self.jump_sound = pg.mixer.sound(path.join(self.snd_dir,'jump.bfxrsound'))
def new(self):
# to start a new game,reset the pieces
self.score = 0
self.all_sprites = pg.sprite.Group()
self.platforms = pg.sprite.Group()
self.powerups = pg.sprite.Group()
self.mobs = pg.sprite.Group()
self.mob_timer = 0
self.player = Player(self)
for plat in PLAT_LIST:
Platform(self,*plat)
# pg.mixer.music.load(path.join(self.snd.dir,filenamw))
self.run()
def run(self):
self.playing = True
while self.playing:
#pg.mixer.music.play(loops=-1)
self.clock.tick(FPS)
self.events()
self.update()
self.draw()
def update(self):
# Game Loop - Update
self.all_sprites.update()
#spawning mobs
Now = pg.time.get_ticks()
if Now - self.mob_timer > 5000 + random.choice([-1000,- 500,500,1000]):
self.mob_timer = Now
Mob(self)
m = Mob(self)
# deleting the platforms
if self.player.rect.top <= HEIGHT / 4:
self.player.pos.y += abs(self.player.vel.y)
for plat in self.platforms:
plat.rect.y += abs(self.player.vel.y)
if plat.rect.top > HEIGHT:
plat.kill()
self.score += 10
# check if player hits a platform - only if falling
if self.player.vel.y > 0:
hits = pg.sprite.spritecollide(self.player,self.platforms,False)
if hits:
lowest = hits[0]
for hit in hits:
if hit.rect.bottom > lowest.rect.bottom:
lowest = hit
if lowest.rect.right + 10 > self.player.pos.x > lowest.rect.left - 10:
if self.player.pos.y < lowest.rect.centery:
self.player.pos.y = lowest.rect.top
self.player.vel.y = 0
self.player.jumping = False
# die
if self.player.rect.bottom > HEIGHT:
for sprite in self.all_sprites:
sprite.rect.y -= max(self.player.vel.y,10)
if sprite.rect.bottom < 0:
sprite.kill()
if len(self.platforms) == 0:
self.playing = False
while len(self.platforms) < 6:
width = random.randrange(50,100)
p = Platform(self,random.randrange(0,WIDTH - width),random.randrange(-75,-30))
self.platforms.add(p)
self.all_sprites.add(p)
pow_hits = pg.sprite.spritecollide(self.player,self.powerups,True)
for pow in pow_hits:
if pow.type == 'boost':
#self.boost_sound.play()
self.player.vel.y = - BOOST_POWER
def events(self):
for event in pg.event.get():
if event.type == pg.QUIT:
if self.playing:
self.playing = False
self.running = False
if event.type == pg.KEYDOWN:
if event.key == pg.K_SPACE:
self.player.jump()
if event.type == pg.KEYUP:
if event.key == pg.K_SPACE:
self.player.jump_cut()
def draw(self):
self.screen.fill(BG_COLOR)
self.all_sprites.draw(self.screen)
self.draw_text(str(self.score),20,WHITE,WIDTH / 2,15)
pg.display.flip()
def draw_text(self,text,size,color,y):
font = pg.font.Font(self.font_name,size)
text_surface = font.render(text,True,color)
text_rect = text_surface.get_rect()
text_rect.midtop = (x,y)
self.screen.blit(text_surface,text_rect)
def show_start_screen(self):
self.screen.fill(BG_COLOR)
self.draw_text("Jumpy!",40,HEIGHT / 4)
self.draw_text("arrows to move,space to jump",22,HEIGHT / 2)
self.draw_text("Press any key to jump",HEIGHT * 3 / 4)
self.draw_text("High score: " + str(self.highscore),HEIGHT * 3 / 4 + 40)
pg.display.flip()
self.wait_for_key()
def show_go_screen(self):
if not self.running:
return
self.screen.fill(BG_COLOR)
self.draw_text("GAME OVER",48,HEIGHT / 4)
self.draw_text("score: " + str(self.score),HEIGHT / 2)
self.draw_text("Press a key to play again",HEIGHT * 3 / 4)
if self.score > self.highscore:
self.highscore = self.score
self.draw_text("NEW HIGH score!!",HEIGHT / 2 + 40)
pg.display.flip()
self.wait_for_key()
def wait_for_key(self):
waiting = True
while waiting:
for event in pg.event.get():
if event.type == pg.QUIT:
waiting = False
self.running = False
if event.type == pg.KEYUP:
waiting = False
game = Game()
game.show_start_screen()
while game.running:
game.new()
game.show_go_screen()
pg.quit()
解决方法
groups
是类 pygame.sprite.Sprite
的内部方法。您必须重命名属性 groups
。或者更好的是,删除它,你根本不需要它:
class Mob(pg.sprite.Sprite):
def __init__(self,game):
pg.sprite.Sprite.__init__(self,[game.all_sprites,game.mobs])
# [...]