diff --git a/gamedata/objects/base.py b/gamedata/objects/base.py index e541d44..1bb1b63 100644 --- a/gamedata/objects/base.py +++ b/gamedata/objects/base.py @@ -2,7 +2,7 @@ import pygame class BaseObject(): def __init__(self,x,y,game,w=10,h=10): - self.rect = [x,y,w,h] + self.rect = pygame.Rect([x,y,w,h]) self.baserect = self.rect.copy() self.game = game self.sprite = game.sprite_lib["icon.png"] diff --git a/gamedata/objects/combat/player.py b/gamedata/objects/combat/player.py index 39a4ddc..68b9029 100644 --- a/gamedata/objects/combat/player.py +++ b/gamedata/objects/combat/player.py @@ -15,125 +15,99 @@ class Player(BaseObject): self.speed = 300 - self.gravity = 800 - self.maxgrav = 400 - self.jump = -400 - self.vertical = self.maxgrav + self.gravity = 1500 + self.maxgravity = 800 + self.jump = -600 + self.vertical = self.maxgravity + + self.collisionrects = self.getrects() + + self.hrest = 0 + self.vrest = 0 def step(self): keys = self.game.inputs["keys"] hor=keys["right"]["pressed"]-keys["left"]["pressed"] - # Check if on ground + # Si je suis sur le sol self.onground = False - targetpos = self.getgridpos(0,1) - pos = [targetpos["dl"],targetpos["dr"]] - for x in range(pos[0]["x"],pos[1]["x"]+1): - if pos[0]["y"]>=0 and pos[0]["y"]<len(self.grid): - if x>=0 and x<len(self.grid[pos[0]["y"]]): - if self.grid[pos[0]["y"]][x]==1: - self.onground = True - break - - # Check if under ceiling - self.onceiling = False - targetpos = self.getgridpos(0,-1) - pos = [targetpos["ul"],targetpos["ur"]] - for x in range(pos[0]["x"],pos[1]["x"]+1): - if pos[0]["y"]>=0 and pos[0]["y"]<len(self.grid): - if x>=0 and x<len(self.grid[pos[0]["y"]]): - if self.grid[pos[0]["y"]][x]==1: - self.onceiling= True - break - - if not self.onground: - self.vertical += self.gravity*self.game.dt - self.vertical = min(self.maxgrav,self.vertical) + if self.checkcollisions(0,1): + self.onground = True + self.vertical=0 else: - if keys["up"]["timer"]==1: - self.vertical = self.jump - else: - self.vertical = 0 + self.vertical+=self.gravity*self.game.dt + self.vertical = min(self.maxgravity,self.vertical) - if self.onceiling and self.vertical < 0: - self.vertical = 0 + self.jumped = False + if self.onground: + if 0<keys["up"]["timer"]<=3: + self.vertical = self.jump + self.jumped = True self.move(hor*self.speed*self.game.dt,self.vertical*self.game.dt) + if self.jumped: + print(self.vertical*self.game.dt) - def getgridpos(self,modx=0,mody=0): - result = {} - - result["ul"] = {} - result["ul"]["y"] = int((self.rect[1]+mody)/self.tileh) - result["ul"]["x"] = int((self.rect[0]+modx)/self.tilew) - - result["ur"] = {} - result["ur"]["y"] = result["ul"]["y"] - result["ur"]["x"] = int((self.rect[0]+self.rect[2]+modx)/self.tilew) - - result["dl"] = {} - result["dl"]["y"] = int((self.rect[1]+self.rect[3]+mody)/self.tileh) - result["dl"]["x"] = result["ul"]["x"] - - result["dr"] = {} - result["dr"]["y"] = result["dl"]["y"] - result["dr"]["x"] = result["ur"]["x"] - + def getrects(self): + result = [] + for y in range(len(self.grid)): + for x in range(len(self.grid[y])): + if self.grid[y][x]>0: + result.append(self.game.pygame.Rect([x*self.tilew,y*self.tileh,self.tilew,self.tileh])) return result - def move(self,hor,ver): - if hor>0: - colpoints = ["ur","dr"] - elif hor<0: - colpoints = ["ul","dl"] + def move(self,movex,movey): hstoped = False + hor = int(movex+self.hrest) + self.hrest = movex+self.hrest-hor while abs(hor)>0: - if abs(hor)>self.tilew: - diffx = self.tilew*abs(hor)/hor + if hor>=self.tilew: + diffx = self.tilew + elif hor<=-self.tilew: + diffx = -self.tilew else: diffx = hor - newpos = self.getgridpos(diffx,0) # Future position - canmove = True - upy = newpos[colpoints[0]]["y"] - downy = newpos[colpoints[1]]["y"] - for posy in range(upy,downy+1): # Je vérifie qu'elle n'est pas en colision - x = newpos[colpoints[0]]["x"] - if posy>=0 and posy < len(self.grid): - if x>=0 and x < len(self.grid[posy]): - if self.grid[posy][x]==1: - canmove = False - break - if canmove: + 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 - else: - hstoped = True - hor = 0 - if ver>0: - colpoints = ["dl","dr"] - elif ver<0: - colpoints = ["ul","ur"] 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 - newpos = self.getgridpos(0,diffy) # Future position - canmove = True - leftx = newpos[colpoints[0]]["x"] - rightx = newpos[colpoints[1]]["x"] - for posx in range(leftx,rightx+1): # Je vérifie qu'elle n'est pas en colision - y = newpos[colpoints[0]]["y"] - if y>=0 and y<len(self.grid): - if posx>=0 and posx<len(self.grid[y]): - if self.grid[y][posx]==1: - canmove = False - break - if canmove: + 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 - else: - vstoped = True - ver = 0 + + 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 diff --git a/gamedata/objects/gameloop.py b/gamedata/objects/gameloop.py index a4b5b48..b7d1bf5 100644 --- a/gamedata/objects/gameloop.py +++ b/gamedata/objects/gameloop.py @@ -19,7 +19,6 @@ class GameLoop(): # Retournes tout les objets portants ce nom result = [] for i in self.objects.values(): - print(type(i).__name__) if type(i).__name__==name: # Si le nom de la classe correspond au nom donné, je retourne la classe result.append(i) return result