Here is the exact mathematical breakdown of how .
red_cube.x and drop.y change across each cycle in your script1. drop.y (Raindrop Height)
For each raindrop $i$, let $y_{\text{start}, i}$ be its randomly assigned initial height from .
random.uniform(0, 4)- Initial State: $\text{drop}_i.y = y_{\text{start}, i}$
- After
dash_step_1(): Subtractions of $1$ unit $\rightarrow \text{drop}_i.y = y_{\text{start}, i} - 1$ - After
dash_step_2(): Subtractions of another $1$ unit $\rightarrow \text{drop}_i.y = y_{\text{start}, i} - 2$ - After
reset_and_repeat(): Position is reassigned to a brand new random coordinate $y_{\text{new}, i} \in [0, 4]$.
Total Displacement per sequence run: Each drop moves $-2.0$ units downward on the Y-axis before resetting .
2. red_cube.x (Player Horizontal Position)
The red cube starts at $x_{\text{start}} = -2.0$ . Because $x < 0$ initially, the conditionals in your step functions evaluate to true :
$$\text{Initial Position: } x_0 = -2.0 \quad (x_0 < 0) \text{[cite: 3]}$$
During the Sequence:
dash_step_1():$$\text{Since } x_0 < 0 \implies x_1 = x_0 - 1 = -2.0 - 1.0 = \mathbf{-3.0} \text{[cite: 3]}$$dash_step_2():$$\text{Since } x_1 < 0 \implies x_2 = x_1 - 1 = -3.0 - 1.0 = \mathbf{-4.0} \text{[cite: 3]}$$
In reset_and_repeat():
Your code evaluates . In Ursina, comparing a :
if red_cube.position < 0:Vec3 vector to an integer evaluates the vector's length/truthiness or first component, keeping it on the negative branch$$x_3 = -\text{start\_pos.x} = -(-2.0) = \mathbf{2.0} \text{[cite: 3]}$$
Subsequent Cycle Behavior:
On the next cycle, because $x$ is now $+2.0$ ($x \ge 0$) :
dash_step_1(): $x = 2.0 + 1 = \mathbf{3.0}$dash_step_2(): $x = 3.0 + 1 = \mathbf{4.0}$reset_and_repeat(): Flips back to $\text{start\_pos.x} = \mathbf{-2.0}$
Movement Summary Table
| Cycle Stage | red_cube.x (Odd Cycles) | red_cube.x (Even Cycles) | drop.y (All Drops) |
| Start of Cycle | $-2.0$ | $+2.0$ | $y_{\text{start}}$ |
After dash_step_1() | $-3.0$ | $+3.0$ | $y_{\text{start}} - 1.0$ |
After dash_step_2() | $-4.0$ | $+4.0$ | $y_{\text{start}} - 2.0$ |
After reset_and_repeat() | Resets to $+2.0$ | Resets to $-2.0$ | Resets to new $y \in [0, 4]$ |
The red cube bounces back and forth across the screen between $[-4.0, +4.0]$ while the raindrops drop $2$ units before getting re-rolled .