Difference between revisions of "Tutorial:Callback Functions (Svenska)"

m (språkfix)
m (Update for new syntax)
 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[:Category:Callbacks|Callbackfunktionerna]] i LÖVE används för systematiskt dela upp ett LÖVE-spel i logiska beståndsdelar. Varje callback är valfri, dvs. du måste inte ha med alla i varje spel. Sannolikt behöver du dock ha med de allra flesta i ett lite större spel, så det är bra om du känner till dem alla.
+
[[:Category:Callbacks|Callback-funktionerna]] i LÖVE används för systematiskt dela upp ett LÖVE-spel i logiska beståndsdelar. Varje callback är valfri, dvs. du måste inte ha med alla i varje spel. Sannolikt behöver du dock ha med de allra flesta i ett lite större spel, så det är bra om du känner till dem alla (Och som tur väl är, så är dem inte så värst många; Bara tolv (12) stycken att hålla reda på, varav de nio (9) viktigaste beskrivs här).
  
 +
Callback-funktioner fungerar på så vis att när LÖVE är på väg att göra någonting, som tillexempel rita på skärmen, så tittar den efter för att se om du har begärt att den skall göra något speciellt just då. Har du sagt till att du vill ha någonting ritat på skärmen, så anropar LÖVE din funktion som berättar vad som skall ritas på skärmen.
  
==[[love.load]]==
+
Här nedan följer en lista utav vanliga callbacks och korta beskrivningar utav dem.
 +
 
 +
==[[love.load_(Svenska)|love.load]]==
 
<source lang="lua">
 
<source lang="lua">
 
function love.load()
 
function love.load()
   image = love.graphics.newImage("cake.jpg")
+
   image = love.graphics.newImage("caka.png")
 
   local f = love.graphics.newFont(12)
 
   local f = love.graphics.newFont(12)
 
   love.graphics.setFont(f)
 
   love.graphics.setFont(f)
Line 12: Line 15:
 
end
 
end
 
</source>
 
</source>
<code>love.load</code>-funktionen anropas en enda gång, när spelet startar. Det är i denna funktion det är tänkt att du ska läsa in alla resurser spelet behöver använda sig av, som ljud och bilder. Det är möjligt att ladda in resurser även på andra platser i ditt spel, men om du väljer att göra det här vet du att de endast läses in precis en gång och därmed sparar du på datorns resurser.
+
<code>love.load</code>-funktionen anropas en enda gång, när spelet startar. Det är i denna funktion det är tänkt att du ska läsa in alla resurser spelet behöver använda sig av, som ljud och bilder. Det är möjligt att ladda in resurser även på andra platser i ditt spel, men om du väljer att göra det här vet du att de endast läses in precis en gång (du sparar därmed på datorns resurser om du bara läser in en kopia av varje resurs till minnet). Annars så är det nog bäst, om du känner att du har tillräckliga kunskaper, att bara ladda in resurser precis innan dem behövs; Tillexempel när spelet byter bana.
  
  
Line 23: Line 26:
 
end
 
end
 
</source>
 
</source>
Den här funktionen anropas kontinuerligt, dvs. hela tiden när ditt spel är igång. Tanken är att du i den ska skriva ned den mesta av spellogiken eller matematiken som ditt spel består av. 'dt' är en förkortning av "[[love.timer.getDelta|deltatid]]" och anger antalet sekunder sedan <code>love.update</code> anropades förra gången. Normalt sett är dt ett litet värd i stil med 0.025714.  
+
Den här funktionen anropas kontinuerligt, dvs. hela tiden när ditt spel är igång. Tanken är att du i den ska skriva ned den mesta av spellogiken eller matematiken som ditt spel består av. 'dt' är en förkortning av "[[love.timer.getDelta|deltatid]]" och anger antalet sekunder sedan <code>love.update</code> anropades förra gången. Normalt sett är dt ett litet värde i stil med 0.025714.
 +
 
 +
