In our gem catcher game, we only have a single gem at a time and it returns to the top everytime we catch it. In our ninja runner game, we are going to have multiple obstacles appear on screen at the same time. To do so, we are going to make use of lists.
First, let's add an empty list called
obstacles and a integer variable
obstacles =  obstacles_timeout = 0
Now in our
update() function, we are going to increase out timeout by 1 each time.
obstacles_timeout += 1
Next, if the timeout is greater than 50, we'll add in an obstacle and reset the timeout to zero.
if obstacles_timeout > 50: actor = Actor('cactus') actor.x = 850 actor.y = 430 obstacles.append(actor) obstacles_timeout = 0
The only thing new here is
obstacles.append(actor). This adds
actor to the
IMPORTANT: You'll need to move the
cactus image into your
images folder first! If you decide to use a different image, change the image name accordingly.
Now to make the obstacles move across the screen...
for actor in obstacles: actor.x -= 8
This will go through the entire obstacles list and reduce the x position for obstacle. Reducing x will make the obstacle move to the left.
Finally, we need to draw the obstacles on screen. In the
draw() function, add...
for actor in obstacles: actor.draw()
Your program should now look like this...
import pgzrun from pgzhelper import * WIDTH=800 HEIGHT=600 runner = Actor('run__000') run_images = ['run__000', 'run__001', 'run__002', 'run__003', 'run__004', 'run__005', 'run__006', 'run__007', 'run__008', 'run__009'] runner.images = run_images runner.x = 100 runner.y = 400 velocity_y = 0 gravity = 1 obstacles =  obstacles_timeout = 0 def update(): global velocity_y, obstacles_timeout runner.next_image() obstacles_timeout += 1 if obstacles_timeout > 50: actor = Actor('cactus') actor.x = 850 actor.y = 430 obstacles.append(actor) obstacles_timeout = 0 for actor in obstacles: actor.x -= 8 if keyboard.up: velocity_y = -15 runner.y += velocity_y velocity_y += gravity if runner.y > 400: velocity_y = 0 runner.y = 400 def draw(): screen.draw.filled_rect(Rect(0,0,800,400), (163, 232, 254)) screen.draw.filled_rect(Rect(0,400,800,200), (88, 242, 152)) runner.draw() for actor in obstacles: actor.draw() pgzrun.go() # Must be last line