feat: initial terrain data loading
This commit is contained in:
parent
a88b30dd9f
commit
15973e491a
3 changed files with 154 additions and 0 deletions
62
sonic-radiance.love/datas/gamedata/maps/terrains.lua
Normal file
62
sonic-radiance.love/datas/gamedata/maps/terrains.lua
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
return {
|
||||||
|
["non-solid"] = {
|
||||||
|
{
|
||||||
|
terrainType = "normal",
|
||||||
|
forceAction = nil,
|
||||||
|
level=0,
|
||||||
|
height=0,
|
||||||
|
canJump = true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ice = {
|
||||||
|
{
|
||||||
|
terrainType = "forceAction",
|
||||||
|
forceAction = "slide",
|
||||||
|
level=0,
|
||||||
|
height=0,
|
||||||
|
canJump = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
water = {
|
||||||
|
{
|
||||||
|
terrainType = "forceAction",
|
||||||
|
forceAction = "fall",
|
||||||
|
level=-32,
|
||||||
|
height=0,
|
||||||
|
damage = 10,
|
||||||
|
speedFactor = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
terrainType = "normal",
|
||||||
|
forceAction = nil,
|
||||||
|
level=-10,
|
||||||
|
height=0,
|
||||||
|
mustHaveAction = "swim",
|
||||||
|
mustDoAction = nil,
|
||||||
|
speedFactor = 0.8,
|
||||||
|
canJump = true,
|
||||||
|
damage = 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
terrainType = "normal",
|
||||||
|
forceAction = nil,
|
||||||
|
level=0,
|
||||||
|
height=0,
|
||||||
|
mustHaveAction = "run",
|
||||||
|
mustDoAction = "run",
|
||||||
|
speedFactor = 1,
|
||||||
|
canJump = true,
|
||||||
|
damage = 0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
grass = {
|
||||||
|
{
|
||||||
|
terrainType = "normal",
|
||||||
|
forceAction = nil,
|
||||||
|
level=0,
|
||||||
|
height=16,
|
||||||
|
speedFactor = 0.75,
|
||||||
|
canJump = false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -39,6 +39,7 @@ end
|
||||||
|
|
||||||
function Player:updateStart(dt)
|
function Player:updateStart(dt)
|
||||||
self.tweens:update(dt)
|
self.tweens:update(dt)
|
||||||
|
self:updateTerrain()
|
||||||
|
|
||||||
self:actionMove()
|
self:actionMove()
|
||||||
self:actionJump()
|
self:actionJump()
|
||||||
|
|
|
@ -1,8 +1,28 @@
|
||||||
local PlayerInteractions = Object:extend()
|
local PlayerInteractions = Object:extend()
|
||||||
|
|
||||||
|
local terrainData = require "datas.gamedata.maps.terrains"
|
||||||
|
|
||||||
|
local MIN_X = 2
|
||||||
|
local MAX_X = 14
|
||||||
|
local MIN_Y = 9
|
||||||
|
local MAX_Y = 15
|
||||||
|
|
||||||
|
local TERRAIN_CHECKER = {
|
||||||
|
{x = MIN_X, y = MIN_Y},
|
||||||
|
{x = MIN_X, y = MAX_Y},
|
||||||
|
{x = MAX_X, y = MIN_Y},
|
||||||
|
{x = MAX_X, y = MAX_Y},
|
||||||
|
}
|
||||||
|
|
||||||
function PlayerInteractions:initInteractions()
|
function PlayerInteractions:initInteractions()
|
||||||
self.lastCollision = -1
|
self.lastCollision = -1
|
||||||
self.haveCollided = false
|
self.haveCollided = false
|
||||||
|
self.terrain = {}
|
||||||
|
self.terrain.name = ""
|
||||||
|
self.terrain.data = {}
|
||||||
|
self.lastPos = {}
|
||||||
|
self.lastPos.x = math.floor(self.x/16) * 16
|
||||||
|
self.lastPos.y = math.floor(self.y/16) * 16
|
||||||
end
|
end
|
||||||
|
|
||||||
function PlayerInteractions:updateInteraction()
|
function PlayerInteractions:updateInteraction()
|
||||||
|
@ -51,4 +71,75 @@ function PlayerInteractions:faceRightDirection(other)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function PlayerInteractions:updateTerrain()
|
||||||
|
local newTerrain = self:getCurrentTerrain()
|
||||||
|
|
||||||
|
if (self.terrain.name ~= newTerrain) then
|
||||||
|
print(newTerrain)
|
||||||
|
self.terrain.name = newTerrain
|
||||||
|
self:updateTerrainData()
|
||||||
|
end
|
||||||
|
if (newTerrain == "non-solid") then
|
||||||
|
self:updateLastPosition()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function PlayerInteractions:updateLastPosition()
|
||||||
|
local canUpdate = true
|
||||||
|
for _, coord in ipairs(TERRAIN_CHECKER) do
|
||||||
|
local newTerrain = self.world:getTileTypeAtPoint(self.x + coord.x, self.y + coord.y)
|
||||||
|
if (newTerrain ~= "non-solid") then
|
||||||
|
self.canUpdate = false
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (canUpdate) then
|
||||||
|
self.lastPos = {}
|
||||||
|
self.lastPos.x = math.floor(self.x/16) * 16
|
||||||
|
self.lastPos.y = math.floor(self.y/16) * 16
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function PlayerInteractions:updateTerrainData()
|
||||||
|
local dataPack = terrainData[self.terrain.name]
|
||||||
|
local newData = terrainData["non-solid"][1]
|
||||||
|
|
||||||
|
if (dataPack == nil) then
|
||||||
|
dataPack = terrainData["non-solid"]
|
||||||
|
end
|
||||||
|
|
||||||
|
for id, data in ipairs(dataPack) do
|
||||||
|
local useThisData = true
|
||||||
|
if (data.mustHaveAction ~= nil and not self:canDoAction(data.mustHaveAction)) then
|
||||||
|
useThisData = false
|
||||||
|
end
|
||||||
|
if (data.mustDoAction ~= nil and data.mustDoAction ~= self.currentAction) then
|
||||||
|
useThisData = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if (useThisData) then
|
||||||
|
newData = data
|
||||||
|
print(id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self:setTerrainData(newData)
|
||||||
|
end
|
||||||
|
|
||||||
|
function PlayerInteractions:setTerrainData(data)
|
||||||
|
--TODO
|
||||||
|
end
|
||||||
|
|
||||||
|
function PlayerInteractions:getCurrentTerrain()
|
||||||
|
local terrain = self.terrain.name
|
||||||
|
for _, coord in ipairs(TERRAIN_CHECKER) do
|
||||||
|
local newTerrain = self.world:getTileTypeAtPoint(self.x + coord.x, self.y + coord.y)
|
||||||
|
terrain = newTerrain
|
||||||
|
if (newTerrain == "non-solid") then
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return terrain
|
||||||
|
end
|
||||||
|
|
||||||
return PlayerInteractions
|
return PlayerInteractions
|
||||||
|
|
Loading…
Reference in a new issue