I am struggling to give each sprite their own image in the code below and i cant seem to find a way to do it, if anyone could help it would be much appreciated. Thanks. (This is my first time using stack overflow so aplogies if the formating is messy or wrong) Also let me know if i should put in the text map file.
Code Below:
import pygame
from pygame import *
from pygame import mixer
import pygame.freetype
import time
SCREEN_SIZE = pygame.Rect((0, 0, 800, 640))
TILE_SIZE = 32
Map_border = (1000, 500)
GRAVITY = pygame.Vector2((0, 0.4))
STONE_IMAGE = pygame.image.load("stone.png")
class CameraAwareLayeredUpdates(pygame.sprite.LayeredUpdates):
def __init__(self, target, world_size):
super().__init__()
self.target = target
self.cam = pygame.Vector2(0, 0)
self.world_size = world_size
if self.target:
self.add(target)
def update(self, *args):
super().update(*args)
if self.target:
x = -self.target.rect.center[0] SCREEN_SIZE.width / 2
y = -self.target.rect.center[1] SCREEN_SIZE.height / 2
self.cam = (pygame.Vector2((x, y)) - self.cam) * 0.5
self.cam.x = max(-(self.world_size.width - SCREEN_SIZE.width), min(0, self.cam.x))
self.cam.y = max(-(self.world_size.height - SCREEN_SIZE.height), min(0, self.cam.y))
def draw(self, surface):
spritedict = self.spritedict
surface_blit = surface.blit
dirty = self.lostsprites
self.lostsprites = []
dirty_append = dirty.append
init_rect = self._init_rect
for spr in self.sprites():
rec = spritedict[spr]
newrect = surface_blit(spr.image, spr.rect.move(self.cam))
if rec is init_rect:
dirty_append(newrect)
else:
if newrect.colliderect(rec):
dirty_append(newrect.union(rec))
else:
dirty_append(newrect)
dirty_append(rec)
spritedict[spr] = newrect
return dirty
def main():
Music()
Map = open("map.txt")
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE.size)
pygame.display.set_caption("Good Luck")
timer = pygame.time.Clock()
platforms = pygame.sprite.Group()
player = Player(platforms, (TILE_SIZE, TILE_SIZE))
level_width = Map_border[0] * TILE_SIZE
level_height = Map_border[1] * TILE_SIZE
entities = CameraAwareLayeredUpdates(player, pygame.Rect(0, 0, level_width, level_height))
# build the map_border
x = y = 0
for row in Map:
for col in row:
if col == "P":
PlatBasic((x, y), platforms, entities)
if col == "E":
PlatExit((x, y), platforms, entities)
if col == "S":
PlatSpeedH((x, y), platforms, entities)
if col == "M":
PlatSpeedM((x, y), platforms, entities)
if col == "L":
PlatSpeedL((x, y), platforms, entities)
if col == "N":
PlatNorm((x, y), platforms, entities)
if col == "J":
PlatJump((x, y), platforms, entities)
x = TILE_SIZE
y = TILE_SIZE
x = 0
while 1:
for e in pygame.event.get():
if e.type == QUIT:
return
if e.type == KEYDOWN and e.key == K_ESCAPE:
return
entities.update()
screen.fill((0, 0, 0))
entities.draw(screen)
pygame.display.update()
timer.tick(60)
class Entity(pygame.sprite.Sprite):
def __init__(self, color, pos, *groups):
super().__init__(*groups)
self.image = Surface((TILE_SIZE, TILE_SIZE))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=pos)
class Player(Entity):
def __init__(self, platforms, pos, *groups):
super().__init__(Color("#5aa2e0"), pos)
self.vel = pygame.Vector2((0, 0))
self.onGround = False
self.platforms = platforms
self.speed = 8
self.jump_strength = 10
def update(self):
pressed = pygame.key.get_pressed()
up = pressed[K_SPACE]
left = pressed[K_LEFT]
right = pressed[K_RIGHT]
running = pressed[K_UP]
if up:
# only jump if on the ground
if self.onGround: self.vel.y = -self.jump_strength
if left:
self.vel.x = -self.speed
if right:
self.vel.x = self.speed
if running:
self.vel.x *= 1.5
if not self.onGround:
# only accelerate with gravity if in the air
self.vel = GRAVITY
# max falling speed
if self.vel.y > 100: self.vel.y = 100
if not (left or right):
self.vel.x = 0
# increment in x direction
self.rect.left = self.vel.x
# do x-axis collisions
self.collide(self.vel.x, 0, self.platforms)
# increment in y direction
self.rect.top = self.vel.y
# assuming we're in the air
self.onGround = False;
# do y-axis collisions
self.collide(0, self.vel.y, self.platforms)
def collide(self, xvel, yvel, platforms):
for p in platforms:
if pygame.sprite.collide_rect(self, p):
if isinstance(p, PlatExit):
pygame.event.post(pygame.event.Event(QUIT))
if isinstance(p, PlatSpeedH):
self.speed = 50
if isinstance(p, PlatSpeedM):
self.speed = 16
if isinstance(p, PlatSpeedL):
self.speed = 5
if isinstance(p, PlatNorm):
self.speed = 8
self.jump_strength = 10
if isinstance(p, PlatJump):
self.jump_strength = 30
if xvel > 0:
self.rect.right = p.rect.left
if xvel < 0:
self.rect.left = p.rect.right
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
self.vel.y = 0
if yvel < 0:
self.rect.top = p.rect.bottom
class PlatBasic(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#10eb93"), pos, *groups)
class PlatExit(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#c40c0c"), pos, *groups)
class PlatSpeedH(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#0033FF"), pos, *groups)
class PlatSpeedM(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#0033FF"), pos, *groups)
class PlatSpeedL(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#0033FF"), pos, *groups)
class PlatNorm(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#0033FF"), pos, *groups)
class PlatJump(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#0033FF"), pos, *groups)
class PlatImmune(Entity):
def __init__(self, pos, *groups):
super().__init__(Color("#0033FF"), pos, *groups)
class Music():
mixer.init()
mixer.music.load('bensound-summer_ogg_music.ogg')
mixer.music.play()
if __name__ == "__main__":
main()
CodePudding user response:
In your child class for each sprite you want an image, you need to add a variable that holds the loaded image you want to display. Then, when you display that sprite, you just use that particular variable from the class.
class PlatBasic(Entity):
def __init__(self, pos, *groups):
self.image = pygame.image.load("PlatBasic.png").convert()
super().__init__(Color("#10eb93"), pos, *groups)
Then when you wish to display it, you can just do:
x = PlatBasic((0,0))
screen.blit(x.image,x.pos)