Tänk på att inte lägga in allt för tunga beräkningar i varje uppdaterings-cykel, utan sprid hellre ut beräkningar över ett större antal uppdateringar. Säg att du har en [[NPC_(Svenska)|Spelkaraktär]] som beräknar vilken väg den skall vandra via en avancerad (och/eller tung, komputionellt sett) algorithm var tionde sekund.
 +
 
 +
Att göra denna tunga beräkning var tionde sekund skulle kunna få det att verka som att spelet pausar till en kort stund (eller i ungdoms-slang, “Spelet laggar”), då får man dela upp beräkningarna i mindre bitar. Säg att det är 12 uppdateringar per sekund, och så har vi tio sekunder emellan; Det betyder att vi får dela upp beräkningarna i 120 mindre delar.
  
  
Line 33: Line 40:
 
end
 
end
 
</source>
 
</source>
I <code>[[love.draw]]</code> sker all rendering (utritning till skärmen). Anrop till <code>[[love.graphics.draw]]</code> utanför denna funktion är möjlig, men det ger ingen som helst effekt. Så håll ritkommandona här. Även denna funktion anropas kontinuerlig, så var medveten om att inställningar, som t.ex. nuvarande färg/typsnitt, inte nollställs mellan anrop. De blir istället "kvar" mellan anrop. Till exempel:  
+
I <code>[[love.draw]]</code> sker all rendering (utritning till skärmen). Anrop till <code>[[love.graphics.draw]]</code> utanför denna funktion är möjlig, men det ger ingen som helst effekt. Så håll ritkommandona här, eller i funktioner som anropas ifrån <code>love.draw</code>. Även denna funktion anropas kontinuerligt, så var medveten om att inställningar som nuvarande färg eller typsnitt inte nollställs mellan anrop. De blir istället "kvar" mellan anrop. Till exempel:  
 
<source lang="lua">
 
<source lang="lua">
 
function love.load()
 
function love.load()
Line 45: Line 52:
 
end
 
end
 
</source>
 
</source>
 
  
 
==[[love.mousepressed]]==
 
==[[love.mousepressed]]==
 +
{{newin|[[0.10.0]]|100|type=variant}}
 
<source lang="lua">
 
<source lang="lua">
function love.mousepressed(x, y, button)
+
function love.mousepressed(x, y, button, istouch)
   if button == 'l' then
+
   if button == 1 then
 
       imgx = x -- flytta bilden till muspositionen
 
       imgx = x -- flytta bilden till muspositionen
 
       imgy = y
 
       imgy = y
Line 60: Line 67:
  
 
==[[love.mousereleased]]==
 
==[[love.mousereleased]]==
 +
{{newin|[[0.10.0]]|100|type=variant}}
 
<source lang="lua">
 
<source lang="lua">
function love.mousereleased(x, y, button)
+
function love.mousereleased(x, y, button, istouch)
   if button == 'l' then
+
   if button == 1 then
 
       fireSlingshot(x,y) -- anrop till en annan funktion när musknappen släpps upp
 
       fireSlingshot(x,y) -- anrop till en annan funktion när musknappen släpps upp
 
   end
 
   end
Line 93: Line 101:
 
end
 
end
 
</source>
 
</source>
// TODO: översätt till svenska!
+
När en tangent släpps upp anropas den här funktionen. Argumenten ''key'' och ''unicode'' står beskrivna ovan, i <code>love.keypressed</code>. De två funktionerna är helt självständiga och du kan välja att implementera ingen, en eller bägge i ditt spel.
This function is called whenever a keyboard key is released and receives the key that was released. You can have this function together with <code>[[love.keypressed]]</code> or separate, they aren't connected in any way.  
 
 
 
  
 
==[[love.focus]]==
 
==[[love.focus]]==
Line 101: Line 107:
 
function love.focus(f)
 
function love.focus(f)
 
   if not f then
 
   if not f then
     print("LOST FOCUS")
