[英]Python Pygame: Sprite not being drawn
我的精灵“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, y, width, 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, 122, 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, 0, 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, x, 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, WHITE, WIDTH / 2, HEIGHT / 4)
self.draw_text("arrows to move, space to jump", 22, WHITE, WIDTH / 2, HEIGHT / 2)
self.draw_text("Press any key to jump", 22, WHITE, WIDTH / 2, HEIGHT * 3 / 4)
self.draw_text("High score: " + str(self.highscore), 22, WHITE, WIDTH / 2, 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, WHITE, WIDTH / 2, HEIGHT / 4)
self.draw_text("Score: " + str(self.score), 22, WHITE, WIDTH / 2, HEIGHT / 2)
self.draw_text("Press a key to play again", 22, WHITE, WIDTH / 2, HEIGHT * 3 / 4)
if self.score > self.highscore:
self.highscore = self.score
self.draw_text("NEW HIGH SCORE!!", 22, WHITE, WIDTH / 2, 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
是 class pygame.sprite.Sprite
的内部方法。 您必须重命名属性groups
。 或者更好的是,删除它,你根本不需要它:
class Mob(pg.sprite.Sprite):
def __init__(self, game):
pg.sprite.Sprite.__init__(self, [game.all_sprites, game.mobs])
# [...]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.