I have a problem with my sprite "Mob" not being drawn on screen. I checked if it's been adding to the all_sprites group(that's beeing drawn on screen) and it is and I can't find a proper explanation of why it's not working. I'm still pretty new to pygame so it would be great if someone could also try to explain why is the code not working the way I want it. Thank you:)
My sprites.py(shortened)
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()
My 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
is an internal method of the class pygame.sprite.Sprite
. You must rename the attribute groups
. Or better yet, remove it, you don't need it at all:
class Mob(pg.sprite.Sprite):
def __init__(self, game):
pg.sprite.Sprite.__init__(self, [game.all_sprites, game.mobs])
# [...]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.