+
     print("Tappade mitt fokus! :-C")
 
   else
 
   else
     print("GAINED FOCUS")
+
     print("Åhh! Skönt, fick tillbaka fokus igen! :-D")
 
   end
 
   end
 
end
 
end
 
</source>
 
</source>
// TODO: översätt till svenska!
+
När användaren klickar utanför LOVE-fönstret, förlorar spelet fokus. Då anropas <code>love.focus</code> med argumentet f satt till “false”. Om användaren klickar igen i fönstret, så att fönstret hamnar i fokus, så kommer f att vara satt till “true” istället. <!--Men bara det första klicket ger en sådan effekt, eftersom fönstret redan fått fokus.-->
This function is called whenever the user clicks off and on the LOVE window. For instance, if he is playing a windowed game and a user clicks on his internet browser, the game could be notified and automatically pause the game.
+
 
 +
Med hjälp av <code>love.focus</code> kan du t.ex. pausa spelat automatiskt om användaren byter till ett annat program, så att inte spelet fortsätter “i bakgrunden”.
 +
Detta är nog mest användbart, och antagligen förväntat att det skall ske av spelaren, om ditt spel är realtids-spel (saker och ting händer hela tiden i konstant tid, oberoende av vad spelaren gör). För pusselspel, och liknande, är det nog bara ett irritations-moment om spelet ‘pausar’ då det absolut inte spelar någon roll om det gör så eller Ej
 +
(Sådana spel drar troligtvis Ej heller så värst mycket resurser i från datorn).
 +
En bra idé för sådana pusselspel kan vara att sänka ljudet till 75% när det Ej är i fokus.
 +
 
 +
För nätverks-spel, så skall man generellt Ej ‘pausa’ dem, men det kan helt bero på genre och så vidare. En idé kan vara att spelaren hoppar över den nuvarande rundan eller liknande om han eller hon “växlar ur”.
  
  
Line 114: Line 126:
 
<source lang="lua">
 
<source lang="lua">
 
function love.quit()
 
function love.quit()
   print("Thanks for playing! Come back soon!")
+
   print("Tack för spelstunden! Välkommen åter!")
 
end
 
end
 
</source>
 
</source>
// TODO: översätt till svenska!
+
När användaren klickar på krysset (eller annan stäng-symbol) i LÖVE-fönstret anropas först denna funktion, innan programmet avslutas helt. På så sätt kan du spara det nuvarande tillståndet i spelet, säga “hejdå” till eventuella servrar som spelet är anslutet till, och släppa ‘taget’ om resurser som behöver det (Sådana som du har låst till att bara ditt spel skall få använda för tillfället).
This function is called whenever the user clicks the windows close button (often an X). For instance, if the user decides he is done playing, he could click the close button. Then, before it closes, the game can save its state.
+
 
 +
Det var alla callback-funktioner och några grundläggande användningsområden för dem.
  
Those are the callback functions and their basic usage.
+
Lycka till med skapandet av fantastiska och magnifika spel!
  
