Das Problem ist, dass mein Player-Objekt nach Kollision mit dem Platform-Objekt jeweils ein paar Pixel auf und runter wackelt. Ich habe einen Verdacht warum, verstehe es aber ehrlich gesagt dennoch nicht. Im Sourcecode (siehe weiter unten) wird in der main.py die Methode run ausgeführt. Dadurch wird meiner Meinung nach zuerst der Player im Spiel (siehe Methode update in der Player-Klasse in der Datei sprites.py) mit self.acc = vec(0, 0.5) in der Y-Achse nach unten verschoben (Schwerkraft). Dann wird in der Methode update in der Game-Klasse in der Datei main.py geprüft, ob der Player mit einer Platform kollidiert. Falls ja, dann wird die Position der Y-Achse des Players = Höhe der Platform gesetzt und die Player Y-Velocity auf 0. Dennoch springt mein Player jeweils ein paar Pixel auf und ab auf der Platform. Es macht denn anschein, als würde zuerst die Schwerkraft (0.5) ausgeführt, der Player taucht in die Platform ein Stück weit ein und wird dann wieder auf die Höhe der Platform gesetzt. Aber ich verstehe nicht warum, weil der draw-Befehl von Python erfolgt doch erst, nachdem der Player durch die Methode update in der Game-Klasse auf Pos Y = Höhe der Platform gesetzt wurde. Kann mir jemand helfen?
main.py
Code: Alles auswählen
# Jumpy! - platform game
import pygame as pg
import random
from settings import *
from sprites import *
class Game:
def __init__(self):
# initialize game windows, etc
pg.init()
pg.mixer.init()
self.screen = pg.display.set_mode((WIDTH, HEIGHT))
pg.display.set_caption(TITLE)
self.clock = pg.time.Clock()
self.running = True
def new(self):
# start a new game
self.all_sprites = pg.sprite.Group()
self.platforms = pg.sprite.Group()
self.player = Player()
self.all_sprites.add(self.player)
p1 = Platform(0, HEIGHT - 40, WIDTH, 40)
self.all_sprites.add(p1)
self.platforms.add(p1)
p2 = Platform(WIDTH / 2 - 50, HEIGHT * 3/4, 100, 20)
self.all_sprites.add(p2)
self.platforms.add(p2)
self.run()
def run(self):
# Game Loop
# keep loop runing at the right speed
self.playing = True
while self.playing:
self.clock.tick(FPS)
self.events()
self.update()
self.draw()
def update(self):
# Game Loop - Update
self.all_sprites.update()
# Collision check
hits = pg.sprite.spritecollide(self.player, self.platforms, False)
if hits:
self.player.pos.y = hits[0].rect.top
self.player.vel.y = 0
def events(self):
# Game Loop - events
for event in pg.event.get():
# check for clsoing windows
if event.type == pg.QUIT:
if self.playing:
self.playing = False
self.running = False
def draw(self):
# Game Loop - draw
#Draw / render
self.screen.fill(BLACK)
self.all_sprites.draw(self.screen)
# *after* drawing everything, flip the display
pg.display.flip()
def show_start_screen(self):
# game splash/start screen
pass
def show_go_screen(self):
# game over/continue
pass
g = Game()
g.show_start_screen()
while g.running:
g.new()
g.show_go_screen()
pg.quit()
Code: Alles auswählen
# Sprite classes for platform game
import pygame as pg
from settings import *
vec = pg.math.Vector2
class Player(pg.sprite.Sprite):
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((30, 40))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH / 2, HEIGHT / 2)
self.pos = vec(WIDTH / 2, HEIGHT / 2)
self.vel = vec(0, 0)
self.acc = vec(0, 0)
def update(self):
self.acc = vec(0, 0.5)
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
self.acc.x = -PLAYER_ACC
if keys[pg.K_RIGHT]:
self.acc.x = PLAYER_ACC
# apply friction
self.acc.x += self.vel.x * PLAYER_FRICTION
# equations of motion
self.vel += self.acc
self.pos += self.vel + 0.5 * self.acc
# wrap around the sides of the screen
if self.pos.x > WIDTH:
self.pos.x = 0
if self.pos.x < 0:
self.pos.x = WIDTH
self.rect.midbottom = self.pos
class Platform(pg.sprite.Sprite):
def __init__(self, x, y, w, h):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((w, h))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
Code: Alles auswählen
# game options/settings
TITLE = "Jumpy!"
WIDTH = 480
HEIGHT = 600
FPS = 60
# Player properties
PLAYER_ACC = 0.5
PLAYER_FRICTION = -0.12
# define colors
WHITE = (255,255,255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)