Skip to content

Commit 8fc1c2b

Browse files
authored
Added weld joint example. (#219)
1 parent d987d10 commit 8fc1c2b

15 files changed

Lines changed: 639 additions & 0 deletions
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
path_settings {
2+
path: "**"
3+
profile: "Default"
4+
}
5+
profiles {
6+
name: "Default"
7+
platforms {
8+
os: OS_ID_GENERIC
9+
formats {
10+
format: TEXTURE_FORMAT_RGBA
11+
compression_level: BEST
12+
compression_type: COMPRESSION_TYPE_DEFAULT
13+
}
14+
mipmaps: false
15+
max_texture_size: 0
16+
premultiply_alpha: true
17+
}
18+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
platforms:
2+
arm64-ios:
3+
context:
4+
excludeLibs: []
5+
excludeSymbols: []
6+
symbols: []
7+
libs: []
8+
frameworks: []
9+
linkFlags: []
10+
x86_64-ios:
11+
context:
12+
excludeLibs: []
13+
excludeSymbols: []
14+
symbols: []
15+
libs: []
16+
frameworks: []
17+
linkFlags: []
18+
armv7-android:
19+
context:
20+
excludeLibs: []
21+
excludeJars: []
22+
excludeSymbols: []
23+
symbols: []
24+
libs: []
25+
linkFlags: []
26+
jetifier: true
27+
arm64-android:
28+
context:
29+
excludeLibs: []
30+
excludeJars: []
31+
excludeSymbols: []
32+
symbols: []
33+
libs: []
34+
linkFlags: []
35+
jetifier: true
36+
arm64-osx:
37+
context:
38+
excludeLibs: []
39+
excludeSymbols: []
40+
symbols: []
41+
libs: []
42+
frameworks: []
43+
linkFlags: []
44+
x86_64-osx:
45+
context:
46+
excludeLibs: []
47+
excludeSymbols: []
48+
symbols: []
49+
libs: []
50+
frameworks: []
51+
linkFlags: []
52+
x86_64-linux:
53+
context:
54+
excludeLibs: []
55+
excludeSymbols: []
56+
symbols: []
57+
libs: []
58+
linkFlags: []
59+
arm64-linux:
60+
context:
61+
excludeLibs: []
62+
excludeSymbols: []
63+
symbols: []
64+
libs: []
65+
linkFlags: []
66+
x86-win32:
67+
context:
68+
excludeLibs: []
69+
excludeSymbols: []
70+
symbols: []
71+
libs: []
72+
linkFlags: []
73+
x86_64-win32:
74+
context:
75+
excludeLibs: []
76+
excludeSymbols: []
77+
symbols: []
78+
libs: []
79+
linkFlags: []
80+
wasm-web:
81+
context:
82+
excludeLibs: []
83+
excludeJsLibs: []
84+
excludeSymbols: []
85+
symbols: []
86+
libs: []
87+
linkFlags: []
88+
wasm_pthread-web:
89+
context:
90+
excludeLibs: []
91+
excludeJsLibs: []
92+
excludeSymbols: []
93+
symbols: []
94+
libs: []
95+
linkFlags: []
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
platforms:
2+
armv7-ios:
3+
context:
4+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
5+
excludeSymbols: []
6+
libs: [physics_2d, box2d, script_box2d, physics_3d]
7+
arm64-ios:
8+
context:
9+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
10+
excludeSymbols: []
11+
symbols: []
12+
libs: [physics_2d, box2d, script_box2d, physics_3d]
13+
frameworks: []
14+
linkFlags: []
15+
x86_64-ios:
16+
context:
17+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
18+
excludeSymbols: []
19+
symbols: []
20+
libs: [physics_2d, box2d, script_box2d, physics_3d]
21+
frameworks: []
22+
linkFlags: []
23+
armv7-android:
24+
context:
25+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
26+
excludeJars: []
27+
excludeSymbols: []
28+
symbols: []
29+
libs: [physics_2d, box2d, script_box2d, physics_3d]
30+
linkFlags: []
31+
jetifier: true
32+
arm64-android:
33+
context:
34+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
35+
excludeJars: []
36+
excludeSymbols: []
37+
symbols: []
38+
libs: [physics_2d, box2d, script_box2d, physics_3d]
39+
linkFlags: []
40+
jetifier: true
41+
arm64-osx:
42+
context:
43+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
44+
excludeSymbols: []
45+
symbols: []
46+
libs: [physics_2d, box2d, script_box2d, physics_3d]
47+
frameworks: []
48+
linkFlags: []
49+
x86_64-osx:
50+
context:
51+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
52+
excludeSymbols: []
53+
symbols: []
54+
libs: [physics_2d, box2d, script_box2d, physics_3d]
55+
frameworks: []
56+
linkFlags: []
57+
x86_64-linux:
58+
context:
59+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
60+
excludeSymbols: []
61+
symbols: []
62+
libs: [physics_2d, box2d, script_box2d, physics_3d]
63+
linkFlags: []
64+
arm64-linux:
65+
context:
66+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
67+
excludeSymbols: []
68+
symbols: []
69+
libs: [physics_2d, box2d, script_box2d, physics_3d]
70+
linkFlags: []
71+
x86-win32:
72+
context:
73+
excludeLibs: [libphysics, libbox2d_defold, script_box2d_defold]
74+
excludeSymbols: []
75+
symbols: []
76+
libs: [libphysics_2d.lib, libbox2d.lib, libscript_box2d.lib, libphysics_3d.lib]
77+
linkFlags: []
78+
x86_64-win32:
79+
context:
80+
excludeLibs: [libphysics, libbox2d_defold, script_box2d_defold]
81+
excludeSymbols: []
82+
symbols: []
83+
libs: [libphysics_2d.lib, libbox2d.lib, libscript_box2d.lib, libphysics_3d.lib]
84+
linkFlags: []
85+
wasm-web:
86+
context:
87+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
88+
excludeJsLibs: []
89+
excludeSymbols: []
90+
symbols: []
91+
libs: [physics_2d, box2d, script_box2d, physics_3d]
92+
linkFlags: []
93+
wasm_pthread-web:
94+
context:
95+
excludeLibs: [physics, box2d_defold, script_box2d_defold]
96+
excludeJsLibs: []
97+
excludeSymbols: []
98+
symbols: []
99+
libs: [physics_2d, box2d, script_box2d, physics_3d]
100+
linkFlags: []
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
---
2+
tags: physics, box2d
3+
title: Box2D Weld Joint
4+
brief: Create Box2D weld joints from script so separate dynamic bodies behave like one rigid assembly.
5+
author: Defold Foundation
6+
scripts: box2d_weld_joint.script
7+
thumbnail: thumbnail.webp
8+
---
9+
10+
This example creates two Box2D weld joints at runtime between three separate dynamic square bodies.
11+
They form an L-shaped cluster and are put inside a static wall box.
12+
The weld joints keep the pieces together, while the whole assembly collides and bounces.
13+
14+
Click or touch the screen to kick one of the welded bodies upward and watch the whole cluster react.
15+
16+
There are no differences in scripting between Box2D V2 and V3 in this example.
17+
18+
## What You'll Learn
19+
20+
- How to get Box2D body handles from Defold collision objects
21+
- How to create rigid weld joints with `b2d.joint.create_weld()`
22+
- How local weld anchors define where two bodies are attached
23+
- How changing one welded body's velocity affects the whole connected cluster
24+
25+
## Setup
26+
27+
The collection contains
28+
- `controller` game object with the script and a label with information text
29+
- three game objects: `center`, `right`, and `lower` with dynamic collision objects and visual sprite representations
30+
- a single `walls` game object with static collision object that surrounds the play area with floor, ceiling, and wall shapes.
31+
32+
The 3 separate Defold collision objects are arranged in an L shape,
33+
with 80 px square sprites and matching box collision shapes.
34+
Each block has restitution set to 1.0 so the welded cluster keeps bouncing against the surrounding walls.
35+
Because a weld joint does not turn the blocks into one true compound rigid body,
36+
they remain separate dynamic Box2D bodies connected by a constraint solver,
37+
so even if a block has restitution: 1.0, energy can still be lost thorugh weld joint constraint or damping.
38+
39+
![setup](setup.png)
40+
41+
The `game.project` of this example is configured to build with `/box2d_v3.appmanifest` by default.
42+
To test V2 locally after downloading the example,
43+
change `Native Extensions -> App Manifest` in `game.project` to `/box2d_v2.appmanifest`.
44+
45+
## How It Works
46+
47+
The script starts by getting the bodies owned by the collection-authored collision objects using `b2d.get_body()`.
48+
The script stores the handles for `center`, `right`, and `lower`.
49+
50+
Then it calls `b2d.joint.create_weld()` twice - one weld joint from `center` to `right`, and another from `center` to `lower`.
51+
Each weld joint uses `local_anchor_a` and `local_anchor_b` so the neighboring squares are joined at their touching edges.
52+
53+
The example uses only the rigid weld fields shared by both backends:
54+
`local_anchor_a`, `local_anchor_b`, `reference_angle`, and `collide_connected`.
55+
V2 also supports `frequency` and `damping_ratio` for soft welds,
56+
while V3 uses separate linear and angular hertz/damping fields.
57+
Those backend-specific spring fields are intentionally omitted here so the same script can run on both backends.
58+
59+
Input focus lets player clicks or touches the screen.
60+
The script changes the linear and angular velocity of the `right` block.
61+
The weld joints transfer that motion through the connected bodies,
62+
so the whole L-shaped assembly kicks upward and spins while remaining rigid.
63+

0 commit comments

Comments
 (0)