Exemplo n.º 1
0
    def __init__(self, objectId, local):
        self.objectId = objectId
        self.tileSize = None
        self.sprite = None
        self.name = None
        self.velocity = None
        self.local = local

        if self.local:
            self.motionController = LocalController(self)
        else:
            self.motionController = RemoteController(self)

        self.nextPositions = deque()
        self.updateMutex = sf.Mutex()
Exemplo n.º 2
0
class WorldObject(object):

    def __init__(self, objectId, local):
        self.objectId = objectId
        self.tileSize = None
        self.sprite = None
        self.name = None
        self.velocity = None
        self.local = local

        if self.local:
            self.motionController = LocalController(self)
        else:
            self.motionController = RemoteController(self)

        self.nextPositions = deque()
        self.updateMutex = sf.Mutex()

    def load(self, world, packet):
        self.name = packet.readString()
        tileset = packet.readString()
        self.tileSize = packet.readUint16()

        x, y, vx, vy, tx, ty = packet.read('!iiiiii')

        texture = world.texture_loader.load(tileset, color_mask=sf.Color.WHITE)
        self.sprite = sf.Sprite(texture)
        self.sprite.color = sf.Color.WHITE
        self.sprite.texture_rectangle = sf.Rectangle(sf.Vector2(tx * self.tileSize, ty * self.tileSize), sf.Vector2(self.tileSize, self.tileSize))
        self.sprite.position = sf.Vector2(x * self.tileSize, y * self.tileSize)

        self.velocity = sf.Vector2(vx, vy)

        print ('World object (id: %d, name: %s) loaded in the world.' % (self.objectId, self.name))

    def updatePosition(self, position):
        self.sprite.position = self.toLocalPosition(position)

    def update(self, diff):
        self.updateMutex.lock()
        nextState = self.motionController.apply()
        if nextState is not None:
            nextState.simulate(self.world_position, self.velocity)
            self.updatePosition(nextState.position)
            self.motionController.applied(nextState)
            print ('Updated position with: {}'.format(nextState))
        self.updateMutex.unlock()

    @property
    def world_position(self):
        pos = self.sprite.position
        return sf.Vector2(pos.x / self.tileSize, pos.y / self.tileSize)

    def toLocalPosition(self, pos):
        return sf.Vector2(pos.x * self.tileSize, pos.y * self.tileSize)

    def enqueuePositionUpdate(self, pos):
        self.motionController.enqueuePosition(pos)

    def moveObject(self, packet):
        self.updateMutex.lock()
        self.motionController.validate(packet)
        self.updateMutex.unlock()

    def doMovePrediction(self, predictionId, direction):
        assert (self.local)
        self.updateMutex.lock()
        self.motionController.predict(predictionId, direction)
        self.updateMutex.unlock()

    def draw(self, window):
        if self.sprite:
            window.draw(self.sprite)