I am using the scene module to make a game. When I hit a button, I have a missile moving up the screen. When it goes off the screen, I would like to remove it from my array and memory, to clear up memory and since in the game the missile is gone.
I have tried many things and it does not seem to remove it right away, and then tries to remove more than one. Not sure what I am doing wrong. At line 80.
Here is the Gist: https://gist.github.com/cb0ac079b7351e2b59e980237a546152
# Created by: Mr. Coxall
# Created on: Sep 2016
# Created for: ICS3U
# This program is the first file in a multi-scene game template
# This template is meant to be used with the Xcode
from scene import *
import ui
from numpy import random
from copy import deepcopy
class FirstScene(Scene):
def setup(self):
# this method is called, when user moves to this scene
self.size_of_screen = deepcopy(self.size)
self.center_of_screen = deepcopy(self.size/2)
self.left_button_down = False
self.right_button_down = False
self.ship_move_speed = 40.0
self.missiles = []
self.aliens = []
self.alien_attack_rate = 1
self.alien_attack_speed = 20.0
# add blue background color
self.background = SpriteNode(position = self.size / 2,
color = (0.61, 0.78, 0.87),
parent = self,
size = self.size)
spaceship_position = deepcopy(self.center_of_screen)
spaceship_position.y = 100
self.spaceship = SpriteNode('spc:PlayerShip1Orange',
parent = self,
position = spaceship_position)
left_button_position = deepcopy(self.center_of_screen)
left_button_position.x = 75
left_button_position.y = 75
self.left_button = SpriteNode('iob:arrow_left_a_256',
parent = self,
scale = 0.5,
position = left_button_position,
alpha = 0.5)
right_button_position = deepcopy(self.center_of_screen)
right_button_position.x = 200
right_button_position.y = 75
self.right_button = SpriteNode('iob:arrow_right_a_256',
parent = self,
scale = 0.5,
position = right_button_position,
alpha = 0.5)
fire_button_position = deepcopy(self.size)
fire_button_position.x = fire_button_position.x - 75
fire_button_position.y = 75
self.fire_button = SpriteNode('iob:disc_256',
parent = self,
scale = 0.5,
position = fire_button_position,
alpha = 0.5)
def update(self):
# this method is called, hopefully, 60 times a second
# move spaceship if button down
if self.left_button_down == True:
spaceshipMove = Action.move_by(-1*self.ship_move_speed,
0.0,
0.1)
self.spaceship.run_action(spaceshipMove)
if self.right_button_down == True:
spaceshipMove = Action.move_by(self.ship_move_speed,
0.0,
0.1)
self.spaceship.run_action(spaceshipMove)
# check every update if a missile is off screen
print('A: ' + str(range(len(self.missiles))))
for missile_index in range(len(self.missiles)):
if self.missiles[missile_index].position.y > self.size_of_screen.y - 100:
#self.missiles[missile_index].remove_all_actions()
#self.missiles[missile_index].remove_from_parent()
print('B: ' + str(missile_index) + ' ' + str(len(self.missiles)))
#print(missile_index)
self.missiles.remove(missile_index)
#print('one success')
break
#print(len(self.missiles))
def touch_began(self, touch):
# this method is called, when user touches the screen
# check if left or right button is down
if self.left_button.frame.contains_point(touch.location):
self.left_button_down = True
if self.right_button.frame.contains_point(touch.location):
self.right_button_down = True
def touch_moved(self, touch):
# this method is called, when user moves a finger around on the screen
pass
def touch_ended(self, touch):
# this method is called, when user releases a finger from the screen
# if I removed my finger, then no matter what spaceship
# should not be moving any more
self.left_button_down = False
self.right_button_down = False
# if fire button pressed, create a new missile
if self.fire_button.frame.contains_point(touch.location):
self.create_new_missile()
def create_new_missile(self):
# when the user hits the fire button
missile_start_position = deepcopy(self.spaceship.position)
missile_start_position.y = 100
missile_end_position = deepcopy(self.size)
missile_end_position.x = missile_start_position.x
self.missiles.append(SpriteNode('spc:Fire1',
position = missile_start_position,
parent = self))
# make missile move forward
missileMoveAction = Action.move_to(missile_end_position.x,
missile_end_position.y + 100,
1.0)
self.missiles[len(self.missiles)-1].run_action(missileMoveAction)
# ..use when deploying app for Xcode and the App Store
main_view = ui.View()
scene_view = SceneView(frame = main_view.bounds, flex = 'WH')
main_view.add_subview(scene_view)
scene_view.scene = FirstScene()
main_view.present(hide_title_bar = True, animated = False)
~~~
Thanks