I've recently started writing a 2d platformer in Python, using pyGame. It is based heavily on this tutorial, which means it is built by the MVC design. Now I managed to load spritesheets and make my character move around, but I have no idea of how to make it jump. I've been trying all day with no result. I coded it the way I did because I want it to be easily turned into an online game. I would really appreciate some pointers. Below, there is the code for movement, just so you can see how it works.
events.py
class AvatarMoveRequest(Request):
def __init__(self, vector):
self.name = 'Avatar Move'
self.vector = vector
...
class AvatarMoveEvent(Event):
def __init__(self, avatar):
self.name = 'Avatar Move'
self.avatar = avatar
...
class EventManager:
def __init__(self):
from weakref import WeakKeyDictionary
self.listeners = WeakKeyDictionary()
self.eventQueue = []
def RegisterListener(self, listener):
self.listeners[listener] = 1
def UnregisterListener(self, listener):
if listener in self.listeners.keys():
del self.listeners[listener]
def Post(self, event):
#if not isinstance(event, TickEvent):
# utility.Debug('\tMessage: %s' % event)
if isinstance(event, AvatarJumpRequest) or\
isinstance(event, AvatarJumpEvent):
utility.Debug('\t%s' % event)
for listener in self.listeners.keys():
listener.Notify(event)
control.py
class KeyboardController: def __init__(self, evManager): self.evManager = evManager self.evManager.RegisterListener(self) def Notify(self, event): if isinstance(event, events.TickEvent): for event in pygame.event.get(): if event.type == QUIT: ev = events.QuitEvent() self.evManager.Post(ev) key = pygame.key.get_pressed() # Horizontal movement direction = (key[K_RIGHT] - key[K_LEFT]) if direction: vector = utility.Vec2d( utility.settings['SPEED'], 0 ) ev = events.AvatarMoveRequest(vector * direction) self.evManager.Post(ev)
avatar.py
class Avatar: ... def Move(self, vector): if self.state == Avatar.STATE_INACTIVE: return if (self.rect.x + vector.x) <= 0: self.rect.x = 0 elif (self.rect.x + vector.x) >= (utility.settings['WIDTH'] - 28): self.rect.x = (utility.settings['WIDTH'] - 28) else: self.rect.x += vector.x ev = events.AvatarMoveEvent(self) self.evManager.Post(ev) self.vector = vector def Notify(self, event): elif isinstance(event, events.AvatarMoveRequest): self.Move(event.vector)
view.py
import pygame
from pygame.locals import *
import events
import utility
import sprite
class PygameView:
def __init__(self, evManager):
self.evManager = evManager
self.evManager.RegisterListener(self)
# Display
pygame.init()
self.window = pygame.display.set_mode(
(utility.settings['WIDTH'], utility.settings['HEIGHT']), 0, 32
)
pygame.display.set_caption('game')
self.background = pygame.Surface(self.window.get_size())
self.background.fill((255, 255, 255))
self.window.blit(self.background, (0, 0))
pygame.display.flip()
self.backSprites = pygame.sprite.RenderUpdates()
self.frontSprites = pygame.sprite.RenderUpdates()
def MoveAvatar(self, avatar):
avatarSprite = self.GetAvatarSprite(avatar)
if avatar.vector.x < 0:
avatarSprite.Update(pygame.time.get_ticks(), True)
else:
avatarSprite.Update(pygame.time.get_ticks())
avatarSprite.rect = avatar.rect
def GetAvatarSprite(self, avatar):
for s in self.frontSprites:
return s
return None
def Notify(self, event):
if isinstance(event, events.TickEvent):
self.background.fill((255, 255, 255))
for s in self.frontSprites:
self.background.blit(s.image, (s.rect.x, s.rect.y))
self.window.blit(self.background, (0, 0))
pygame.display.flip()
elif isinstance(event, events.AvatarMoveEvent):
self.MoveAvatar(event.avatar)
Thanks for reading, I hope you can help!






