117 lines
3.6 KiB
Python
117 lines
3.6 KiB
Python
from gamedata.objects.base import BaseObject
|
|
|
|
class Player(BaseObject):
|
|
|
|
def __init__(self,x,y,game):
|
|
|
|
self.sprite = game.sprite_lib["icon.png"]
|
|
|
|
super().__init__(x,y,game,self.sprite.get_width(),self.sprite.get_height())
|
|
|
|
tileset = game.gameloop.findname("TilesetRenderer")[0]
|
|
self.collisionrects = tileset.rects
|
|
self.tilew = tileset.solidtilew
|
|
self.tileh = tileset.solidtileh
|
|
|
|
self.speed = 300
|
|
|
|
self.stepsize = 20
|
|
|
|
self.gravity = 1500
|
|
self.maxgravity = 800
|
|
self.jump = -600
|
|
self.vertical = self.maxgravity
|
|
|
|
self.hrest = 0
|
|
self.vrest = 0
|
|
|
|
def step(self):
|
|
keys = self.game.inputs["keys"]
|
|
hor=keys["right"]["pressed"]-keys["left"]["pressed"]
|
|
|
|
# Si je suis sur le sol
|
|
self.onground = False
|
|
if self.checkcollisions(0,1):
|
|
self.onground = True
|
|
self.vertical=0
|
|
else:
|
|
self.vertical+=self.gravity*self.game.dt
|
|
self.vertical = min(self.maxgravity,self.vertical)
|
|
if self.checkcollisions(0,-1):
|
|
self.vertical = max(0,self.vertical) # Se cogne au plafond
|
|
|
|
self.jumped = False
|
|
if self.onground:
|
|
if 0<keys["up"]["timer"]<=3:
|
|
self.vertical = self.jump
|
|
self.jumped = True
|
|
|
|
if self.vertical==0:
|
|
self.move(0,-self.stepsize)
|
|
self.move(hor*self.speed*self.game.dt,self.vertical*self.game.dt)
|
|
self.move(0,self.stepsize)
|
|
else:
|
|
self.move(hor*self.speed*self.game.dt,self.vertical*self.game.dt)
|
|
|
|
self.game.globals["camerax"] = self.rect.center[0]-self.game.globals["cameraw"]/2
|
|
self.game.globals["cameray"] = self.rect.center[1]-self.game.globals["camerah"]/2
|
|
|
|
def move(self,movex,movey):
|
|
hstoped = False
|
|
hor = int(movex+self.hrest)
|
|
self.hrest = movex+self.hrest-hor
|
|
while abs(hor)>0:
|
|
if hor>=self.tilew:
|
|
diffx = self.tilew
|
|
elif hor<=-self.tilew:
|
|
diffx = -self.tilew
|
|
else:
|
|
diffx = hor
|
|
rect = self.checkcollisions(diffx,0)
|
|
if rect:
|
|
hor = 0
|
|
self.hrest = 0
|
|
hstopped = True
|
|
if diffx>0:
|
|
self.rect.right = rect.left
|
|
else:
|
|
self.rect.left = rect.right
|
|
else:
|
|
hor-=diffx
|
|
self.rect[0]+=diffx
|
|
|
|
vstoped = False
|
|
ver = int(movey+self.vrest)
|
|
self.vrest = movey+self.vrest-ver
|
|
while abs(ver)>0:
|
|
if abs(ver)>self.tileh:
|
|
diffy = self.tileh*abs(ver)/ver
|
|
else:
|
|
diffy = ver
|
|
rect = self.checkcollisions(0,diffy)
|
|
if rect:
|
|
vstopped = True
|
|
ver = 0
|
|
self.vrest = 0
|
|
if diffy>0:
|
|
self.rect.bottom = rect.top
|
|
else:
|
|
self.rect.top = rect.bottom
|
|
else:
|
|
ver-=diffy
|
|
self.rect[1]+=diffy
|
|
|
|
def checkcollisions(self,offx,offy):
|
|
temprect = self.rect.copy()
|
|
temprect[0]+=offx
|
|
temprect[1]+=offy
|
|
result = False
|
|
for rect in self.collisionrects:
|
|
if temprect.colliderect(rect):
|
|
result = rect
|
|
break
|
|
return result
|
|
|
|
def draw(self):
|
|
self.game.window.blit(self.sprite,[self.rect[0]-self.game.globals["camerax"],self.rect[1]-self.game.globals["cameray"]])
|