Logo
  • Features
  • Educators
  • What's New
  • Blog
  • Showcase
  • About us
  • Contact
Try it now!
A* Odyssey
A* Odyssey

A* Odyssey

Why use A Star Odyssey?

The pathfinding algorithm is a basic element of in game design. Coding a pathfinding algorithm in Scratch is very hard, and running efficiency is extremely low. Hence the necessity for high-efficient pathfinding extension for Scratch is urgent. A Star Odyssey will definitely help you if you want to…

  1. make an RPG game. The hero will find the path when the user clicks a point on the map.
  2. make an open-world game. The guidelines for the mission will be displayed on the map to indicate the right direction.
  3. make a fighting game. You can design a smart armor that has bullet lock and follows the player automatically.

Most importantly, the A Star Odyssey extension is extremely easy to use and has very high performance.

Best Practices

[ coming soon ]

Modules

A Star Odyssey contains five modules:

Module
Description
🔧 Setup
Create obstacles and load them on a map Clear obstacles on a map
🚫 Obstacle
Test if a coordinate point is walkable or not Test if current sprite target is walkable or not
🛰 Path Finding
Find a path on a map from the start point to the endpoint and output the result as a list
📝 Utils
Utilities to help you change the position of sprites more easily or get x y positions in the path list
💬 Debug
Draw the obstacle map and workable path on a canvas

Before you get started, you can find a button on the debug module called Toggle Debug Window. Click it to open or close the debug window. This is very useful for debugging.

Functions and Definitions

🔧 Setup

Load an obstacle onto a map

image

To load an obstacle onto a map is very simple, just choose a sprite and its costume number. You don’t have to display the sprite on the stage.

When an area on the costume is transparent, it will be marked as a workable area or an obstacle.

Parameter
Description
Example Value
map name
The map name. You can add more than one obstacle to the same map or create more than one map in your game.
obstacle
Obstacle Sprite
The sprite you want to load as an obstacle
Sprite 1
Costume #
The costume number, starting from 1
1
dX
The x position offset, relative to the center of the sprite’s costume
0
dY
The y position offset, relative to the center of the sprite’s costume
0
scale
The scale of the costume
100

Take the Scratch cat as an example.

image
image

In the debug window,

the green color represents the walkable area,

the red color represents the wall or obstacle area,

and the blue line indicates the found path.

If you want to load two costumes as obstacles on the map. Code like this:

image

In this example, we loaded three costumes to one map called obstacle. The first is in the center of the map and keeps a 1:1 scale. The second is moved 100 px to the left and keeps a 1:1 scale. The third is moved 150px to the right and scaled up to 150%. The map will be like this:

image
☝
Performance Notice!!! Map calculation is a time-consuming algorithm. Please DO NOT put the block into a forever loop. You should pre-calculate the map and use it for pathfinding.
🚨
Warning The extension chooses a fixed map size with a width of 640px and a height of 360px. You cannot change the size of the map. If you want to calculate for a super big map, you should split the map into smaller parts or scale the map down to 640x360, calculate paths, and then scale up the path coordinates by yourself.

Clear a map

image

Clear a rectangle on the map. In this case, as shown above, all obstacles will be cleared.

If you want to clear the upper half part of the map, use the code demonstrated below:

image

🛰 Path Finding

Once you have a map, you can now find a path on the map.

Find a path and output the result as a list

You have two ways to find a path, by giving two coordinates or two sprites’ targets.

image
☝
To test this block, you should create a list first. This list will be used as a container to store the pathfinding result.

For example, we want to find the path from point (-320,180), which is the upper-left corner of the map, to point (319,-179), which represents the bottom-right corner of the map. As the result, we output it as a list in Scratch.

image

The pathfinding result will be shown like this:

image
Parameter
Description
Example Value
map name
The map that you want to use to find the path
obstacle
from x
The x position of the start point
-320
from y
The y position of the start point
180
to x
The x position of the endpoint
319
to y
The y position of the endpoint
-179
fill list
The list you want to use as a container for the pathfinding result
list name
prepross result
You have two ways to deal with the resulting data. smooth: will remove the points between the start and end points of a straight line. keep raw: keep the raw pixel by pixel pathfinding results.
smooth

Normally you should choose to smooth the results, as shown below on the left, with the raw results on the right.

image
image

The list will be blank if the path cannot be found (no path is available between the two points).

Find the path between two sprites

This is a shortcut block. It does exactly as above, but you can simply choose two sprites.

image
☝
Tips: Sometimes you want to find a path from a sprite’s clone to a sprite. You can use the extension Dolly to get the clone’s id. Just drag it to the blockand it will work.
image

Algorithm choice

image

You can choose the base path-finding algorithm implementation (JPS or A*), and the strategy used for each algorithm (faster or more accurate). JPS speeds are better than A* but slightly less accurate in most cases. When you choose a faster strategy (similar to the best-first algorithm), the path-finding result might not be the shortest one.

🚫 Obstacle

You don’t need to make an extra hit-box to test if the sprite can walk on a specific coordinate.

Is a coordinate on a map walkable?

image

If the given coordinate is a walkable area, it returns true.

image

You can also use this to test whether the current sprite’s target is on a walkable area.

Add a rectangle obstacle to a map

If you want to add a rectangle obstacle to a map, you can use this.

image

📝 Utils

Get the x-axis or y-axis value of a result item in a list

As you can see, the pathfinding result will be formatted in a specific format. [x,y]

In Scratch, you have to deal with a string operation to separate the x and y from the result.

Here are two utils for you to simplify the workflow.

image

If the first item on a list is [10,20]. The above code will extract the number 10 from the [10,20]. the code shown below will extract the number 20.

image

Set position to the sprite

image

This is a goto block, similar to the block goto x:( ) y: ( ). But you can use an expression to simplify the coordinate. It supports either (1,2) or [1,2] formats.

💬 Debug

To toggle the debug window, click the button shown on the left, and the debug window will be opened or closed as shown on the right.

image
image

Roadmap and Change Logs

Version
What’s New
v1.2
added: 1. Added the JPS path-finding algorithm, An optimized implementation of A* algorithm. 2. Use WebAssembly to implement JPS’s algorithm logic written in Rust (thank @-6 and @ob for providing algorithm support). 3. Bug fixes and performance enhancements. Cappu at 21. Sep. 2022
v1.1
added: 1. Added a rectangle obstacle to a map 2. Optimized map building algorithm (special thank @-6 and @ob for helping us to improve the algorithm) Shawn at 12. Aug. 2022
v1.0
added: 1. Totally new way to add obstacles to a map 2. Pathfinding and list filling 3. Debug tools removed: all blocks in version v0.1. Shawn at 04. Aug. 2022
v0.1
init launch support customizable grid size and pathfinding

Credits

💡
If you have any questions or suggestions, you can find us in the discord channel: https://discord.gg/U3nyveCvRa
Logo

Designed by 2ndR with love

Discord