Last active
October 16, 2017 19:17
-
-
Save bjucha81/c4d369fc53e8a31ede218a5476116fa2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from scene import * | |
from math import sin, cos, pi | |
import random, ui, time, sound | |
A = Action | |
class Boss (SpriteNode): | |
def __init__(self, **kwargs): | |
SpriteNode.__init__(self, 'spc:UFOBlue', **kwargs) | |
self.scale = 3 | |
self.destroyed = False | |
class Enemy (SpriteNode): | |
def __init__(self, **kwargs): | |
img = random.choice(['spc:EnemyBlack1', 'spc:EnemyRed1', 'spc:EnemyBlue1' ]) | |
SpriteNode.__init__(self, img, **kwargs) | |
self.destroyed = False | |
class SuperEnemy (SpriteNode): | |
def __init__(self, **kwargs): | |
SpriteNode.__init__(self, 'spc:EnemyBlack4', **kwargs) | |
self.scale = 1.5 | |
self.destroyed = False | |
class PowerUp (SpriteNode): | |
def __init__(self, **kwargs): | |
SpriteNode.__init__(self, 'spc:PowerupBlueBolt', **kwargs) | |
class Boss2 (SpriteNode): | |
def __init__(self, **kwargs): | |
SpriteNode.__init__(self, 'spc:EnemyBlue5', **kwargs) | |
self.scale = 3 | |
self.destroyed = False | |
class Gamefield (Scene): | |
def setup (self): | |
self.items = [] | |
self.greenbombs = [] | |
self.bossfires = [] | |
self.bossfires2 = [] | |
self.background_color = '#0c1037' | |
score_font = ('Futura', 20) | |
self.distance_label = LabelNode('Distance to boss', score_font, parent=self) | |
self.counter_label = LabelNode('Distance to boss', score_font, parent=self) | |
self.lasers = [] | |
self.health = 20 | |
self.health2 = 25 | |
self.distance_label.z_position = +1 | |
self.distance_label.position = (self.size.w/3.9, | |
self.size.h - 20) | |
self.distance = 2000 | |
self.counter = 10 | |
self.counter_label.z_position = +1 | |
self.counter_label.position = (self.size.w/2.2, | |
self.size.h - 20) | |
self.blasers = [] | |
self.powers = [] | |
self.mlasers = [] | |
self.redo = False | |
self.tdown = 0 | |
self.bosstimer = 0 | |
self.score = 0 | |
self.score_label = LabelNode('Score', score_font, parent=self) | |
self.score_label.position = (740,40) | |
self.size.h - 20 | |
self.ship = SpriteNode('spc:PlayerShip3Red') | |
self.ship.position = (100,40) | |
self.add_child(self.ship) | |
def touch_began(self, touch): | |
x, y = touch.location | |
move_action = Action.move_to(x, y , 0.8, TIMING_SINODIAL) | |
self.ship.run_action(move_action) | |
self.shoot_laser() | |
def check_laser_collisions(self): | |
for laser in list(self.lasers): | |
if not laser.parent: | |
self.lasers.remove(laser) | |
continue | |
for item in self.items: | |
if not isinstance(item, Enemy): | |
continue | |
if item.destroyed: | |
continue | |
if laser.position in item.frame: | |
#sound.play_effect('arcade:Explosion_4', 0.05, 1.0 + 0.5) | |
self.enemy_smash(item) | |
self.lasers.remove(laser) | |
laser.remove_from_parent() | |
break | |
def enemy_smash(self, enemy): | |
enemy.destroyed = True | |
enemy.remove_from_parent() | |
self.score += 1 | |
self.score_label.text = str(self.score) | |
debree = SpriteNode('spc:PlayerShip1Damage1', parent=self) | |
debree.position = enemy.position | |
debree.z_position = - 1 | |
debree.run_action(A.move_by(10, 10, 1.6, TIMING_EASE_OUT)) | |
debree.run_action(A.sequence(A.wait(1), A.remove())) | |
def enemy_hit(self, super_enemy): | |
super_enemy.remove_from_parent() | |
super_enemy.destroyed = True | |
self.score += 2 | |
self.score_label.text = str(self.score) | |
debree = SpriteNode('spc:PlayerShip3Damage1', parent=self) | |
debree.position = super_enemy.position | |
debree.z_position = - 1 | |
debree.run_action(A.move_by(10, 10, 1.6, TIMING_EASE_OUT)) | |
debree.run_action(A.sequence(A.wait(1), A.remove())) | |
def update(self): | |
self.evil_laser_hit() | |
self.check_item_collisions() | |
if random.random() < 0.009: | |
self.spawn_item() | |
self.check_laser_collisions() | |
self.check_laser_hit() | |
self.check_laser_hit_boss() | |
self.boss_laser_hit() | |
self.check_laser_hit_boss2() | |
if random.random() < 0.004: | |
self.spawn_enemy() | |
if random.random() < 0.002: | |
self.spawn_powerup() | |
self.powerup_collision() | |
self.multilaser_hit() | |
self.distance -= 1 | |
self.distance_label.text = str(self.distance) | |
if self.distance == 0: | |
score_font = ('Futura', 50) | |
self.distance_label.text = 'Boss appears!' | |
if self.bosstimer == 0: | |
self.spawn_boss() | |
else: | |
self.spawn_boss2() | |
if self.distance <= 0: | |
self.distance_label.text = 'Boss here!' | |
if self.redo == True: | |
#self.counter = 10 | |
self.counter -= 1 | |
if self.counter <= 0: | |
self.multi_laser() | |
self.laser_multi() | |
self.counter = 10 | |
self.tdown += 1 | |
if self.tdown == 10: | |
self.redo = False | |
self.tdown = 0 | |
self.boss2_laser_hit() | |
def spawn_boss(self): | |
self.background_color = '#4e1805' | |
boss = Boss(parent=self) | |
boss.position = (random.uniform(10, self.size.w-10), self.size.h + 30) | |
h = random.uniform(2.0, 7.0) | |
actions = [A.move_to(random.uniform(0, self.size.w), 700, h)] | |
boss.run_action(A.sequence(actions)) | |
count = 10 | |
while count != 0: | |
Action.wait(2) | |
self.items.append(boss) | |
bossfires = SpriteNode('spc:BoltBronze', parent=self) | |
bossfires.position = boss.position + (-50, 30) | |
bossfires.z_position = -1 | |
b = random.uniform(10.0, 2500) | |
actions = [A.move_to(b, 100, 2 * 2), A.remove()] | |
bossfires.run_action(A.sequence(actions)) | |
self.bossfires.append(bossfires) | |
Action.wait(2) | |
count = count - 1 | |
def check_laser_hit_boss(self): | |
for laser in list(self.lasers): | |
if not laser.parent: | |
self.lasers.remove(laser) | |
continue | |
for item in self.items: | |
if not isinstance(item, Boss): | |
continue | |
if item.destroyed: | |
continue | |
if laser.position in item.frame: | |
self.health = self.health - 1 | |
self.move_boss(item) | |
self.kill_boss(item) | |
self.lasers.remove(laser) | |
laser.remove_from_parent() | |
break | |
def boss_laser_hit(self): | |
for bossfire in list(self.bossfires): | |
distance = abs(bossfire.position - self.ship.frame.center()) | |
if bossfire.parent == None: | |
continue | |
if distance < 50: | |
exit() | |
def move_boss(self, boss): | |
boss.run_action(A.move_by(0, -50, 1.6, TIMING_LINEAR)) | |
count = 2 | |
while count != 0: | |
Action.wait(2) | |
self.items.append(boss) | |
bossfires = SpriteNode('spc:BoltBronze', parent=self) | |
bossfires.position = boss.position + (-50, 30) | |
bossfires.z_position = -1 | |
b = random.uniform(10.0, 2500) | |
actions = [A.move_to(b, 100, 2 * 2), A.remove()] | |
bossfires.run_action(A.sequence(actions)) | |
self.bossfires.append(bossfires) | |
Action.wait(2) | |
count = count - 1 | |
def kill_boss(self, boss): | |
if self.health == 0: | |
#sound.play_effect('arcade:Explosion_5', 0.9, 1.0 + 0.5) | |
self.background_color = '#161d65' | |
boss.destroyed = True | |
self.score += 100 | |
self.score_label.text = str(self.score) | |
self.distance_label.text = 'Boss destroyed!' | |
boss.remove_from_parent() | |
debree = SpriteNode('shp:Explosion00', parent=self) | |
debree.position = boss.position | |
debree.z_position = - 1 | |
debree.run_action(A.move_by(10, 10, 1.6, TIMING_EASE_OUT)) | |
debree.run_action(A.sequence(A.wait(1), A.remove())) | |
self.bosstimer = 1 | |
self.distance = 2000 | |
self.health = 10 | |
else: | |
boss.destroyed = False | |
def spawn_boss2(self): | |
self.background_color = '#25597b' | |
boss2 = Boss2(parent=self) | |
boss2.position = (self.size.w/2.2, | |
self.size.h - 100) | |
h = random.uniform(2.0, 7.0) | |
Action.wait(2) | |
self.items.append(boss2) | |
bossfires2 = SpriteNode('spc:LaserBlue13', parent=self) | |
bossfires2.position = boss2.position + (-50, 30) | |
bossfires2.z_position = -1 | |
b = random.uniform(10.0, 25) | |
x,y = self.ship.position | |
actions = [A.move_to(x,y, 1.2 * 2), A.remove()] | |
bossfires2.run_action(A.sequence(actions)) | |
self.bossfires2.append(bossfires2) | |
def update(): | |
self.items.append(boss2) | |
bossfires2 = SpriteNode('spc:LaserBlue16', parent=self) | |
bossfires2.position = boss2.position + (-50, 30) | |
bossfires2.z_position = -1 | |
b = random.uniform(10.0, 25) | |
x,y = self.ship.position | |
actions = [A.move_to(x,y, 2 * 2), A.remove()] | |
bossfires2.run_action(A.sequence(actions)) | |
self.bossfires2.append(bossfires2) | |
def check_laser_hit_boss2(self): | |
for laser in list(self.lasers): | |
if not laser.parent: | |
self.lasers.remove(laser) | |
continue | |
for item in self.items: | |
if not isinstance(item, Boss2): | |
continue | |
if item.destroyed: | |
continue | |
if laser.position in item.frame: | |
self.health2 = self.health2 - 1 | |
self.boss2_fire(item) | |
self.boss2_fire2(item) | |
self.kill_boss2(item) | |
self.lasers.remove(laser) | |
laser.remove_from_parent() | |
break | |
def boss2_fire(self, boss2): | |
self.items.append(boss2) | |
bossfires2 = SpriteNode('spc:LaserBlue13', parent=self) | |
bossfires2.position = boss2.position + (-50, 30) | |
bossfires2.z_position = -1 | |
b = random.uniform(10.0, 25) | |
x,y = self.ship.position | |
actions = [A.move_to(x, y , 2 * 2), A.remove()] | |
bossfires2.run_action(A.sequence(actions)) | |
self.bossfires2.append(bossfires2) | |
def boss2_fire2(self, boss2): | |
self.items.append(boss2) | |
bossfires2 = SpriteNode('spc:LaserGreen13', parent=self) | |
bossfires2.position = boss2.position + (-20,20) | |
bossfires2.z_position = -1 | |
b = random.uniform(10.0, 25) | |
x,y = self.ship.position | |
actions = [A.move_to(x, b , 2 * 2), A.remove()] | |
bossfires2.run_action(A.sequence(actions)) | |
self.bossfires2.append(bossfires2) | |
def kill_boss2(self, boss2): | |
if self.health2 == 0: | |
#sound.play_effect('arcade:Explosion_5', 0.9, 1.0 + 0.5) | |
self.background_color = '#161d65' | |
boss2.destroyed = True | |
self.score += 100 | |
self.score_label.text = str(self.score) | |
self.distance_label.text = 'Boss destroyed!' | |
boss2.remove_from_parent() | |
debree = SpriteNode('shp:Explosion08', parent=self) | |
debree.position = boss2.position | |
debree.z_position = - 1 | |
debree.run_action(A.move_by(10, 10, 1.6, TIMING_EASE_OUT)) | |
debree.run_action(A.sequence(A.wait(1), A.remove())) | |
self.bosstimer = 2 | |
self.distance = 2000 | |
else: | |
boss2.destroyed = False | |
def boss2_laser_hit(self): | |
for bossfire2 in list(self.bossfires2): | |
distance = abs(bossfire2.position - self.ship.frame.center()) | |
if bossfire2.parent == None: | |
continue | |
if distance < 50: | |
exit() | |
def down_count(self): | |
self.multi_laser() | |
self.laser_multi() | |
def spawn_enemy(self): | |
super_enemy = SuperEnemy(parent=self) | |
super_enemy.position = (random.uniform(10, self.size.w-10), self.size.h + 30) | |
h = random.uniform(2.0, 19.0) | |
actions = [A.move_to(random.uniform(0, self.size.w), -100, h), A.remove()] | |
super_enemy.run_action(A.sequence(actions)) | |
self.items.append(super_enemy) | |
blasers = SpriteNode('spc:LaserBlue11', parent=self) | |
blasers.position = super_enemy.position + (0, 30) | |
blasers.z_position = -1 | |
b = random.uniform(10.0, 250) | |
actions = [A.move_to(b, 100, 2 * 5), A.remove()] | |
blasers.run_action(A.sequence(actions)) | |
self.blasers.append(blasers) | |
def check_laser_hit(self): | |
for laser in list(self.lasers): | |
if not laser.parent: | |
self.lasers.remove(laser) | |
continue | |
for item in self.items: | |
if not isinstance(item, SuperEnemy): | |
continue | |
if item.destroyed: | |
continue | |
if laser.position in item.frame: | |
self.enemy_hit(item) | |
self.lasers.remove(laser) | |
laser.remove_from_parent() | |
break | |
def spawn_item(self): | |
enemy = Enemy(parent=self) | |
enemy.position = (random.uniform(10, self.size.w-10), self.size.h + 30) | |
d = random.uniform(2.0, 19.0) | |
actions = [A.move_by(0, -(self.size.h + 60), d), A.remove()] | |
enemy.run_action(A.sequence(actions)) | |
self.items.append(enemy) | |
def check_item_collisions(self): | |
for item in list(self.items): | |
distance = abs(item.position - self.ship.frame.center()) | |
if item.parent == None: | |
continue | |
if distance < 60: | |
exit() | |
def evil_laser_hit(self): | |
for blaser in list(self.blasers): | |
distance = abs(blaser.position - self.ship.frame.center()) | |
if blaser.parent == None: | |
continue | |
if distance < 50: | |
exit() | |
def shoot_laser(self): | |
lasers = SpriteNode('spc:LaserRed10', parent=self) | |
lasers.position = self.ship.position + (0, 30) | |
lasers.z_position = -1 | |
actions = [A.move_by(0, self.size.h, 1.3 * self.speed), A.remove()] | |
lasers.run_action(A.sequence(actions)) | |
self.lasers.append(lasers) | |
def spawn_powerup(self): | |
power_up = PowerUp(parent=self) | |
power_up.position = (random.uniform(10, self.size.w-10), self.size.h + 40) | |
p = random.uniform(2.0, 22.0) | |
actions = [A.move_to(random.uniform(0, self.size.w), -100, p), A.remove()] | |
power_up.run_action(A.sequence(actions)) | |
power_up.run_action(A.move_by(10, 10, 1.6, TIMING_EASE_OUT)) | |
power_up.run_action(A.sequence(A.wait(5), A.remove())) | |
self.powers.append(power_up) | |
def powerup_collision(self): | |
for power in list(self.powers): | |
distance = abs(power.position - self.ship.frame.center()) | |
if power.parent == None: | |
continue | |
if distance < 60: | |
self.redo = True | |
power.remove_from_parent() | |
def multi_laser(self): | |
mlasers = SpriteNode('spc:LaserGreen13', parent=self) | |
mlasers.position = self.ship.position + (10, 30) | |
mlasers.z_position = -1 | |
actions = [A.move_by(500, self.size.h, 1.3 * self.speed), A.remove()] | |
mlasers.run_action(A.sequence(actions)) | |
self.mlasers.append(mlasers) | |
self.counter = self.counter - 1 | |
def laser_multi(self): | |
mlasers = SpriteNode('spc:LaserGreen13', parent=self) | |
mlasers.position = self.ship.position + (10, 30) | |
mlasers.z_position = -1 | |
actions = [A.move_by(-500, self.size.h, 1.3 * self.speed), A.remove()] | |
mlasers.run_action(A.sequence(actions)) | |
self.mlasers.append(mlasers) | |
def multilaser_hit(self): | |
for mlaser in list(self.mlasers): | |
if not mlaser.parent: | |
continue | |
for item in self.items: | |
if not isinstance(item, SuperEnemy): | |
continue | |
if item.destroyed: | |
continue | |
if mlaser.position in item.frame: | |
self.enemy_hit(item) | |
self.mlasers.remove(mlaser) | |
mlaser.remove_from_parent() | |
for mlaser in list(self.mlasers): | |
if not mlaser.parent: | |
self.mlasers.remove(mlaser) | |
continue | |
for item in self.items: | |
if not isinstance(item, Enemy): | |
continue | |
if item.destroyed: | |
continue | |
if mlaser.position in item.frame: | |
self.enemy_smash(item) | |
self.mlasers.remove(mlaser) | |
mlaser.remove_from_parent() | |
run(Gamefield(), PORTRAIT, show_fps=True) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment