Lwkass 1 #1 Posted July 30, 2011 (edited) Então, depois que o Socket postou sobre o Löve e como eu já estava interessado em criar algum jogo e também como raramente me vem alguma ideia de script decente na cabeça, decidi criar algo usando o Löve pra saber como ele funciona, eu já estava fazendo um jogo em Java, mas é um pouco (muito) desanimador fazer tudo sozinho... Enfim, ai está os códigos lua que criei ontem pra passar o tempo (no final eu coloquei tudo pra download, como é usado um sprite sheet vai ser necessário baixar para rodar, o sprite sheet usado eu peguei em um site e só organizei do jeito que queria) e acho que vou continuar até ter uma aparência de jogo mesmo Por enquanto o que dá pra fazer é movimentar o personagem pra frente e pra trás apenas, mas conta com animação do player parado e andando (só andando pra frente), ou seja quando anda troca de animação, é bem simples, mas quis fazer para principalmente aprender a criar animação e talvez incentivar mais pessoas :] Para testar é necessário ter o Löve ! Caso você não tenha o Löve instalado, é só seguir o que tem nessa página (em inglês) http://love2d.org/wiki/Getting_Started explica tudo que precisar main.lua require("system/imageSheet.lua")require("system/animation.lua")require("system/player.lua")framesPassed, player = 0function table.exist(table, n) for i = 1, #table do if (table[i] == n) then return i end end return falseend------function love.load() player = Player:new() player:setGraphics({ stopped = ImageSheet:new("player.png", 25, 48, 3), walking = ImageSheet:new("player.png", 48, 49, 16,0,49) }) player:setAnimation("stopped", Animation:new(player:getGraphic("stopped"), 90)) player:setAnimation("walking", Animation:new(player:getGraphic("walking"), 20)) player:setPosition(30, 60) love.graphics.setFont(font)endfunction love.draw() --love.keyboard.setKeyRepeat(10, 200) player:getAnimation(player:getAction()):Draw(player:getPosition().x, player:getPosition().y) love.graphics.print("- Infos -", 20, 7) love.graphics.print("FPS: "..love.timer.getFPS(), 10, 20) love.graphics.print("Delta: "..love.timer.getDelta(), 10, 35) love.graphics.print("Frames Passed: "..framesPassed, 10, 50) love.graphics.print("Player Action: "..player:getAction(), 10, 70)end-- logicsanimationTime = 0function love.keyreleased(key, unicode) if (player:getAction() == 'walking') then player:setAction('stopped') endendfunction love.update(dt) fps = love.timer.getFPS() if (love.keyboard.isDown('right')) then player:setPosition(player:getPosition().x + 0.5) player:setAction('walking') elseif (love.keyboard.isDown('left')) then player:setPosition(player:getPosition().x - 0.5) player:setAction('walking') end player:getAnimation(player:getAction()):Update() if (framesPassed >= fps) then framesPassed = 0 else framesPassed = framesPassed + 1 endend system/imageSheet.lua ImageSheet = {} function ImageSheet:new(name, spriteWidth, spriteHeight, nSprites, initX, initY) sheet = {} img = love.graphics.newImage(string.format("data/images/%s", name)) initX = initX or 0; initY = initY or 0 for y = 0, math.ceil(img:getHeight()/spriteHeight) - 1 do for x = 0, math.ceil(img:getWidth()/spriteWidth) - 1 do if (not nSprites or #sheet < nSprites) then sheet[x+1] = love.graphics.newQuad(initX+spriteWidth*x, initY+spriteHeight*y, spriteWidth, spriteHeight, img:getWidth(), img:getHeight()) end end end return setmetatable({ batch = love.graphics.newSpriteBatch(img, spriteWidth * spriteHeight), sheet = sheet, image = img }, {__index = self}) end function ImageSheet:getSheet(n) return (n and self.sheet[n] or self.sheet) end function ImageSheet:getBatch() return self.batch end function ImageSheet:getSheetLength() return #self.sheet end function ImageSheet:Draw(frame, x, y) self:getBatch():clear() self:getBatch():addq(self:getSheet(frame), x, y) love.graphics.draw(self:getBatch(), x, y) end system/animation.lua require("system/imageSheet.lua") Animation = {} function Animation:new(imagesheet, delay) return setmetatable({imgsheet = imagesheet, frame = 1, delay = delay, time = 0}, {__index = self}) end function Animation:nextFrame() self.frame = self.frame == self.imgsheet:getSheetLength() and 1 or self.frame + 1 end function Animation:Update() if (self.time >= self.delay) then self:nextFrame() self.time = 0 end self.time = self.time + 1 end function Animation:Draw(x, y) self.pos = {x=x,y=y} self.imgsheet:Draw(self.frame, self.pos.x, self.pos.y) end system/player.lua Player = {} function Player:new() return setmetatable({ position = { x = 0, y = 0 }, action = 'stopped', graphics = { } }, {__index = self}) end --- function Player:getPosition() return self.position end function Player:setPosition(x, y) self.position.x = x or self.position.x; self.position.y = y or self.position.y; end function Player:getAction() return self.action end function Player:setAction(action) self.action = action end --- function Player:setGraphics(graphics) for a, b in pairs(graphics) do self.graphics[a] = {imgxt = b} end end function Player:getGraphic(graphic) return self.graphics[graphic].imgxt end function Player:getAnimation(action) return self.graphics[action].animation end function Player:setAnimation(action, animation) self.graphics[action].animation = animation end O Sprite Sheet (pra quem não sabe significa "folha de sprites", seria um conjunto de sprites em um só arquivo) que eu usei foi pego nesse link: http://www.spriters-resource.com/ds/cstlevniadawnofsorrow/sheet/19037 E eu adicionei só o necessário reorganizei do meu jeito e ficou dessa maneira: http://img850.imageshack.us/img850/3083/playerb.png ----- Caso tenha se interessado: Aqui explica como instalar e executar scripts feitos para o Löve: http://love2d.org/wiki/Getting_Started Tutoriais: http://love2d.org/wiki/Category:Tutorials ----- Eu vi lá que tem como mandar como executável mas mudei a extensão e mesmo assim não consegui fazer aqui :s então está como .rar mesmo Edited July 30, 2011 by Lwkass Share this post Link to post Share on other sites
Socket 0 #2 Posted August 1, 2011 Realmente ficou ótimo. Lwkass, para criar o arquivo .love, basta que você compacte os arquivos em ZIP, os arquivos, não a pasta em que os arquivos estão, e mudar a extensão para .love, vou disponibilizar em anexo para quem queira testar. Os arquivos em .love não são executáveis, porém Love já interpreta ele automaticamente, caso você tenha Love instalado. Mas tem sim uma maneira de criar um executável, para que não seja preciso instalar Love, mais informações na wiki. Atenciosamente, Socket. Share this post Link to post Share on other sites
gpedro 47 #3 Posted August 1, 2011 tava atoa aqui e resolvi testar, curti pra caralho, principalmente o moon walk. porem ele chega no final da tela e continua infinitamente. Como é só um exemplo, tá loko bagarai. Share this post Link to post Share on other sites
Lwkass 1 #4 Posted August 1, 2011 @Socket Ahh sim sim, valeu pela explicação, é que eu só percebi agora que estava compactando como .rar e n tava dando certo, agora tentei com .zip e funcionou x.x @gpedro É esse exemplo ta super inicial auahuahuahuahuahu ---- vou ver se posto atualizações, coloquei algumas coisas a mais mas ainda precisa de alguns ajustes, acho q hoje ainda eu posto aqui ;b Share this post Link to post Share on other sites