An open API service indexing awesome lists of open source software.

https://github.com/insality/defold-tweener

Timer Based Defold Tween Library
https://github.com/insality/defold-tweener

defold defold-extension defold-library defold-module easing-functions easings tween tweener

Last synced: about 2 months ago
JSON representation

Timer Based Defold Tween Library

Awesome Lists containing this project

README

        

![](media/logo.png)

[![GitHub release (latest by date)](https://img.shields.io/github/v/tag/insality/defold-tweener?style=for-the-badge&label=Release)](https://github.com/Insality/defold-tweener/tags)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/insality/defold-tweener/ci_workflow.yml?style=for-the-badge)](https://github.com/Insality/defold-tweener/actions)
[![codecov](https://img.shields.io/codecov/c/github/Insality/defold-tweener?style=for-the-badge)](https://codecov.io/gh/Insality/defold-tweener)

[![Github-sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/insality) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/insality) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/insality)

# Tweener

**Tweener** - is a single file Lua module for the [Defold](https://defold.com/) game engine. It provides a way to handle manual tweening in your game.

## Features

- **Tweening**: Create tweens for any action your want.
- **Easing Functions**: Provides a set of easing functions for different types of easings.
- **Callbacks**: Callbacks for each tween update.
- **Custom Easings**: Support for custom easing functions.
- **Custom Update Frequency**: Option to define update frequency for the tween.

## Setup

### [Dependency](https://www.defold.com/manuals/libraries/)

Open your `game.project` file and add the following line to the dependencies field under the project section:

**[Tweener](https://github.com/Insality/defold-tweener/archive/refs/tags/5.zip)**

```
https://github.com/Insality/defold-tweener/archive/refs/tags/5.zip
```

### Library Size

> **Note:** The library size is calculated based on the build report per platform

| Platform | Library Size |
| ---------------- | ------------ |
| HTML5 | **3.28 KB** |
| Desktop / Mobile | **6.21 KB** |

### Global Update Frequency [Optional]

Optionally, you can setup global default update frequency in your game.project. It's `60` by default.

This is a global settings for the tweener. You can specify the update frequence parameter in the `tweener.tween` function for special tween operation.

Add next `tweener` section to your `game.project` in text mode:

```ini
[tweener]
update_frequency = 60
```

## API Reference

### Quick API Reference

```lua
-- Tween function can be a string, a predefined easing function, or a custom easing function
local tween_function = "linear" or tweener.linear or go.EASING_LINEAR or gui.EASING_LINEAR or {0, 0.2, 0.4, 0.8, 0.9, 1}

local tween = tweener.tween(tween_function, from, to, time, callback, [dt])
tweener.cancel(tween)
tweener.set_pause(tween, true)
tweener.is_paused(tween)
tweener.is_active(tween)

local value = tweener.ease(tween_function, from, to, time, time_elapsed)
```

### Importing the Module

To start using the Tweener module in your project, you first need to import it. This can be done with the following line of code:

```lua
local tweener = require("tweener.tweener")
```

### Functions

The Tweener module provides two primary functions to work with tweens:

**tweener.tween**
---
```lua
tweener.tween(tween_function, from, to, time, callback, [dt])
```

This function initiates a tween operation immediately. Here's how to use it:

- **Parameters:**
- `tween_function`: The tween function. You can use one of the predefined easing functions or provide a custom one.
- `from`: The starting value of the tween.
- `to`: The ending value of the tween.
- `time`: The duration of the tween, in seconds.
- `callback`: A `function(value, is_final_call)` that gets called upon each update of the tween.
- `dt` (optional): The time interval for updating the tween, in seconds.

- **Return Value:**
- `tween`: A tween object. You can use it to cancel the tween, check if it still running, or pause it.

- **Usage Example:**

```lua
tweener.tween(tweener.linear, 0, 100, 1.5, function(value, is_final_call)
print("Tween value: " .. value)
end)

tweener.tween(go.EASING_OUTSINE, 0, 100, 1.5, function(value, is_final_call)
print("Tween value: " .. value)
end)

local tween = tweener.tween({0, 0.2, 0.4, 0.8, 0.9, 1}, 0, 100, 1.5, function(value, is_final_call)
print("Tween value: " .. value)
end)

-- You can cancel the tween by calling tweener.cancel
tweener.cancel(tween)
```

**tweener.ease**
---
```lua
tweener.ease(tween_function, from, to, time, time_elapsed)
```

This function calculates the value of the tween at a specific point in time, based on the easing function provided.

- **Parameters:**
- `tween_function`: The tween function.
- `from`: The starting value of the tween.
- `to`: The ending value of the tween.
- `time`: The total duration of the tween, in seconds.
- `time_elapsed`: The elapsed time since the start of the tween, in seconds.

- **Usage Example:**

```lua
local value = tweener.ease(tweener.inquad, 0, 100, 1.5, 0.75)
print("The tween value at halfway point is: ", value)

local value = tweener.ease(gui.EASING_OUTSINE, 0, 100, 1.5, 0.75)
print("The tween value at halfway point is: ", value)

local value = tweener.ease({0, 0.2, 0.4, 0.8, 0.9, 1}, 0, 100, 1.5, 0.75)
print("The tween value at halfway point is: ", value)
```

**tweener.cancel**
---
```lua
tweener.cancel(tween)
```

This function cancels the tween with the given `tween` object.

- **Parameters:**
- `tween`: The tween object to cancel.

- **Return Value:**
- `true` if the tween was successfully canceled, `false` otherwise.

- **Usage Example:**

```lua
local tween = tweener.tween(tweener.linear, 0, 100, 1.5, function(value, is_final_call)
print("Tween value: " .. value)
end)

tweener.cancel(tween)
```

**tweener.is_paused**
---
```lua
tweener.is_paused(tween)
```

This function returns `true` if the tween is paused, `false` otherwise.

- **Parameters:**
- `tween`: The tween object to check. It returned from `tweener.tween` function.

- **Return Value:**
- `true` if the tween is paused, `false` otherwise.

**tweener.set_pause**
---
```lua
tweener.set_pause(tween, is_paused)
```

This function sets the pause state of the tween.

- **Parameters:**
- `tween`: The tween object to set the pause state. It returned from `tweener.tween` function.
- `is_paused`: The new pause state.

- **Return Value:**
- `true` if the tween was successfully paused, `false` otherwise.

- **Usage Example:**

```lua
local tween = tweener.tween(tweener.linear, 0, 100, 1.5, function(value, is_final_call)
print("Tween value: " .. value)
end)

tweener.set_pause(tween, true)
tweener.is_paused(tween) -- Returns true
```

**tweener.is_active**
---
```lua
tweener.is_active(tween)
```

This function returns `true` if the tween is running, `false` is the tween is finished.

- **Parameters:**
- `tween`: The tween object to check. It returned from `tweener.tween` function.

- **Return Value:**
- `true` if the tween is running, `false` is the tween is finished.

- **Usage Example:**

```lua
local tween = tweener.tween(tweener.linear, 0, 100, 1.5, function(value, is_final_call)
print("Tween value: " .. value)
end)

tweener.is_active(tween) -- Returns true
-- Wait for 1.5 seconds
tweener.is_active(tween) -- Returns false
```

## Tween Functions

| Tweener Constant | Defold Constant | Easing |
|------------------|-----------------|--------|
| `tweener.linear` | `go.EASING_LINEAR` | |
| `tweener.insine` | `go.EASING_INSINE` | |
| `tweener.inquad` | `go.EASING_INQUAD` | |
| `tweener.incubic` | `go.EASING_INCUBIC` | |
| `tweener.incirc` | `go.EASING_INCIRC` | |
| `tweener.inquart` | `go.EASING_INQUART` | |
| `tweener.inquint` | `go.EASING_INQUINT` | |
| `tweener.inexpo` | `go.EASING_INEXPO` | |
| `tweener.inback` | `go.EASING_INBACK` | |
| `tweener.inelastic` | `go.EASING_INELASTIC` | |
| `tweener.inbounce` | `go.EASING_INBOUNCE` | |
| `tweener.outsine` | `go.EASING_OUTSINE` | |
| `tweener.outquad` | `go.EASING_OUTQUAD` | |
| `tweener.outcubic` | `go.EASING_OUTCUBIC` | |
| `tweener.outcirc` | `go.EASING_OUTCIRC` | |
| `tweener.outquart` | `go.EASING_OUTQUART` | |
| `tweener.outquint` | `go.EASING_OUTQUINT` | |
| `tweener.outexpo` | `go.EASING_OUTEXPO` | |
| `tweener.outback` | `go.EASING_OUTBACK` | |
| `tweener.outelastic` | `go.EASING_OUTELASTIC` | |
| `tweener.outbounce` | `go.EASING_OUTBOUNCE` | |
| `tweener.inoutsine` | `go.EASING_INOUTSINE` | |
| `tweener.inoutquad` | `go.EASING_INOUTQUAD` | |
| `tweener.inoutcubic` | `go.EASING_INOUTCUBIC` | |
| `tweener.inoutcirc` | `go.EASING_INOUTCIRC` | |
| `tweener.inoutquart` | `go.EASING_INOUTQUART` | |
| `tweener.inoutquint` | `go.EASING_INOUTQUINT` | |
| `tweener.inoutexpo` | `go.EASING_INOUTEXPO` | |
| `tweener.inoutback` | `go.EASING_INOUTBACK` | |
| `tweener.inoutelastic` | `go.EASING_INOUTELASTIC` | |
| `tweener.inoutbounce` | `go.EASING_INOUTBOUNCE` | |
| `tweener.outinsine` | `go.EASING_OUTINSINE` | |
| `tweener.outinquad` | `go.EASING_OUTINQUAD` | |
| `tweener.outincubic` | `go.EASING_OUTINCUBIC` | |
| `tweener.outincirc` | `go.EASING_OUTINCIRC` | |
| `tweener.outinquart` | `go.EASING_OUTINQUART` | |
| `tweener.outinquint` | `go.EASING_OUTINQUINT` | |
| `tweener.outinexpo` | `go.EASING_OUTINEXPO` | |
| `tweener.outinback` | `go.EASING_OUTINBACK` | |
| `tweener.outinelastic` | `go.EASING_OUTINELASTIC` | |
| `tweener.outinbounce` | `go.EASING_OUTINBOUNCE` | |

## Usage

You can use Tweener to animate scoring text, for example:

This animation can be created using the following code:

```lua
tweener.tween(gui.EASING_OUTCIRC, 0, 9999, 2.4, function(value, is_final_call)
gui.set_text(text_score, "Score: " .. math.floor(value))

if is_final_call then
gui.set_scale(text_score, vmath.vector3(1.25, 1.25, 1))
gui.animate(text_score, "scale", vmath.vector3(1, 1, 1), gui.EASING_OUTBOUNCE, 0.5)
end
end)
```

You can obtain the value of the tween at any point in time with the `tweener.ease` function:

```lua
tweener.ease(gui.EASING_OUTSINE, 0, 100, 1, 0) -- Returns 0
tweener.ease(gui.EASING_OUTSINE, 0, 100, 1, 0.25) -- Returns 38.268343236509
tweener.ease(gui.EASING_OUTSINE, 0, 100, 1, 0.5) -- Returns 70.710678118655
tweener.ease(gui.EASING_OUTSINE, 0, 100, 1, 0.75) -- Returns 92.387953251129
tweener.ease(gui.EASING_OUTSINE, 0, 100, 1, 1) -- Returns 100
```

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Issues and suggestions

If you have any issues, questions or suggestions please [create an issue](https://github.com/Insality/defold-tweener/issues).

## 👏 Contributors



## Changelog

### **V1**
- Initial release

### **V2**
- Changed timer `delta time` to `socket.gettime` for more precise tweening

### **V3**
- Added custom easings support

### **V4**
- Fix `update_frequency` game.project settings typo
- Now able to use string name of easing functions (ex. "linear", "insine", "outquad", etc.)
- Add `tweener.cancel` function to cancel tweening instead of `timer.cancel` (For better API and README)
- Code cleanup and better performance
- Fix if total time is 0, then callback will be called immediately

### **V5**
- [Breaking]: `tweener.tween` now returns a tween object instead of a timer id. So if you used `timer.cancel` to cancel the tween, you need to use `tweener.cancel` instead.
- Added `tweener.set_pause` function to pause and resume a tween
- Added `tweener.is_paused` function to check if a tween is paused
- Added `tweener.is_active` function to check if a tween is active

## ❤️ Support project ❤️

Your donation helps me stay engaged in creating valuable projects for **Defold**. If you appreciate what I'm doing, please consider supporting me!

[![Github-sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/insality) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/insality) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/insality)