Overflown/gamedata/objects/ingame/movable.py

101 lines
3.2 KiB
Python

from gamedata.objects.base import BaseObject
class Movable(BaseObject):
def __init__(self,game,x,y):
self.sprite = game.sprite_lib["icon.png"]
self.tileset = game.gameloop.findname("TilesetRenderer")[0]
self.water = game.gameloop.findname("Water")[0]
super().__init__(x,y,game,self.sprite.get_width(),self.sprite.get_height())
self.collisionrects = self.tileset.rects
self.semirects = self.tileset.semirects
self.tilew = self.tileset.solidtilew
self.tileh = self.tileset.solidtileh
self.horspd = 0
self.verspd = 0
self.hrest = 0
self.vrest = 0
self.collisions = True
def step(self):
self.move(self.horspd,self.verspd,collisions=self.collisions)
def move(self,movex,movey,collisions = True):
hstoped = False
hor = int(movex+self.hrest)
self.hrest = movex+self.hrest-hor
if collisions:
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
if collisions:
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
else:
self.rect[0]+=hor
self.rect[1]+=ver
def checkcollisions(self,offx,offy,classic=True,semi=True):
temprect = self.rect.copy()
temprect[0]+=offx
temprect[1]+=offy
result = False
if classic:
for rect in self.collisionrects:
if rect!=self.rect and temprect.colliderect(rect):
result = rect
break
if not result and semi:
for rect in self.semirects:
if rect!=self.rect and self.rect.bottom<=rect.top:
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"]])