My Super Mario Maker like game is freezing on my PyBadge and I don’t know why. Here’s the link if you want to help: https://arcade.makecode.com/S56169-18796-80738-18523
1 Like
Alright, I took a careful look at this code. From a MakeCode Arcade / TypeScript perspective, here are some key things you or someone else might want to fix or watch out for:
Array out-of-bounds in make_level()
for (let index = 0; index <= Xpos.length; index++) {
tiles.setTileAt(tiles.getTileLocation(Xpos[index], Ypos[index]), blocks[Type[index]])
}
index <= Xpos.length
→ This will go one past the last index, causingundefined
errors.- Fix:
Global variables without initialization
You have a ton of global variables like Xpos
, Ypos
, Type
, blocks
, Mario
, making
, etc.
- Some are initialized at the bottom of the script, but if functions run before initialization, you’ll get errors.
- Good practice: Initialize all of the variabes at the top with defaults:
Repeated forever
loops doing similar things
You have dozens of forever()
loops, many of which check controller.A.isPressed()
or making
and then perform actions.
- Problem: This can lag the game. MakeCode executes each
forever()
independently, so heavy logic in multiple loops can slow the engine. - Better: Combine related logic into fewer loops with
if
checks inside.
Sprite positions with offsets
- Using decimals in tile positions is risky.
getTileLocation()
expects integers. - Fix: Round the positions:
Xpos.insertAt(0, …)
logic
You’re inserting at 0 every time, meaning the arrays are in reverse order. If you care about placement order, consider using .push()
instead.
destroy_sprites()
vs sprites.destroyAllSpritesOfKind
- That’s fine. But in
ded()
, you also destroy all goombas before resetting the player.
Music/Sound Overlaps
- You have multiple music tracks playing in parallel in different
forever()
loops. This can conflict. - Recommendation: Only play music when needed or use
music.stopAllSounds()
before playing a new track.
onreset
, oncurrentblock
, onerase
logic
- These flags control if you can reset, erase, or place blocks.
- Seems okay, but check that
pauseUntil()
calls don’t block other logic you want running. Blocking in one loop can freeze animations.
forever
loop doing nothing
- You can remove empty loops—they’re unnecessary.
Possible typo
if (onerase == 0 && onreset == 0 && oncurrentblock == 0)
- Later, you use
onerase
but earlier you wroteonerase
withe
? Make sure variable names are consistent.
Summary of main actionable fixes
- Change
<= Xpos.length
→< Xpos.length
. - Round tile positions when using
tilemapLocation()
. - Combine redundant
forever()
loops to improve performance. - Ensure all global vars are initialized before use.
- Review
.insertAt(0)
vs.push()
logic for block placement order. - Avoid empty or overlapping
forever()
loops with sound/music.