Skip to content

Instantly share code, notes, and snippets.

@JesterXL
Created November 7, 2011 19:34
Show Gist options
  • Save JesterXL/1345908 to your computer and use it in GitHub Desktop.
Save JesterXL/1345908 to your computer and use it in GitHub Desktop.
Corona Lua RPG Experience Bar via Pathfinder rules
ExperienceBar = {}
function ExperienceBar:new(x, y, targetWidth, targetHeight)
local group = display.newGroup()
group.x = x
group.y = y
local grayBar = display.newRect(0, 0, targetWidth, targetHeight)
group:insert(grayBar)
grayBar:setFillColor(102, 102, 102, 200)
grayBar:setStrokeColor(51, 51, 51)
grayBar.strokeWidth = 2
local greenBar = display.newRect(0, 0, targetWidth - 2, targetHeight - 2)
greenBar:setReferencePoint(display.TopLeftReferencePoint)
group:insert(greenBar)
greenBar:setFillColor(0, 153, 0)
greenBar.x = 1
greenBar.y = 1
function group:setValue(current, max)
local percent = current / max
if percent > 1 then
error("You cannot have a percent over 100%")
end
local desiredWidth = (targetWidth - 2) * percent
if percent ~= 0 then
greenBar.xScale = percent
greenBar.isVisible = true
else
greenBar.isVisible = false
end
greenBar.x = grayBar.x + greenBar.xReference
end
return group
end
return ExperienceBar
LevelModel = {}
function LevelModel:new(startingXP)
if startingXP == nil then
startingXP = 0
end
local model = display.newGroup()
model.xp = startingXP
model.level = 1
model.LEVEL_TABLE = {
2000,
5000,
9000,
15000,
23000,
35000,
51000,
75000,
105000,
155000,
220000,
315000,
445000,
635000,
890000,
1300000,
1800000,
2550000,
3600000
}
function model:setLevel(value)
if self.level ~= value then
self.level = value
self:dispatchEvent({name="levelChanged", target=self})
end
end
function model:setXP(value)
if self.xp ~= value then
self.xp = value
self:updateLevel()
self:dispatchEvent({name="xpChanged", target=self})
end
end
function model:getCurrentLevelXP()
return self.LEVEL_TABLE[self.level]
end
function model:updateLevel()
assert(self.xp ~= nil, "You cannot have nil xp.")
local i = 1
while self.LEVEL_TABLE[i] do
local value = self.LEVEL_TABLE[i]
if self.xp < value then
self:setLevel(i)
return true
end
i = i + 1
end
end
function model:addXP(value)
local newValue = self.xp + value
self:setXP(newValue)
end
model:updateLevel()
return model
end
return LevelModel
require "ExperienceBar"
require "LevelModel"
bar = ExperienceBar:new(40, 100, 200, 20)
myText = display.newRetinaText("", 0, 0, native.systemFont, 16)
myText:setReferencePoint(display.TopLeftReferencePoint)
myText:setTextColor(255)
myText.x = 100
myText.y = 50
function onXPChanged(event)
local max = levelModel:getCurrentLevelXP()
local xp = levelModel.xp
bar:setValue(xp, max)
myText.text = "Level: " .. levelModel.level .. ", XP: " .. xp .. " / " .. max
myText.x = bar.x + myText.width / 2
end
levelModel = LevelModel:new(0)
levelModel:addEventListener("xpChanged", onXPChanged)
increment = 100
function onIncreaseXP()
levelModel:addXP(increment)
increment = math.floor(increment * 1.01)
end
timer.performWithDelay(100, onIncreaseXP, 0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment