├── LICENSE ├── README.md └── images ├── colored-text.jpg ├── ellipses.jpg ├── framecounter.jpg ├── gradient.jpg ├── hello-world.jpg ├── line.jpg ├── logo.png ├── moving-line.jpg ├── moving-logo.jpg ├── moving.jpg ├── rectangle.jpg └── triangle.jpg /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # From Processing (and p5.js) to LÖVE 2 | 3 | Notes and examples for getting started coding in [LÖVE](https://love2d.org/) (aka Love2d) for folks with previous experience in Processing, p5.js and the like. 4 | 5 | This introduction assumes you have some previous experience in programming with Processing or p5.js and are curious about LÖVE and Lua. This is not a comprehensive tutorial for Lua or even LÖVE but simply an entry point. 6 | 7 | ### What is LÖVE? 8 | 9 | LÖVE is a free, open source framework to make games in the Lua language and works on Mac, Windows, Linux, iOS, Android. There is a [wiki](https://love2d.org/wiki/Main_Page) with documentation, including a reference and a number of [additional libraries](https://love2d.org/wiki/Category:Libraries) and tutorials. 10 | 11 | Just as p5.js is a library in Javascript and Processing is a framework in Java, LÖVE is a framework built on top of the popular programming language Lua. Lua is about 30 years old, developed originally in Brazil, and noted for its speed, portability across operating systems, ease-of-use, and an emphasis on scripting as an extension language. 12 | 13 | ### Why use LÖVE? 14 | 15 | Although LÖVE contains libraries for drawing to the screen similar to Processing, it is intended for the creation of games. It is particularly useful for making 2d games with tiles. 16 | 17 | You may also want to use LÖVE if you're interested in trying something new, learning a new language that is applicable to many other tools (Roblox, Playdate, Pico-8, Tic-80, and many more), and interested in a program that works fast and is cross-compatible on many computers. 18 | 19 | ### Who makes LÖVE? 20 | 21 | LÖVE was originally released in 2008. The developers are listed as Anjo, Bartbes, Rude, Slime, Vrld. The project is collaboratively managed on [GitHub](https://github.com/love2d/love) with additional contributions from dozens of other contributors. 22 | 23 | ### Download LÖVE 24 | 25 | LÖVE can be downloaded from its [website](https://love2d.org/). Choose the download for your specific operating system. 26 | 27 | ## Creating and running your LÖVE program 28 | 29 | In p5.js, your sketch is generally a file called sketch.js. In Processing, your program is a custom file name you choose and ends in .pde. 30 | 31 | In Processing, you may have coded in the Processing IDE. For p5.js you may have coded with the free online web editor. For LÖVE, there is no special program for creating LÖVE games. You can use any code editing program. If you have no previous experience, you could try installing [Atom](https://atom.io). Open up the preferences > install. Type in Language-lua and install the package that mentions that name. It will provide syntax highlighting to any file named and saved with a .lua extension. 32 | 33 | In your desktop, command line or inside your code editor create a new folder for your game or program. In that folder you should name your program ```main.lua```. Other assets like images, fonts, sounds can be stored in the folder as well. 34 | 35 | There are multiple ways to run a love program. **The easiest way to run your program is to drop the whole folder containing your main.lua file and any other assets onto the LÖVE application (also called an *executable* on Windows).** Some code editors will also be able to automatically run and launch love programs. For Linux and command line users, check out the [Getting Started](https://love2d.org/wiki/Getting_Started) for additional options of setting up and running LÖVE programs or a list of code editors that can run LÖVE directly. 36 | 37 | ### Hello World 38 | 39 | Let's create a basic hello world program to test we're up and running. 40 | 41 | Save this into your main.lua: 42 | 43 | ```lua 44 | function love.draw() 45 | love.graphics.print('Hello World!', 400, 300) 46 | end 47 | ``` 48 | 49 | Then drag and drop the *folder* holding this file (not the main.lua file itself) onto your LÖVE application to launch it. 50 | 51 | ![hello world window, white text on a black screen](images/hello-world.jpg) 52 | *Black screen with white text "hello world" roughly in the center* 53 | 54 | I'm on Linux running in the command line so to run this I can simply run ```love .``` inside that folder to launch it. (See the [getting started](https://love2d.org/wiki/Getting_Started) for more options) 55 | 56 | ### Default window size 57 | 58 | Let's get some graphics onto the screen 59 | 60 | In Processing, you may be aware there are hidden defaults. If you don't specify a ```size()``` then your sketch runs in a 100 by 100 pixel area. In p5.js, if you don't specify a size in ```createCanvas()``` then your sketch's canvas is also 100 by 100 pixels. 61 | 62 | Since we didn't specify a size in our hello world program above it assumed a default window size of 800 by 600 pixels. 63 | 64 | ### A More Processing-like first program 65 | 66 | Let's get some shapes onto the screen. 67 | 68 | In Processing and p5.js we might write a basic program like this: 69 | 70 | ```js 71 | //p5.js code 72 | function draw(){ 73 | rect(20,10,50,80); 74 | } 75 | ``` 76 | 77 | In p5.js no setup means that a default canvas size of 100 by 100 will be created. No fill specified means the background will be white and the rectangle will have a black outline with white fill by default. 78 | 79 | Let's write a similar program in LÖVE. You can erase the previous main.lua and try this 80 | 81 | ```lua 82 | function love.draw() 83 | love.graphics.rectangle("fill", 20, 10, 50, 80) 84 | end 85 | ``` 86 | 87 | Now save and run this program (drag the folder onto the LÖVE application or run in the command line). If you have no errors you should see a black window 600 pixels wide by 800 pixels high with a white rectangle in the upper left corner. These colors and screen size are the defaults for LÖVE. 88 | 89 | ![white rectangle in the top left corner of a black screen](images/rectangle.jpg) 90 | *A white rectangle in the top left corner of a black screen* 91 | 92 | ### A bite of syntax 93 | 94 | To write a comment in LÖVE, we put ```--``` at the beginning of the line. 95 | 96 | ```lua 97 | -- This is a comment 98 | ``` 99 | 100 | We can do multi-line comments in Lua, particularly useful for turning on and off sections of our code when we're debugging. 101 | 102 | ```lua 103 | --[[ 104 | An example of a 105 | multi-line comment. 106 | --]] 107 | ``` 108 | 109 | *You'll notice that most commands in LÖVE start with ```love.```* This helps distinguish LÖVE-specific functions from general Lua commands and your own custom written functions. It is a different approach from Processing or p5.js (for example, you don't have to write ```p5.ellipse(100,50,200,50);``` in p5.js. 110 | 111 | In general, you'll notice LÖVE (and Lua, the language it's built on) does away with curly brackets and the like in favor of ending blocks of code with the word *end*. 112 | 113 | ### Working in color 114 | 115 | In Processing or p5.js you can write ```fill(number)``` to specify a grayscale value. In LÖVE you must specify all three R,G,B values. **Unlike Processing, in current version of LÖVE color values must vary from 0 to 1 instead of 0 to 255.** 116 | 117 | ```lua 118 | --to set a black fill 119 | love.graphics.setColor(0,0,0) 120 | ``` 121 | 122 | An example: 123 | 124 | ```lua 125 | function love.draw() 126 | --set to white 127 | love.graphics.setColor(1,1,1) 128 | love.graphics.print("This text is white but the below is red", 100, 100) 129 | 130 | --set to red 131 | love.graphics.setColor(1,0,0) 132 | love.graphics.print("This text is red", 100, 200) 133 | end 134 | ``` 135 | 136 | ![a black screen with red and white text](images/colored-text.jpg) 137 | 138 | To set a background color we use the clear command. This resets to a black transparent background, e.g. to the color (0,0,0,0). 139 | 140 | ```lua 141 | function love.draw() 142 | love.graphics.clear() 143 | end 144 | ``` 145 | 146 | If we want to specify a background color we can use R, G, B and optionally set an alpha (transparency). 147 | 148 | To set a background color of green: 149 | 150 | ```lua 151 | function love.draw() 152 | love.graphics.clear(0,1,0) 153 | end 154 | ``` 155 | 156 | ### other Shapes 157 | 158 | Ellipse: 159 | 160 | ```lua 161 | function love.draw() 162 | love.graphics.ellipse( mode, x, y, radiusx, radiusy, segments ) 163 | end 164 | ``` 165 | 166 | Unlike in Processing and p5.js you must specify the *mode*, either *fill* or *line*. In Processing and p5.js you specify the width and height. In LÖVE you specify the radius (half of each of these). The segments is optional, the number of segments used to draw the ellipse. 167 | 168 | Example ellipses: 169 | 170 | ```lua 171 | function love.draw() 172 | love.graphics.ellipse("line",100,200,50,100,5) 173 | 174 | love.graphics.ellipse("line",300,200,50,100,30) 175 | end 176 | ``` 177 | 178 | ![two ellipses on a black screen. The ellipses on the left is made up of less line segments than the ellipses on the right](images/ellipses.jpg) 179 | *Two ellipses on a black screen. The ellipses on the left is made up of less line segments than the ellipses on the right.* 180 | 181 | Run the program and notice the difference in how the ellipses are drawn based on the larger number of segments used in the second ellipse. 182 | 183 | Line: 184 | 185 | ```lua 186 | function love.draw() 187 | love.graphics.line(100, 100, 200, 200) 188 | end 189 | ``` 190 | 191 | ![a white line from the top left corner down and to the right, on a black background](images/line.jpg) 192 | *a white line from the top left corner down and to the right* 193 | 194 | Many additional shapes (triangle, quads, etc) can be created using the polygon function. 195 | 196 | ```lua 197 | function love.draw() 198 | love.graphics.setColor(1,0,0) 199 | 200 | love.graphics.polygon("fill", 100,100, 200,100, 150,200) 201 | end 202 | ``` 203 | 204 | ![a red equilateral triangle on a black screen](images/triangle.jpg) 205 | *red equilateral triangle on a black screen* 206 | 207 | More shapes can be found in the [drawing](https://love2d.org/wiki/love.graphics) section of the LÖVE Wiki. 208 | 209 | ### Basic structure of a LÖVE program 210 | 211 | In Processing and p5.js we usually have setup and draw functions. In LÖVE, we have load, update and draw. 212 | 213 | The function ```love.load()``` runs once when the program starts, similar to the setup function in Processing and p5.js. 214 | 215 | The function ```love.update(dt)``` runs continously until our program ends. This is where we may call our own custom functions from, take input, or otherwise control our program. You may have noticed that update takes an argument *dt*. That stands for *delta time*. This is the number of seconds since the last time the update run. It is used to precisely calculate the exact amount of time and make adjustments, one of the things that makes LÖVE particularly good for video games, where precision of time (for a clock, reaching a goal, physics, etc) is important. 216 | 217 | Finally, ```love.draw()``` happens immediately after our update and this is where we draw any graphics to the screen. In Processing and p5.js these two functions are combined together but LÖVE has us separate the two. **Graphics can only be drawn to the screen in love.draw()**. In fact, as you've seen in our previous example programs, you can have a love.draw() without a love.load() or love.update(), but without love.draw() you won't be able to see anything on screen. 218 | 219 | ### Variables 220 | 221 | Unlike Processing but similar to p5.js, you do not need to specify a variable's type. 222 | 223 | **Unlike Processing and p5.js, all variables are global, even those created inside functions, unless specified as local-only**. 224 | 225 | Javascript and Java have the ++ shortcut, known as *syntactic sugar* to increment a variable. Lua does not. 226 | 227 | ```lua 228 | function love.load() 229 | x = 0 230 | end 231 | 232 | function love.update(dt) 233 | x=x+1 234 | end 235 | 236 | function love.draw() 237 | love.graphics.setBackgroundColor(0,0,0,0) 238 | love.graphics.setColor(1,0,0) 239 | love.graphics.print("x: "..x, 100, 200) 240 | end 241 | ``` 242 | 243 | ![black screen with a bit of text in red, x: with the current framenumber](images/framecounter.jpg) 244 | *screenshot of running sketch* 245 | 246 | ### Functions 247 | 248 | LÖVE (and Lua in general) does not use curly brackets to surround functions, conditionals and loops for example. 249 | 250 | Instead of a curly bracket a function in LÖVE ends with the word ```end```. 251 | 252 | ```lua 253 | function myFunctionName(argument) 254 | -- function code in here 255 | end 256 | ``` 257 | 258 | In addition to the love.load(), love.update() and love.draw() built-in functions there are also: 259 | * love.mousePressed() 260 | * love.mouseReleased() 261 | * love.keyPressed() 262 | * love.keyReleased() 263 | * love.focus() - anything in this function runs when a user clicks outside the game's running window 264 | * love.quit() - runs once when a user clicks the close button or chooses Quit 265 | 266 | All of these function run as a result of an event triggering. 267 | 268 | There are many other [callback functions](https://love2d.org/wiki/Category:Callbacks) available in LÖVE as well as a [tutorial](https://love2d.org/wiki/Tutorial:Callback_Functions) with examples. 269 | 270 | ### Example of motion 271 | 272 | ```lua 273 | -- example moving a shape on screen 274 | function love.load() 275 | x = 100 276 | end 277 | 278 | function love.update() 279 | x=x+1 280 | end 281 | 282 | function love.draw() 283 | love.graphics.rectangle("fill", x, 50, 200, 150) 284 | end 285 | ``` 286 | 287 | ![a screenshot of a white rectangle on black background](images/moving.jpg) 288 | *screenshot of a moving white rectangle on a black background* 289 | 290 | ### Syntax of conditionals and loops 291 | 292 | Conditionals such as an if statement in LÖVE come from Lua. They are similar to conditionals in other languages, bearing in mind that the conditional block ends with the word ```end``` instead of curly brackets. 293 | 294 | ```lua 295 | function love.load() 296 | x = 0 297 | width=love.graphics.getWidth() 298 | height=love.graphics.getHeight() 299 | end 300 | 301 | function love.update() 302 | x=x+10 303 | if x > width then 304 | x = 0 305 | end 306 | end 307 | 308 | function love.draw() 309 | love.graphics.ellipse("fill",x,height/2,10,10) 310 | end 311 | ``` 312 | 313 | LÖVE (and Lua) also permit use of complex [if-then-elseif-else](https://www.tutorialspoint.com/lua/if_else_statement_in_lua.htm) structure, but there is no equivalent to Javascript's Switch. 314 | 315 | ### Using the mouse 316 | 317 | In Processing and p5.js we are used to the mouseX and mouseY built-in variables for getting the location of the mouse's X and Y coordinates. 318 | 319 | LÖVE provides the getX() and getY() functions. 320 | 321 | ```lua 322 | function love.draw() 323 | --move mouse on screen to see result 324 | local x = love.mouse.getX() 325 | love.graphics.line(x,0, x,love.graphics.getHeight()) 326 | end 327 | ``` 328 | 329 | ### Random values 330 | 331 | Like Processing and p5.js, LÖVE provides a function for generating pseudorandom values. 332 | 333 | ```love.math.random()``` returns a float between 0 and 1. 334 | 335 | 336 | ```love.math.random(value)``` returns an integer between 1 and the entered value, inclusive. 337 | 338 | ```love.math.random(min,max)``` returns an integer between the minimum and the maximum values entered, inclusive. 339 | 340 | **Important**: Unlike Processing and p5.js, LÖVE doesn't seed the random number generator by default. This means that it will always return the same random numbers if you run the same code! Since most of the time you may want different random numbers each time you run your software, simply add the following line near the beginning of your `love.load()` function, which will use the current time to seed the random number generator. 341 | 342 | ```lua 343 | math.randomseed(os.time()) 344 | ``` 345 | 346 | ### Example demonstrating keypressed function, conditionals and random number generation and LÖVE syntax 347 | 348 | In this example pressing a space key down chooses a new random number for x, used to draw an ellipse in love.draw() 349 | 350 | ```lua 351 | function love.load() 352 | math.randomseed(os.time()) 353 | x = love.graphics.getWidth()/2 354 | end 355 | function love.keypressed(key) 356 | if key == 'space' then 357 | x = love.math.random(love.graphics.getWidth()) 358 | end 359 | end 360 | function love.draw() 361 | love.graphics.ellipse("line",x,love.graphics.getHeight()/2,20,20) 362 | end 363 | ``` 364 | 365 | ### Drawing Images to screen 366 | 367 | Like Processing and p5.js, LÖVE has functionality built in to easily import images. 368 | 369 | We load an image to a variable using love.graphics.newImage() in the love.load() function. We draw it to the screen using love.graphics.draw() in the love.draw() function. 370 | 371 | Images are objects, so we can optionally use :getWidth() and :getHeight(). 372 | 373 | **The color of an image is affected by any previous setColor() command**. 374 | 375 | ```lua 376 | function love.load() 377 | --load image logo.png inside current folder to img 378 | img = love.graphics.newImage("logo.png") 379 | -- make cursor invisible 380 | love.mouse.setVisible(false) 381 | end 382 | 383 | function love.draw() 384 | -- get mouse coordinates 385 | local x, y = love.mouse.getPosition() 386 | 387 | --draw img centered on mouse's coordinates 388 | love.graphics.draw(img, x - img:getWidth()/2, y - img:getHeight()/2) 389 | end 390 | ``` 391 | 392 | ![screenshot of LÖVE's logo moving based on mouse coordinates](images/moving-logo.jpg) 393 | *screenshot of LÖVE's logo moving based on mouse coordinates* 394 | 395 | ## More differences from Processing (Java) and p5.js (Javascript) 396 | 397 | ### String Concatenation 398 | 399 | To combine strings of letters together we use the ```..``` syntax. 400 | 401 | ```js 402 | //this is p5.js 403 | text("My name is "+name,50,50); 404 | ``` 405 | 406 | ```lua 407 | --This is the equivalent in LÖVE 408 | love.graphics.print("My name is "..name, 50, 50) 409 | ``` 410 | 411 | ### For-Loops 412 | 413 | ```lua 414 | for counter=init,max_value,amount_to_increment 415 | do 416 | --action to do in the loop 417 | end 418 | ``` 419 | 420 | The amount_to_increment is optional if the amount is 1. 421 | 422 | Example of a for-loop: 423 | 424 | ```lua 425 | function love.load() 426 | width = love.graphics.getWidth() 427 | end 428 | 429 | function love.draw() 430 | for i = 1,width,30 431 | do 432 | love.graphics.setColor(i/255,i/255,200/255) 433 | love.graphics.ellipse("fill",i,300,20,20) 434 | end 435 | end 436 | ``` 437 | 438 | ![a black background with ellipses in a gradient running blue to pale yellow across the screen](images/gradient.jpg) 439 | *a black background with ellipses in a gradient running blue to pale yellow across the screen* 440 | 441 | ### Arrays and Classes via Tables 442 | 443 | Tables are the main data structure of Lua. They work like *dictionaries* with a key and value. We can create many structures like arrays and classes from tables. 444 | 445 | To create a table that works like a literal array: 446 | 447 | ```lua 448 | animals = {"croc","bug","wolf","fox"} 449 | ``` 450 | 451 | **All arrays are 1-indexed!** In the above example, ```animals[1]``` is "croc". 452 | 453 | To get an array length, use #. 454 | 455 | ```lua 456 | total_animals = #animals 457 | ``` 458 | 459 | Tables can be used similar to Javascript objects. 460 | 461 | Classes are a bit beyond the scope of this introduction. Like arrays they are also created out of tables. There are several approaches. Check out the [Classes](https://sheepolution.com/learn/book/11) tutorial in the How to LÖVE online book. 462 | 463 | ### Compiled / interpreted / synchronous / asynchronous ? 464 | 465 | Java is compiled to bytecode. When you 'run' a Processing program it produces a jar file. If there is a bug such as a syntax error, your program won't compile and therefore won't run. Once the program is compiled and run, code executes linearly. 466 | 467 | Javascript is *interpreted*. Your script.js file written in p5.js starts to load and is run when the web page that links to the code is visited. Because Javascript was designed to be run in a browser, it is tolerant of speed issues for example, and parts of a website may load and run before other parts are received, not necessarily in order from 'top to bottom' for example. In our sketch file in p5.js we can deal with this by loading media files in our preload() function, which ensures all media is loaded before our setup() and draw() run. We don't need to do this in Processing. 468 | 469 | Lua is compiled to bytecode and then interpreted by a virtual machine. LÖVE is implemented in Lua. Like Processing, a program will execute linearly 'top to bottom.' The Lua language allows for asyncronous processes through [coroutines](https://peerdh.com/blogs/programming-insights/using-coroutines-for-asynchronous-state-management-in-love2d-1). 470 | 471 | ### To distribute programs 472 | 473 | When you're ready to distribute your program you will zip up the folder and rename the extension .zip to .love to create an executable Windows exe file, a Mac App, or Linux AppImage. [additional info](https://love2d.org/wiki/Game_Distribution#Create_a_.love-file) 474 | 475 | ### Built-in functionality in LÖVE 476 | 477 | * [Physics](https://love2d.org/wiki/love.physics) 478 | * [Collision detections](https://love2d.org/wiki/Tutorial:PhysicsCollisionCallbacks) 479 | * [Joystick support](https://love2d.org/wiki/love.joystick) 480 | * Access to the [operating system](https://love2d.org/wiki/love.system) and [file system](https://love2d.org/wiki/love.filesystem) 481 | * [Video](https://love2d.org/wiki/love.video) 482 | * [Audio](https://love2d.org/wiki/love.audio) 483 | * [Fullscreen](https://love2d.org/wiki/love.window.setFullscreen) 484 | * [Packaging programs for distribution](https://love2d.org/wiki/Game_Distribution) 485 | 486 | ### Resources 487 | 488 | * [LÖVE Wiki](https://love2d.org/wiki/Main_Page) - contains the reference, tutorials, etc 489 | * [LÖVE Forums](https://love2d.org/forums/) 490 | * [LÖVE Discord server](https://discord.com/invite/rhUets9) 491 | * [Awesome LÖVE](https://github.com/love2d-community/awesome-love2d) - "A categorized community-driven collection of high-quality, awesome LÖVE libraries, projects, and resources." 492 | * [Obey_love](https://twitter.com/obey_love) official Twitter account of LÖVE 493 | * Tutorial on setting up LÖVE in [Visual Studio Code](https://twitter.com/obey_love) 494 | 495 | ### Tutorials 496 | 497 | * [How to LÖVE](https://sheepolution.com/learn/book/contents) comprehensive and beginner-friendly book on LÖVE by Sheepolution 498 | * [Conditionals](https://sheepolution.com/learn/book/6), [Tables and For-Loops](https://sheepolution.com/learn/book/7), [Classes](https://sheepolution.com/learn/book/11) from How To LÖVE 499 | * [Falling in LÖVE with Lua](https://www.youtube.com/watch?v=3k4CMAaNCuk) YouTube video and [slides](https://docs.google.com/presentation/d/1K3GN5827gbqQZJzKu43kXPaW2cTkJWja8WWbrv2Wnmc/edit#slide=id.p), a tutorial on building a basic procedurally generated version of Mario in LÖVE 500 | * Basic [Physics tutorial](https://love2d.org/wiki/Tutorial:Physics) 501 | * LÖVE [Tile Tutorial](https://github.com/kikito/love-tile-tutorial/wiki) to make tile-based game 502 | 503 | ## Contributing 504 | 505 | I mostly have experience with Processing and p5.js and more limited experience with LÖVE and Lua. Feel free to submit an issue, pull request or get in touch via email with any corrections or suggestions. 506 | 507 | # License 508 | 509 | This tutorial is Public Domain under The Unlicense except where any code examples from LÖVE are used, under the GNU Free Documentation License 1.3. 510 | -------------------------------------------------------------------------------- /images/colored-text.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/colored-text.jpg -------------------------------------------------------------------------------- /images/ellipses.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/ellipses.jpg -------------------------------------------------------------------------------- /images/framecounter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/framecounter.jpg -------------------------------------------------------------------------------- /images/gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/gradient.jpg -------------------------------------------------------------------------------- /images/hello-world.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/hello-world.jpg -------------------------------------------------------------------------------- /images/line.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/line.jpg -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/logo.png -------------------------------------------------------------------------------- /images/moving-line.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/moving-line.jpg -------------------------------------------------------------------------------- /images/moving-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/moving-logo.jpg -------------------------------------------------------------------------------- /images/moving.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/moving.jpg -------------------------------------------------------------------------------- /images/rectangle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/rectangle.jpg -------------------------------------------------------------------------------- /images/triangle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lee2sman/processing-to-love/1463c0a6f35a9d79711648e223ceff4b6cbdf8cc/images/triangle.jpg --------------------------------------------------------------------------------