From f5eaa22a1c9598c9f7a55a41614d1ce4769dee4a Mon Sep 17 00:00:00 2001 From: Indrajith K L Date: Tue, 1 Mar 2022 02:48:49 +0530 Subject: * Adds Ambience SFX & Management * Notification - In-Progress * Collision Callbacks * Interactive & Pickable entities - In-Progress --- core/map.lua | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 core/map.lua (limited to 'core/map.lua') diff --git a/core/map.lua b/core/map.lua new file mode 100644 index 0000000..acbdc4a --- /dev/null +++ b/core/map.lua @@ -0,0 +1,164 @@ +Class = require("libs.hump.class") +Gamestate = require("libs.hump.gamestate") +STI = require("libs.sti") +Moonshine = require("libs.moonshine") +Camera = require("libs.hump.camera") +Windfield = require("libs.windfield") +require("libs.tserial") +print(TSerial) +require("core.notifications") + +local zoomFactor = 2 +local player = { + x=0, + y=0, + sprite=love.graphics.newImage("assets/images/player_demo.png"), + speed=100 +} + +local windowWidth, windowHeight = love.graphics.getDimensions() +local _w = windowWidth/zoomFactor +local _h = windowHeight/zoomFactor + +Map = Class { + __include=Gamestate, + init = function(self, mapName) + _gameWorld = Windfield.newWorld(0,0) + _gameWorld:addCollisionClass('player') + _gameWorld:addCollisionClass('interactive') + effect = Moonshine(windowWidth, windowHeight, Moonshine.effects.crt) + .chain(Moonshine.effects.vignette) + .chain(Moonshine.effects.scanlines) + .chain(Moonshine.effects.chromasep) + effect.scanlines.thickness = .2 + effect.scanlines.opacity = .5 + effect.chromasep.angle = 1 + effect.chromasep.radius = 2 + + notifications = Notifications(zoomFactor) + camera = Camera() + camera:zoom(zoomFactor) + currentMap = STI("assets/maps/"..mapName..".lua") + if currentMap.layers["entities"] then + for i,obj in pairs(currentMap.layers["entities"].objects) do + if obj.name=="player" and obj.type=="player" then + player.x = obj.x + player.y = obj.y + player.collider = _gameWorld:newBSGRectangleCollider(player.x, player.y, 8, 8, 0) + + player.collider:setFixedRotation(true) + player.collider:setCollisionClass('player') + end + + if obj.type=="interactive" then + local collider = _gameWorld:newRectangleCollider(obj.x, obj.y, obj.width, obj.height) + local interactiveData = { + type = obj.type, + interactive_type = obj.properties.interactive_type, + data = obj.properties.data + } + collider:setObject(interactiveData) + collider:setCollisionClass('interactive') + collider:setType("static") + end + end + end + + if currentMap.layers["walls"] then + for i,obj in pairs(currentMap.layers["walls"].objects) do + local wall = _gameWorld:newRectangleCollider(obj.x, obj.y, obj.width, obj.height) + wall:setType("static") + end + end + end, + entities={} +} + +function Map:update(dt) + + local vx = 0 + local vy = 0 + + if love.keyboard.isDown("up") then + vy = player.speed * -1 + end + + if love.keyboard.isDown("down") then + vy = player.speed + end + + if love.keyboard.isDown("left") then + vx = player.speed * -1 + end + + if love.keyboard.isDown("right") then + vx = player.speed + end + + player.collider:setLinearVelocity(vx, vy) + + _gameWorld:update(dt) + player.x = player.collider:getX() - 4 + player.y = player.collider:getY() - 4 + + camera:lookAt(player.x, player.y) + currentMap:update(dt) + + if camera.x < _w/2 then + camera.x = _w/2 + end + + if camera.y < _h/2 then + camera.y = _h/2 + end + + local mapWidth = currentMap.width * currentMap.tilewidth + local mapHeight = currentMap.height * currentMap.tileheight + + if camera.x > (mapWidth - _w/2) then + camera.x = (mapWidth - _w/2) + end + + if camera.y > (mapHeight - _h/2) then + camera.y = (mapHeight - _h/2) + end + + if player.collider:enter('interactive') then + local _interColliderData = player.collider:getEnterCollisionData('interactive') + local interactiveCollider = _interColliderData.collider + local interactiveData = interactiveCollider:getObject() + + if interactiveData.interactive_type=="pickable" then + notifications:send(interactiveData.data) + end + + if interactiveData.interactive_type=="message_notification" then + notifications:send(interactiveData.data) + end + end + notifications:update(dt) +end + +function Map:draw() + effect(function() + camera:attach() + drawMapLayer("ground") + drawMapLayer("decorations") + love.graphics.draw(player.sprite, player.x, player.y) + drawMapLayer("foreground") + _gameWorld:draw() + camera:detach() + notifications:draw() + end) +end + +function Map:keypressed(key, scancode) +end + +function drawMapLayer(layerName) + if currentMap.layers[layerName].visible then + currentMap:drawLayer(currentMap.layers[layerName]) + end +end + +return Map \ No newline at end of file -- cgit v1.2.3