Help processing 2.0 python

Hi, I am a elementary schooler, and I started collabbing with my friend in python. He would make the sprites, I would code. We are making Super Mario Brothers stage 1-1, because the whole game would take us too long time to make. When I was making the grounds, some bug, or error happened. I have tried every single thing to fix it, put over an 2 full hour to fix this but I just couldn’t. Can you help me fix this project? The code that I wrote right now goes like this-

from processing import *
from time import time

rectx = 50
recty = 300
touchingGround = False
vy = 0
sprint = False
pressed = [0, 0]
costume = 0
look = 0
timerun = 0.0
bottom = 410
noneComboStart = 0

def setup():
    global stillr, run1r, run2r, stilll, still, run1, run2, mario, block, a
    noStroke()
    stillr = loadImage("http://coder200.oyosite.com/mario/photo/still.png")
    run1r = loadImage("http://coder200.oyosite.com/mario/photo/run1.png")
    run2r = loadImage("http://coder200.oyosite.com/mario/photo/run2.png")
    jumpr = loadImage("http://coder200.oyosite.com/mario/photo/jump.png")
    stilll = loadImage("http://coder200.oyosite.com/mario/photo/still_l.png")
    run1l = loadImage("http://coder200.oyosite.com/mario/photo/run1_l.png")
    run2l = loadImage("http://coder200.oyosite.com/mario/photo/run2_l.png")
    jumpl = loadImage("http://coder200.oyosite.com/mario/photo/jump_l.png")
    block = loadImage("http://coder200.oyosite.com/mario/photo/block.png")
    a = [block, block, block, None, None, None, block, None, block, block, None, None]
    still = [stillr, stilll]
    run1 = [run1r, run1l]
    run2 = [run2r, run2l]
    jump = [jumpr, jumpl]
    mario = [still, run1, run2, jump]
    size(500, 500)

def draw():
    move()
    changeCostume()
    background(255, 255, 255)
    fill(0, 0, 0)
    image(mario[costume][look], rectx, recty, 40, 40)
    stroke(255, 255, 255)
    for i in range(len(a)):
        if not a[i] == None:
            image(a[i], i * 40, 450, 40, 40)

def keyPressed():
    global touchingGround, vy, rectx, sprint, look, timerun
    if keyboard.keyCode == 38:
        if touchingGround:
            vy += 11
            touchingGround = False
    if keyboard.keyCode == 37:
        if pressed[0] == 0:
            timerun = time()
        pressed[0] = 2
    if keyboard.keyCode == 39:
        if pressed[1] == 0:
            timerun = time()
        pressed[1] = 2
    if keyboard.keyCode == 16:
        sprint = True

def keyReleased():
    global sprint, costume
    if keyboard.keyCode == 37:
        pressed[0] = 0
    if keyboard.keyCode == 39:
        pressed[1] = 0
    if keyboard.keyCode == 16:
        sprint = False

def move():
    global recty, touchingGround, vy, rectx, noneComboStart, bottom
    for i in range(len(a)):
        if a[i] == None:
            if i - 1 >= 0:
                if a[i - 1] != None:
                    noneComboStart = i * 40
            if not i + 1 >= len(a):
                if a[i + 1] == None:
                    continue
                else:
                    if rectx >= noneComboStart and rectx <= i * 40:
                        bottom = 500
                    else:
                        bottom = 410
    if sprint:
        if pressed[0] != 0:
            pressed[0] = 4
        if pressed[1] != 0:
            pressed[1] = 4
    else:
        if pressed[0] != 0:
            pressed[0] = 2
        if pressed[1] != 0:
            pressed[1] = 2
    if not touchingGround:
        vy -= 0.5
    rectx -= pressed[0]
    rectx += pressed[1]
    recty -= vy
    if recty >= bottom:
        recty = bottom
        touchingGround = True
        vy = 0
    if rectx <= 0:
        rectx = 0

def changeCostume():
    global costume, look
    if abs(pressed[0] - pressed[1]) == 0:
        costume = 0
    elif abs(pressed[0] - pressed[1]) == 2:
        if round((time() - timerun) * 2) % 2 == 0:
            costume = 1
        else:
            costume = 2
        if pressed[0] - pressed[1] == 2:
            look = 1
        elif pressed[0] - pressed[1] == -2:
            look = 0
    elif abs(pressed[0] - pressed[1]) == 4:
        if round((time() - timerun) * 4) % 2 == 0:
            costume = 1
        else:
            costume = 2
        if pressed[0] - pressed[1] == 4:
            look = 1
        elif pressed[0] - pressed[1] == -4:
            look = 0
    if not touchingGround:
        costume = 3

run()

It’s very long, because this is my first time coding platformers. Also just saying I coded this from Python Mini in the coding platform called kidOYO, so it doesn’t have lots of accessibilities that we usually have.

Welcome @BeastBoy3108

I used trinket.io to test your code, which doesn’t report any errors when I run it. What is the bug exactly? Is it that Mario doesn’t fall through the gaps?

Yeah. Mario doesn’t fall into the gaps…

You’re using this condition to detect if Mario is touching the ground:

    ...
    if recty >= bottom:
        recty = bottom
        touchingGround = True

The variable bottom is equal to 410. As long as Mario’s y-coordinate has reached 410, the code assumes he’s resting on the ground. The problem is there’s no other condition to check if he’s also on a brick tile.

You could add some code that loops through the a list to calculate if Mario is above a block or a None item. But you’ll run into other, more complex ‘collision detection’ issues when you’re trying to complete the entire 1-1 level (walls; enemies; platforms above and below you; etc.).

I checked if trinket.io includes a physics library, but it doesn’t look like it. Perhaps kidOYO does? There are pure python physics libraries, pypybox2d; you’d have to upload/copy-paste in each py file … if that’s even possible.

You can also look around for a 2D-platform or Mario tutorial that doesn’t rely on a physics library, although you may have to translate that into Python.

BtW, I’ve got a copy of that old Mario clone game in this repo: :octopus:

You can also play it online via the link below: :link:
GoSubRoutine.GitHub.io/PjsGameEngine/codebase/