[[Category:Tutorials]]
+
[[Category:Tutorials (Svenska)]]
  
 
{{#set:LOVE Version=0.6.0}}
 
{{#set:LOVE Version=0.6.0}}
{{#set:Description=Callback Functions}}
+
{{#set:Description=Callback-Funktioner}}
  
== Other languages ==
+
== Andra språk ==
 
{{i18n|Tutorial:Callback Functions}}
 
{{i18n|Tutorial:Callback Functions}}

Latest revision as of 21:27, 6 June 2016

Callback-funktionerna i LÖVE används för systematiskt dela upp ett LÖVE-spel i logiska beståndsdelar. Varje callback är valfri, dvs. du måste inte ha med alla i varje spel. Sannolikt behöver du dock ha med de allra flesta i ett lite större spel, så det är bra om du känner till dem alla (Och som tur väl är, så är dem inte så värst många; Bara tolv (12) stycken att hålla reda på, varav de nio (9) viktigaste beskrivs här).

Callback-funktioner fungerar på så vis att när LÖVE är på väg att göra någonting, som tillexempel rita på skärmen, så tittar den efter för att se om du har begärt att den skall göra något speciellt just då. Har du sagt till att du vill ha någonting ritat på skärmen, så anropar LÖVE din funktion som berättar vad som skall ritas på skärmen.

Här nedan följer en lista utav vanliga callbacks och korta beskrivningar utav dem.

love.load

function love.load()
   image = love.graphics.newImage("caka.png")
   local f = love.graphics.newFont(12)
   love.graphics.setFont(f)
   love.graphics.setColor(0,0,0,255)
   love.graphics.setBackgroundColor(255,255,255)
end

love.load-funktionen anropas en enda gång, när spelet startar. Det är i denna funktion det är tänkt att du ska läsa in alla resurser spelet behöver använda sig av, som ljud och bilder. Det är möjligt att ladda in resurser även på andra platser i ditt spel, men om du väljer att göra det här vet du att de endast läses in precis en gång (du sparar därmed på datorns resurser om du bara läser in en kopia av varje resurs till minnet). Annars så är det nog bäst, om du känner att du har tillräckliga kunskaper, att bara ladda in resurser precis innan dem behövs; Tillexempel när spelet byter bana.


love.update

function love.update(dt)
   if love.keyboard.isDown("up") then
      num = num + 100 * dt -- detta betyder att num ökas med 100 varje sekund
   end
end

Den här funktionen anropas kontinuerligt, dvs. hela tiden när ditt spel är igång. Tanken är att du i den ska skriva ned den mesta av spellogiken eller matematiken som ditt spel består av. 'dt' är en förkortning av "deltatid" och anger antalet sekunder sedan love.update anropades förra gången. Normalt sett är dt ett litet värde i stil med 0.025714.

Tänk på att inte lägga in allt för tunga beräkningar i varje uppdaterings-cykel, utan sprid hellre ut beräkningar över ett större antal uppdateringar. Säg att du har en Spelkaraktär som beräknar vilken väg den skall vandra via en avancerad (och/eller tung, komputionellt sett) algorithm var tionde sekund.

Att göra denna tunga beräkning var tionde sekund skulle kunna få det att verka som att spelet pausar till en kort stund (eller i ungdoms-slang, “Spelet laggar”), då får man dela upp beräkningarna i mindre bitar. Säg att det är 12 uppdateringar per sekund, och så har vi tio sekunder emellan; Det betyder att vi får dela upp beräkningarna i 120 mindre delar.


love.draw

function love.draw()
   love.graphics.draw(image, imgx, imgy)
   love.graphics.print("Dra och släpp tårtan med musen eller använd piltangenterna", 10, 10)
end

I love.draw sker all rendering (utritning till skärmen). Anrop till love.graphics.draw utanför denna funktion är möjlig, men det ger ingen som helst effekt. Så håll ritkommandona här, eller i funktioner som anropas ifrån love.draw. Även denna funktion anropas kontinuerligt, så var medveten om att inställningar som nuvarande färg eller typsnitt inte nollställs mellan anrop. De blir istället "kvar" mellan anrop. Till exempel:

function love.load()
   love.graphics.setColor(0,0,0)
end

function love.draw()
   love.graphics.print("Den här texten är röd pga. raden nedan", 100, 100)
   love.graphics.setColor(255,0,0)
   love.graphics.print("Denna text är också röd", 100, 200)
end

love.mousepressed

Available since LÖVE 0.10.0
This variant is not supported in earlier versions.
function love.mousepressed(x, y, button, istouch)
   if button == 1 then
      imgx = x -- flytta bilden till muspositionen
      imgy = y
   end
end

Den här funktionen anropas när någon musknapp trycks ned. Både koordinater och musknapp går att läsa av genom variablerna x, y och button. Musknappen är en värdena som är definierade i muskonstanter. Den här funktionen passar bra tillsammans med love.mousereleased.


love.mousereleased

Available since LÖVE 0.10.0
This variant is not supported in earlier versions.
function love.mousereleased(x, y, button, istouch)
   if button == 1 then
      fireSlingshot(x,y) -- anrop till en annan funktion när musknappen släpps upp
   end
end

Anropas så fort en musknapp släpps upp. Även denna får x, y och button. Funkar bra i kombination med love.mousepressed, men är tekniskt sätt en helt separat funktion. Dvs. i ett spel kan du ha med ingen, den ena eller båda dessa funktioner.


love.keypressed

function love.keypressed(key, unicode)
   if key == 'b' then
      text = "Tangenten 'B' trycktes ned."
   elseif key == 'a' then
      a_down = true
   end
end

Den här funktionen anropas när en tangent trycks ned. Indata är dels tangentkonstanten key, som motsvarar en specifik knapp på tangentbordet, oavsett vilket språk användarens operativsystem är inställt på. unicode motsvarar istället den internationella, översatta textsträngen som användaren matat in via tangentbordet, t.ex. å, ä eller ö. Använd key i ett plattformsspel med enkla knappar för styrning (tänk Mario Bros), och unicode vid t.ex. textinmatning i ett textspel (tänk Zork, Leisure Suit Larry).


love.keyreleased

function love.keyreleased(key, unicode)
   if key == 'b' then
      text = "Tangenten 'B' släpptes upp."
   elseif key == 'a' then
      a_down = false
   end
end

När en tangent släpps upp anropas den här funktionen. Argumenten key och unicode står beskrivna ovan, i love.keypressed. De två funktionerna är helt självständiga och du kan välja att implementera ingen, en eller bägge i ditt spel.

love.focus

function love.focus(f)
  if not f then
    print("Tappade mitt fokus! :-C")
  else
    print("Åhh! Skönt, fick tillbaka fokus igen! :-D")
  end
end

När användaren klickar utanför LOVE-fönstret, förlorar spelet fokus. Då anropas love.focus med argumentet f satt till “false”. Om användaren klickar igen i fönstret, så att fönstret hamnar i fokus, så kommer f att vara satt till “true” istället.

Med hjälp av love.focus kan du t.ex. pausa spelat automatiskt om användaren byter till ett annat program, så att inte spelet fortsätter “i bakgrunden”. Detta är nog mest användbart, och antagligen förväntat att det skall ske av spelaren, om ditt spel är realtids-spel (saker och ting händer hela tiden i konstant tid, oberoende av vad spelaren gör). För pusselspel, och liknande, är det nog bara ett irritations-moment om spelet ‘pausar’ då det absolut inte spelar någon roll om det gör så eller Ej (Sådana spel drar troligtvis Ej heller så värst mycket resurser i från datorn). En bra idé för sådana pusselspel kan vara att sänka ljudet till 75% när det Ej är i fokus.

För nätverks-spel, så skall man generellt Ej ‘pausa’ dem, men det kan helt bero på genre och så vidare. En idé kan vara att spelaren hoppar över den nuvarande rundan eller liknande om han eller hon “växlar ur”.


love.quit

function love.quit()
  print("Tack för spelstunden! Välkommen åter!")
end

När användaren klickar på krysset (eller annan stäng-symbol) i LÖVE-fönstret anropas först denna funktion, innan programmet avslutas helt. På så sätt kan du spara det nuvarande tillståndet i spelet, säga “hejdå” till eventuella servrar som spelet är anslutet till, och släppa ‘taget’ om resurser som behöver det (Sådana som du har låst till att bara ditt spel skall få använda för tillfället).

Det var alla callback-funktioner och några grundläggande användningsområden för dem.

Lycka till med skapandet av fantastiska och magnifika spel!



Andra språk