Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
Velocity Run
-
I'm about to release an iPhone app on the App Store, but I have one problem. Whenever I run the program, a warning message about global variables being used before being declared flashes for a second. However, the code works without a problem once it goes away. I can't figure out how to get rid of the message. Any suggestions are welcome.
-
Here is the code part 1
<PRE>
from scene import *
import sys
import time
import sound
class velocity_run(Scene):
def setup(self):
self.x = self.size.w * 0.5
self.y = self.size.h * 0.5
global level
level = 0
def draw(self):
def level0():
background(1, 1, 1)
tint(0, 0, 1)
text('''Welcome to
Velocity Run!
Tilt your device
to move the red
square into the
green areas and
out of the black
areas.''', font_size=32, x=self.size.w / 2, y=self.size.h / 2, alignment=5)
image('Typicons48_Thumbs_Up', self.size.w / 2 - 24, 0)
for touch in self.touches.values():
if self.size.w / 2 - 24 < touch.location.x < self.size.w / 2 + 24 and 0 < touch.location.y < 48:
global level
level = 1
def level1():
tint(0, 0, 1)
background(1, 1, 1)
bw1 = self.size.w * 0.1
bw2 = self.size.w - self.size.w * 0.1
fill(0, 0, 0)
rect(0, 0, self.size.w * 0.1, self.size.h)
b1 = Rect(0, 0, self.size.w * 0.1, self.size.h)
rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
b2 = Rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
fill(0, 1, 0)
rect(0, 0, self.size.w, 20)
b3 = Rect(0, 0, self.size.w, 20)
fill(1, 0, 0)
grav = gravity()
self.x += grav.x * 5
self.y += grav.y * 5
rect(self.x, self.y, 30, 30)
ball = Rect(self.x, self.y, 30, 30)
if ball.intersects(b1) or ball.intersects(b2):
sound.play_effect('Crashing')
global level
level = -2
elif ball.intersects(b3):
sound.play_effect('Bleep')
global level
level = 2
def level2():
tint(0, 0, 1)
background(1, 1, 1)
bw1 = self.size.w * 0.1
bw2 = self.size.w - self.size.w * 0.1
fill(0, 1, 0)
rect(0, self.size.h - 20, self.size.w, 20)
b3 = Rect(0, self.size.h - 20, self.size.w, 20)
fill(0, 0, 0)
rect(0, 0, self.size.w * 0.1, self.size.h)
b1 = Rect(0, 0, self.size.w * 0.1, self.size.h)
rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
b2 = Rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
fill(1, 0, 0)
grav = gravity()
self.x += grav.x * 5
self.y += grav.y * 5
rect(self.x, self.y, 30, 30)
ball = Rect(self.x, self.y, 30, 30)
if ball.intersects(b1) or ball.intersects(b2):
sound.play_effect('Crashing')
global level
level = -2
elif ball.intersects(b3):
sound.play_effect('Bleep')
global level
level = 3
def level3():
tint(0, 0, 0)
background(1, 1, 1)
bw1 = self.size.w * 0.1
bw2 = self.size.w - self.size.w * 0.1
fill(0, 0, 0)
rect(0, 0, self.size.w * 0.1, self.size.h)
b1 = Rect(0, 0, self.size.w * 0.1, self.size.h)
rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
b2 = Rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
rect(0, 20, self.size.w * 0.25, 20)
b4 = Rect(0, 20, self.size.w * 0.25, 20)
fill(0, 1, 0)
rect(0, 0, self.size.w, 20)
b3 = Rect(0, 0, self.size.w, 20)
fill(1, 0, 0)
grav = gravity()
self.x += grav.x * 5
self.y += grav.y * 5
rect(self.x, self.y, 30, 30)
ball = Rect(self.x, self.y, 30, 30)
if ball.intersects(b1) or ball.intersects(b2) or ball.intersects(b4):
sound.play_effect('Crashing')
global level
level = -2
elif ball.intersects(b3):
sound.play_effect('Bleep')
global level
level = 4
def level4():
tint(0, 0, 1)
background(1, 1, 1)
bw1 = self.size.w * 0.1
bw2 = self.size.w - self.size.w * 0.1
fill(0, 0, 0)
rect(0, 0, self.size.w * 0.1, self.size.h)
b1 = Rect(0, 0, self.size.w * 0.1, self.size.h)
rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
b2 = Rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
rect(0, self.size.h - 40, self.size.w * 0.25, 20)
b4 = Rect(0, self.size.h - 40, self.size.w * 0.25, 20)
fill(0, 1, 0)
rect(0, self.size.h - 20, self.size.w, 20)
b3 = Rect(0, self.size.h - 20, self.size.w, 20)
fill(1, 0, 0)
grav = gravity()
self.x += grav.x * 5
self.y += grav.y * 5
rect(self.x, self.y, 30, 30)
ball = Rect(self.x, self.y, 30, 30)
if ball.intersects(b1) or ball.intersects(b2) or ball.intersects(b4):
sound.play_effect('Crashing')
global level
level = -2
elif ball.intersects(b3):
sound.play_effect('Bleep')
global level
level = 5
def level5():
tint(0, 0, 0)
background(1, 1, 1)
bw1 = self.size.w * 0.1
bw2 = self.size.w - self.size.w * 0.1
fill(0, 0, 0)
rect(0, 0, self.size.w * 0.1, self.size.h)
b1 = Rect(0, 0, self.size.w * 0.1, self.size.h)
rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
b2 = Rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
rect(0, 20, self.size.w * 0.25, 20)
b4 = Rect(0, 20, self.size.w * 0.25, 20)
rect(self.size.w / 2 - 25, self.size.h / 2 - 25, 50, 50)
b5 = Rect(self.size.w / 2 - 25, self.size.h / 2 - 25, 50, 50)
fill(0, 1, 0)
rect(0, 0, self.size.w, 20)
b3 = Rect(0, 0, self.size.w, 20)
fill(1, 0, 0)
grav = gravity()
self.x += grav.x * 5
self.y += grav.y * 5
rect(self.x, self.y, 30, 30)
ball = Rect(self.x, self.y, 30, 30)
if ball.intersects(b1) or ball.intersects(b2) or ball.intersects(b4) or ball.intersects(b5):
sound.play_effect('Crashing')
global level
level = -2
elif ball.intersects(b3):
sound.play_effect('Bleep')
global level
level = 6
def level6():
tint(0, 0, 1)
background(1, 1, 1)
bw1 = self.size.w * 0.1
bw2 = self.size.w - self.size.w * 0.1
fill(0, 0, 0)
rect(0, 0, self.size.w * 0.1, self.size.h)
b1 = Rect(0, 0, self.size.w * 0.1, self.size.h)
rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
b2 = Rect(self.size.w - self.size.w * 0.1, 0, self.size.w * 0.1, self.size.h)
rect(0, self.size.h - 40, self.size.w * 0.25, 20)
b4 = Rect(0, self.size.h - 40, self.size.w * 0.25, 20)
rect(self.size.w / 2 - 50, self.size.h / 2 - 50, 100, 100)
b5 = Rect(self.size.w / 2 - 50, self.size.h / 2 - 50, 100, 100)
fill(0, 1, 0)
rect(0, self.size.h - 20, self.size.w, 20)
b3 = Rect(0, self.size.h - 20, self.size.w, 20)
fill(1, 0, 0)
grav = gravity()
self.x += grav.x * 5
self.y += grav.y * 5
rect(self.x, self.y, 30, 30)
ball = Rect(self.x, self.y, 30, 30)
if ball.intersects(b1) or ball.intersects(b2) or ball.intersects(b4) or ball.intersects(b5):
sound.play_effect('Crashing')
global level
level = -2
elif ball.intersects(b3):
sound.play_effect('Bleep')
global level
level = -1
</PRE> -
Here is the code part 2 (you need to combine part 1 and part 2 into 1 code file
<PRE>
def leveln1():
background(1, 1, 1)
tint(0, 0, 1)
text('You win!', font_size=32, x=self.size.w / 2, y=self.size.h / 2, alignment=5)
text('Play again?', font_size=32, x=self.size.w / 2, y=self.size.h / 2 - 50, alignment=5)
image('Typicons48_Thumbs_Up', self.size.w / 2 - 24, 0)
for touch in self.touches.values():
if self.size.w / 2 - 24 < touch.location.x < self.size.w / 2 + 24 and 0 < touch.location.y < 48:
global level
level = 1
self.y = self.size.h * 0.5
self.x = self.size.w * 0.5
def leveln2():
background(1, 1, 1)
tint(0, 0, 1)
text('You lose.', font_size=32, x=self.size.w / 2, y=self.size.h / 2, alignment=5)
text('Play again?', font_size=32, x=self.size.w / 2, y=self.size.h / 2 - 50, alignment=5)
image('Typicons48_Thumbs_Up', self.size.w / 2 - 24, 0)
for touch in self.touches.values():
if self.size.w / 2 - 24 < touch.location.x < self.size.w / 2 + 24 and 0 < touch.location.y < 48:
global level
level = 1
self.y = self.size.h * 0.5
self.x = self.size.w * 0.5
if level == 0:
level0()
elif level == 1:
level1()
elif level == 2:
level2()
elif level == 3:
level3()
elif level == 4:
level4()
elif level == 5:
level5()
elif level == 6:
level6()
elif level == -1:
leveln1()
elif level == -2:
leveln2()
else:
sys.exit()
run(velocity_run(), PORTRAIT)
</PRE> -
Please use <i><PRE> put code here </PRE></i> when posting code
It will make the code more readable like this:
<PRE>"example code"
for i in xrange(5):
print i</PRE> -
@Sebastion Thanks! I couldn't figure out how do do that. Any suggestions in how to fix my problem are welcome.
-
I would suggest that you create the level functions <i>outside</i> of the draw function, and rather call them in the draw function when needed. Because now, you create the same functions over and over when each frame is drawn.
When dealing with global variables inside functions, I usually do something like this: <PRE>level = 0
def level1():
global level
# do whatever you want the function to do# change the global level variable if condition is True if condition: level = 1
</PRE>
In your case, you can probably just change the <I>level</i> variable to <I>self.level</i> instead, thus eliminating the need to use global variables. -
Agreed...
<li>Remove all lines that say 'global level'.</li>
<li>Change all instances of 'level =' to 'self.level ='.</li>You should be good to go.
Of course, Sebastian's suggestion to create the level functions outside of draw() is good advise.
-
@Sebastion, @ccc Thanks a lot! Using <PRE>self.level = 1</PRE> instead of <PRE>global level
level = 1</PRE> worked perfectly.