Ir para conteúdo
Entre para seguir isso  
Lwkass

Inicio no Löve ;b

Recommended Posts

Lwkass    1
Lwkass

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 :D

 

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 = 0

function table.exist(table, n)
for i = 1, #table do
if (table[i] == n) then
return i
end
end
return false
end

------

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)
end

function 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

-- logics

animationTime = 0

function love.keyreleased(key, unicode)
if (player:getAction() == 'walking') then
player:setAction('stopped')
end
end

function 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
end
end

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

Editado por Lwkass

Compartilhar este post


Link para o post
Compartilhar em outros sites
Socket    0
Socket

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
gpedro    47
gpedro

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Lwkass    1
Lwkass

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×