Advertisement
Guest User

Untitled

a guest
Sep 17th, 2020 (edited)
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 24.13 KB | None | 0 0
  1. from __future__ import division
  2. from collections import namedtuple
  3. import json
  4. import math
  5. from random import randint, random
  6.  
  7. from kivy import platform
  8. from kivy.app import App
  9. from kivy.base import EventLoop
  10. from kivy.clock import Clock
  11. from kivy.config import Config
  12.  
  13. Config.set('input', 'mouse', 'mouse,disable_multitouch')
  14.  
  15. from kivy.core.audio import SoundLoader
  16. from kivy.core.image import Image
  17. from kivy.core.window import Window
  18. from kivy.graphics import Mesh
  19. from kivy.graphics.instructions import RenderContext
  20. from kivy.uix.widget import Widget
  21. from kivy.utils import get_color_from_hex
  22. from kivy.core.text import LabelBase
  23. from kivy.uix.label import Label
  24.  
  25. from kivy.properties import ListProperty
  26.  
  27. from kivy.lang import Builder
  28. import kivy.uix.screenmanager
  29. from kivy.uix.screenmanager import ScreenManager, Screen
  30.  
  31. Builder.load_string("""
  32. <MenuScreen>:
  33.    BoxLayout:
  34.        Button:
  35.            text: 'Go to main screen'
  36.            on_press: root.manager.current = 'main'
  37. <MainScreen>:
  38.    Game:
  39.        id: game
  40.    BoxLayout:
  41.        Button:
  42.            text: 'Go to the second screen'
  43.            on_press: root.manager.current = 'second'
  44.            size_hint: None, None
  45.            size: self.texture_size
  46.    FloatLayout:
  47.        ShootProgressBar:
  48.            id: powerbar
  49.            pos_hint: {'x': 0.035, 'y': 0.9}
  50.            size_hint: (0.25, 0.1)
  51.            max:10
  52.        LifesProgressBar:
  53.            canvas:
  54.                Color:
  55.                    rgba: 1, 0, 0, 1
  56.            id: lifesbar
  57.            pos_hint: {'x': 0.7, 'y': 0.92}
  58.            size_hint: (0.25, 0.1)
  59.            max:3
  60.            value:3
  61.        Image:
  62.            id: ethereum
  63.            size_hint: (0.04, 0.04)
  64.            pos_hint: {'x': 0.002, 'y': 0.93}
  65.            allow_stretch: True
  66.            source: "ethereum.png"
  67.        Image:
  68.            id: lifes_img
  69.            size_hint: (0.04, 0.04)
  70.            pos_hint: {'x': 0.952, 'y': 0.93}
  71.            allow_stretch: True
  72.            source: "lifes.png"
  73.            
  74. <SecondScreen>:
  75.    BoxLayout:
  76.        Button:
  77.            text: 'Back to menu'
  78.            on_press: root.manager.current = 'menu'
  79. <-ShootProgressBar@ProgressBar>:
  80.    canvas:
  81.        Color:
  82.            rgb: 1, 1, 1
  83.        BorderImage:
  84.            border: (12, 12, 12, 12)
  85.            pos: self.x, self.center_y - 3
  86.            size: self.width, 24
  87.            source : 'black_bg.png'
  88.        BorderImage:
  89.            border: [int(min(self.width * (self.value / float(self.max)) if self.max else 0, 12))] * 4
  90.            pos: self.x, self.center_y - 12
  91.            size: self.width * (self.value / float(self.max)) if self.max else 0, 24
  92.            source : 'blue_fg.png'
  93.            
  94. <-LifesProgressBar@ProgressBar>:
  95.    canvas:
  96.        Color:
  97.            rgb: 1, 1, 1
  98.        BorderImage:
  99.            border: (12, 12, 12, 12)
  100.            pos: self.x, self.center_y - 14
  101.            size: self.width, 24
  102.            source: 'black_bg.png'
  103.        BorderImage:
  104.            border: [int(min(self.width * (self.value / float(self.max)) if self.max else 0, 12))] * 4
  105.            pos: self.x, self.center_y - 12
  106.            size: self.width * (self.value / float(self.max)) if self.max else 0, 24
  107.            source: 'green2_fg.png'
  108.            
  109. <ColourScreen>:
  110.    BoxLayout:
  111.        orientation: 'vertical'
  112.        Label:
  113.            text: 'colour {:.2},{:.2},{:.2} screen'.format(*root.colour[:3])
  114.            font_size: 30
  115.        Widget:
  116.            canvas:
  117.                Color:
  118.                    rgba: root.colour
  119.                Ellipse:
  120.                    pos: self.pos
  121.                    size: self.size
  122.        BoxLayout:
  123.            Button:
  124.                text: 'goto first screen'
  125.                font_size: 30
  126.                on_release: app.root.current = 'first'
  127.            Button:
  128.                text: 'get random colour screen'
  129.                font_size: 30
  130.                on_release: app.root.new_colour_screen()
  131. """)
  132.  
  133. # Declare both screens
  134. UVMapping = namedtuple('UVMapping', 'u0 v0 u1 v1 su sv')
  135. def load_atlas(atlas_name):
  136.     with open(atlas_name, 'rb') as f:
  137.         atlas = json.loads(f.read().decode('utf-8'))
  138.    
  139.     tex_name, mapping = atlas.popitem()
  140.     tex = Image(tex_name).texture
  141.     tex_width, tex_height = tex.size
  142.    
  143.     uvmap = {}
  144.     for name, val in mapping.items():
  145.         x0, y0, w, h = val
  146.         x1, y1 = x0 + w, y0 + h
  147.         uvmap[name] = UVMapping(
  148.             x0 / tex_width, 1 - y1 / tex_height,
  149.             x1 / tex_width, 1 - y0 / tex_height,
  150.             0.5 * w, 0.5 * h)
  151.    
  152.     return tex, uvmap
  153. class MenuScreen(Screen):
  154.     pass
  155.  
  156. class MainScreen(Screen):
  157.  
  158.    
  159.    
  160.     class Particle:
  161.         x = 0
  162.         y = 0
  163.         size = 1
  164.    
  165.         def __init__(self, parent, i):
  166.             self.parent = parent
  167.             self.vsize = parent.vsize
  168.             self.base_i = 4 * i * self.vsize
  169.             self.reset(created=True)
  170.    
  171.         def update(self):
  172.             for i in range(self.base_i,
  173.                         self.base_i + 4 * self.vsize,
  174.                         self.vsize):
  175.                 self.parent.vertices[i:i + 3] = (
  176.                     self.x, self.y, self.size)
  177.    
  178.         def reset(self, created=False):
  179.             raise NotImplementedError()
  180.    
  181.         def advance(self, nap):
  182.             raise NotImplementedError()
  183.    
  184.    
  185.     class PSWidget(Widget):
  186.         indices = []
  187.         vertices = []
  188.         particles = []
  189.         killall = False
  190.    
  191.         def __init__(self, **kwargs):
  192.             Widget.__init__(self, **kwargs)
  193.             self.canvas = RenderContext(use_parent_projection=True)
  194.             self.canvas.shader.source = self.glsl
  195.    
  196.             self.vfmt = (
  197.                 (b'vCenter', 2, 'float'),
  198.                 (b'vScale', 1, 'float'),
  199.                 (b'vPosition', 2, 'float'),
  200.                 (b'vTexCoords0', 2, 'float'),
  201.             )
  202.    
  203.             self.vsize = sum(attr[1] for attr in self.vfmt)
  204.    
  205.             self.texture, self.uvmap = load_atlas(self.atlas)
  206.    
  207.         def make_particles(self, Cls, num):
  208.             count = len(self.particles)
  209.             uv = self.uvmap[Cls.tex_name]
  210.    
  211.             for i in range(count, count + num):
  212.                 j = 4 * i
  213.                 self.indices.extend((
  214.                     j, j + 1, j + 2, j + 2, j + 3, j))
  215.    
  216.                 self.vertices.extend((
  217.                     0, 0, 1, -uv.su, -uv.sv, uv.u0, uv.v1,
  218.                     0, 0, 1,  uv.su, -uv.sv, uv.u1, uv.v1,
  219.                     0, 0, 1,  uv.su,  uv.sv, uv.u1, uv.v0,
  220.                     0, 0, 1, -uv.su,  uv.sv, uv.u0, uv.v0,
  221.                 ))
  222.    
  223.                 p = Cls(self, i)
  224.                 self.particles.append(p)
  225.    
  226.         def update_glsl(self, nap):
  227.             for p in self.particles:
  228.                 if isinstance(p, Enemy) and p.active:
  229.                     if self.killall:
  230.                         p.reset()    # kill this enemy
  231.                 p.advance(nap)
  232.                 p.update()
  233.    
  234.             self.canvas.clear()
  235.    
  236.             with self.canvas:
  237.                 Mesh(fmt=self.vfmt, mode='triangles',
  238.                     indices=self.indices, vertices=self.vertices,
  239.                     texture=self.texture)
  240.    
  241.    
  242.         def ennemy_touch(self):
  243.             if math.hypot(self.parent.player_x - self.x,
  244.                         self.parent.player_y - self.y) < 60:
  245.                 return True
  246.                
  247.         def ennemy_shoot(self):
  248.             for b in self.parent.bullets:
  249.                 if b.active:
  250.                     if math.hypot(b.x - self.x, b.y - self.y) < 30:
  251.                         return True
  252.     class MultiAudio:
  253.         _next = 0
  254.    
  255.         def __init__(self, filename, count):
  256.             self.buf = [SoundLoader.load(filename)
  257.                         for i in range(count)]
  258.    
  259.         def play(self):
  260.             self.buf[self._next].play()
  261.             self._next = (self._next + 1) % len(self.buf)
  262.    
  263.     snd_hit = MultiAudio('hit.wav', 5)
  264.     snd_laser = MultiAudio('laser.wav', 10)
  265.    
  266.    
  267.     class Star(Particle):
  268.         plane = 1
  269.         tex_name = 'star'
  270.        
  271.         def reset(self, created=False):
  272.             self.plane = randint(1, 3)
  273.    
  274.             if created:
  275.                 self.x = random() * self.parent.width
  276.             else:
  277.                 self.x = self.parent.width
  278.    
  279.             self.y = random() * self.parent.height
  280.             self.size = 0.1 * self.plane
  281.    
  282.         def advance(self, nap):
  283.             self.x -= 20 * self.plane * nap
  284.             if self.x < 0:
  285.                 self.reset()
  286.    
  287.    
  288.     class Player(Particle):
  289.         tex_name = 'player'
  290.    
  291.         def reset(self, created=False):
  292.             self.x = self.parent.player_x
  293.             self.y = self.parent.player_y
  294.    
  295.         advance = reset
  296.    
  297.    
  298.     class Trail(Particle):
  299.         tex_name = 'trail'
  300.    
  301.         def reset(self, created=False):
  302.             self.x = self.parent.player_x + randint(-30, -20)
  303.             self.y = self.parent.player_y + randint(-10, 10)
  304.    
  305.             if created:
  306.                 self.size = 0
  307.             else:
  308.                 self.size = random() + 0.6
  309.    
  310.         def advance(self, nap):
  311.             self.size -= nap
  312.             if self.size <= 0.1:
  313.                 self.reset()
  314.             else:
  315.                 self.x -= 120 * nap
  316.    
  317.    
  318.     class Bullet(Particle):
  319.         active = False
  320.         tex_name = 'bullet'
  321.    
  322.         def reset(self, created=False):
  323.             self.active = False
  324.             self.x = -100
  325.             self.y = -100
  326.    
  327.         def advance(self, nap):
  328.             if self.active:
  329.                 self.x += 250 * nap
  330.                 if self.x > self.parent.width:
  331.                     self.reset()
  332.    
  333.             elif (self.parent.firing and
  334.                 self.parent.fire_delay <= 0):
  335.                 snd_laser.play()
  336.    
  337.                 self.active = True
  338.                 self.x = self.parent.player_x + 40
  339.                 self.y = self.parent.player_y
  340.                 self.parent.fire_delay += 0.3333
  341.    
  342.    
  343.     class Enemy(Particle):
  344.         active = False
  345.         tex_name = 'ufo'
  346.         v = 0
  347.         shoot = False
  348.    
  349.         def reset(self, created=False):
  350.             self.active = False
  351.             self.x = -100
  352.             self.y = -100
  353.             self.v = 0
  354.            
  355.    
  356.         def advance(self, nap):
  357.             if self.active:
  358.                 if self.ennemy_touch():
  359.                     self.parent.lifes.value -= 1
  360.                    
  361.                 if self.ennemy_shoot():
  362.                     self.parent.power.value += 1
  363.                    
  364.                 if self.check_hit():
  365.                     snd_hit.play()
  366.                     self.x = -100
  367.                     self.y = -100
  368.                     return
  369.    
  370.                 self.x -= 200 * nap
  371.    
  372.                 if self.x < -50:
  373.                     if self.parent.power.value == 10:
  374.                         return
  375.                     else:
  376.                         self.reset()
  377.    
  378.                 self.y += self.v * nap
  379.                 if self.y <= 0:
  380.                     self.v = abs(self.v)
  381.                 elif self.y >= self.parent.height:
  382.                     self.v = -abs(self.v)
  383.    
  384.             elif self.parent.spawn_delay <= 0:
  385.                 self.active = True
  386.                 self.x = self.parent.width + 50
  387.                 self.y = self.parent.height * random()
  388.                 self.v = randint(-100, 100)
  389.                 self.parent.spawn_delay += 1
  390.    
  391.         def check_hit(self):
  392.             if math.hypot(self.parent.player_x - self.x,
  393.                         self.parent.player_y - self.y) < 60:
  394.                 return True
  395.    
  396.             for b in self.parent.bullets:
  397.                 if not b.active:
  398.                     continue
  399.    
  400.                 if math.hypot(b.x - self.x, b.y - self.y) < 30:
  401.                     b.reset()
  402.                     return True
  403.                    
  404.         def ennemy_touch(self):
  405.             if math.hypot(self.parent.player_x - self.x,
  406.                         self.parent.player_y - self.y) < 60:
  407.                 return True
  408.                
  409.         def ennemy_shoot(self):
  410.             for b in self.parent.bullets:
  411.                 if b.active:
  412.                     if math.hypot(b.x - self.x, b.y - self.y) < 30:
  413.                         return True
  414.            
  415.    
  416.     class Game(PSWidget):
  417.         glsl = 'game.glsl'
  418.         atlas = 'game.atlas'
  419.    
  420.         firing = False
  421.         fire_delay = 0
  422.         spawn_delay = 1
  423.    
  424.         use_mouse = platform not in ('ios', 'android')
  425.    
  426.         def initialize(self):
  427.             self.player_x, self.player_y = self.center
  428.    
  429.             self.make_particles(Star, 200)
  430.             self.make_particles(Trail, 200)
  431.             self.make_particles(Player, 1)
  432.             self.make_particles(Enemy, 5)
  433.             self.make_particles(Bullet, 25)
  434.    
  435.             self.bullets = self.particles[-25:]
  436.    
  437.         def update_glsl(self, nap):
  438.             if self.use_mouse:
  439.                 self.player_x, self.player_y = Window.mouse_pos
  440.    
  441.             if self.firing:
  442.                 self.fire_delay -= nap
  443.    
  444.             self.spawn_delay -= nap
  445.    
  446.             PSWidget.update_glsl(self, nap)
  447.    
  448.         def on_touch_down(self, touch):
  449.             self.player_x, self.player_y = touch.pos
  450.             self.firing = True
  451.             self.fire_delay = 0
  452.    
  453.         def on_touch_move(self, touch):
  454.             self.player_x, self.player_y = touch.pos
  455.    
  456.         def on_touch_up(self, touch):
  457.             self.firing = False
  458.  
  459. class SecondScreen(Screen):
  460.     UVMapping = namedtuple('UVMapping', 'u0 v0 u1 v1 su sv')
  461.    
  462.     def load_atlas(atlas_name):
  463.         with open(atlas_name, 'rb') as f:
  464.             atlas = json.loads(f.read().decode('utf-8'))
  465.    
  466.         tex_name, mapping = atlas.popitem()
  467.         tex = Image(tex_name).texture
  468.         tex_width, tex_height = tex.size
  469.    
  470.         uvmap = {}
  471.         for name, val in mapping.items():
  472.             x0, y0, w, h = val
  473.             x1, y1 = x0 + w, y0 + h
  474.             uvmap[name] = UVMapping(
  475.                 x0 / tex_width, 1 - y1 / tex_height,
  476.                 x1 / tex_width, 1 - y0 / tex_height,
  477.                 0.5 * w, 0.5 * h)
  478.    
  479.         return tex, uvmap
  480.    
  481.    
  482.     class Particle:
  483.         x = 0
  484.         y = 0
  485.         size = 1
  486.    
  487.         def __init__(self, parent, i):
  488.             self.parent = parent
  489.             self.vsize = parent.vsize
  490.             self.base_i = 4 * i * self.vsize
  491.             self.reset(created=True)
  492.    
  493.         def update(self):
  494.             for i in range(self.base_i,
  495.                         self.base_i + 4 * self.vsize,
  496.                         self.vsize):
  497.                 self.parent.vertices[i:i + 3] = (
  498.                     self.x, self.y, self.size)
  499.    
  500.         def reset(self, created=False):
  501.             raise NotImplementedError()
  502.    
  503.         def advance(self, nap):
  504.             raise NotImplementedError()
  505.    
  506.    
  507.     class PSWidget(Widget):
  508.         indices = []
  509.         vertices = []
  510.         particles = []
  511.         killall = False
  512.    
  513.         def __init__(self, **kwargs):
  514.             Widget.__init__(self, **kwargs)
  515.             self.canvas = RenderContext(use_parent_projection=True)
  516.             self.canvas.shader.source = self.glsl
  517.    
  518.             self.vfmt = (
  519.                 (b'vCenter', 2, 'float'),
  520.                 (b'vScale', 1, 'float'),
  521.                 (b'vPosition', 2, 'float'),
  522.                 (b'vTexCoords0', 2, 'float'),
  523.             )
  524.    
  525.             self.vsize = sum(attr[1] for attr in self.vfmt)
  526.    
  527.             self.texture, self.uvmap = load_atlas(self.atlas)
  528.    
  529.         def make_particles(self, Cls, num):
  530.             count = len(self.particles)
  531.             uv = self.uvmap[Cls.tex_name]
  532.    
  533.             for i in range(count, count + num):
  534.                 j = 4 * i
  535.                 self.indices.extend((
  536.                     j, j + 1, j + 2, j + 2, j + 3, j))
  537.    
  538.                 self.vertices.extend((
  539.                     0, 0, 1, -uv.su, -uv.sv, uv.u0, uv.v1,
  540.                     0, 0, 1,  uv.su, -uv.sv, uv.u1, uv.v1,
  541.                     0, 0, 1,  uv.su,  uv.sv, uv.u1, uv.v0,
  542.                     0, 0, 1, -uv.su,  uv.sv, uv.u0, uv.v0,
  543.                 ))
  544.    
  545.                 p = Cls(self, i)
  546.                 self.particles.append(p)
  547.    
  548.         def update_glsl(self, nap):
  549.             for p in self.particles:
  550.                 if isinstance(p, Enemy) and p.active:
  551.                     if self.killall:
  552.                         p.reset()    # kill this enemy
  553.                 p.advance(nap)
  554.                 p.update()
  555.    
  556.             self.canvas.clear()
  557.    
  558.             with self.canvas:
  559.                 Mesh(fmt=self.vfmt, mode='triangles',
  560.                     indices=self.indices, vertices=self.vertices,
  561.                     texture=self.texture)
  562.    
  563.    
  564.         def ennemy_touch(self):
  565.             if math.hypot(self.parent.player_x - self.x,
  566.                         self.parent.player_y - self.y) < 60:
  567.                 return True
  568.                
  569.         def ennemy_shoot(self):
  570.             for b in self.parent.bullets:
  571.                 if b.active:
  572.                     if math.hypot(b.x - self.x, b.y - self.y) < 30:
  573.                         return True
  574.     class MultiAudio:
  575.         _next = 0
  576.    
  577.         def __init__(self, filename, count):
  578.             self.buf = [SoundLoader.load(filename)
  579.                         for i in range(count)]
  580.    
  581.         def play(self):
  582.             self.buf[self._next].play()
  583.             self._next = (self._next + 1) % len(self.buf)
  584.    
  585.     snd_hit = MultiAudio('hit.wav', 5)
  586.     snd_laser = MultiAudio('laser.wav', 10)
  587.    
  588.    
  589.     class Star(Particle):
  590.         plane = 1
  591.         tex_name = 'star'
  592.        
  593.         def reset(self, created=False):
  594.             self.plane = randint(1, 3)
  595.    
  596.             if created:
  597.                 self.x = random() * self.parent.width
  598.             else:
  599.                 self.x = self.parent.width
  600.    
  601.             self.y = random() * self.parent.height
  602.             self.size = 0.1 * self.plane
  603.    
  604.         def advance(self, nap):
  605.             self.x -= 20 * self.plane * nap
  606.             if self.x < 0:
  607.                 self.reset()
  608.    
  609.    
  610.     class Player(Particle):
  611.         tex_name = 'player'
  612.    
  613.         def reset(self, created=False):
  614.             self.x = self.parent.player_x
  615.             self.y = self.parent.player_y
  616.    
  617.         advance = reset
  618.    
  619.    
  620.     class Trail(Particle):
  621.         tex_name = 'trail'
  622.    
  623.         def reset(self, created=False):
  624.             self.x = self.parent.player_x + randint(-30, -20)
  625.             self.y = self.parent.player_y + randint(-10, 10)
  626.    
  627.             if created:
  628.                 self.size = 0
  629.             else:
  630.                 self.size = random() + 0.6
  631.    
  632.         def advance(self, nap):
  633.             self.size -= nap
  634.             if self.size <= 0.1:
  635.                 self.reset()
  636.             else:
  637.                 self.x -= 120 * nap
  638.    
  639.    
  640.     class Bullet(Particle):
  641.         active = False
  642.         tex_name = 'bullet'
  643.    
  644.         def reset(self, created=False):
  645.             self.active = False
  646.             self.x = -100
  647.             self.y = -100
  648.    
  649.         def advance(self, nap):
  650.             if self.active:
  651.                 self.x += 250 * nap
  652.                 if self.x > self.parent.width:
  653.                     self.reset()
  654.    
  655.             elif (self.parent.firing and
  656.                 self.parent.fire_delay <= 0):
  657.                 snd_laser.play()
  658.    
  659.                 self.active = True
  660.                 self.x = self.parent.player_x + 40
  661.                 self.y = self.parent.player_y
  662.                 self.parent.fire_delay += 0.3333
  663.    
  664.    
  665.     class Enemy(Particle):
  666.         active = False
  667.         tex_name = 'ufo'
  668.         v = 0
  669.         shoot = False
  670.    
  671.         def reset(self, created=False):
  672.             self.active = False
  673.             self.x = -100
  674.             self.y = -100
  675.             self.v = 0
  676.            
  677.    
  678.         def advance(self, nap):
  679.             if self.active:
  680.                 if self.ennemy_touch():
  681.                     self.parent.lifes.value -= 1
  682.                    
  683.                 if self.ennemy_shoot():
  684.                     self.parent.power.value += 1
  685.                    
  686.                 if self.check_hit():
  687.                     snd_hit.play()
  688.                     self.x = -100
  689.                     self.y = -100
  690.                     return
  691.    
  692.                 self.x -= 200 * nap
  693.    
  694.                 if self.x < -50:
  695.                     if self.parent.power.value == 10:
  696.                         return
  697.                     else:
  698.                         self.reset()
  699.    
  700.                 self.y += self.v * nap
  701.                 if self.y <= 0:
  702.                     self.v = abs(self.v)
  703.                 elif self.y >= self.parent.height:
  704.                     self.v = -abs(self.v)
  705.    
  706.             elif self.parent.spawn_delay <= 0:
  707.                 self.active = True
  708.                 self.x = self.parent.width + 50
  709.                 self.y = self.parent.height * random()
  710.                 self.v = randint(-100, 100)
  711.                 self.parent.spawn_delay += 1
  712.    
  713.         def check_hit(self):
  714.             if math.hypot(self.parent.player_x - self.x,
  715.                         self.parent.player_y - self.y) < 60:
  716.                 return True
  717.    
  718.             for b in self.parent.bullets:
  719.                 if not b.active:
  720.                     continue
  721.    
  722.                 if math.hypot(b.x - self.x, b.y - self.y) < 30:
  723.                     b.reset()
  724.                     return True
  725.                    
  726.         def ennemy_touch(self):
  727.             if math.hypot(self.parent.player_x - self.x,
  728.                         self.parent.player_y - self.y) < 60:
  729.                 return True
  730.                
  731.         def ennemy_shoot(self):
  732.             for b in self.parent.bullets:
  733.                 if b.active:
  734.                     if math.hypot(b.x - self.x, b.y - self.y) < 30:
  735.                         return True
  736.            
  737.    
  738.     class Game(PSWidget):
  739.         glsl = 'game.glsl'
  740.         atlas = 'game.atlas'
  741.    
  742.         firing = False
  743.         fire_delay = 0
  744.         spawn_delay = 1
  745.    
  746.         use_mouse = platform not in ('ios', 'android')
  747.    
  748.         def initialize(self):
  749.             self.player_x, self.player_y = self.center
  750.    
  751.             self.make_particles(Star, 200)
  752.             self.make_particles(Trail, 200)
  753.             self.make_particles(Player, 1)
  754.             self.make_particles(Enemy, 5)
  755.             self.make_particles(Bullet, 25)
  756.    
  757.             self.bullets = self.particles[-25:]
  758.    
  759.         def update_glsl(self, nap):
  760.             if self.use_mouse:
  761.                 self.player_x, self.player_y = Window.mouse_pos
  762.    
  763.             if self.firing:
  764.                 self.fire_delay -= nap
  765.    
  766.             self.spawn_delay -= nap
  767.    
  768.             PSWidget.update_glsl(self, nap)
  769.    
  770.         def on_touch_down(self, touch):
  771.             self.player_x, self.player_y = touch.pos
  772.             self.firing = True
  773.             self.fire_delay = 0
  774.    
  775.         def on_touch_move(self, touch):
  776.             self.player_x, self.player_y = touch.pos
  777.    
  778.         def on_touch_up(self, touch):
  779.             self.firing = False
  780.            
  781.         def on_enter(self, *args):
  782.             self.ids.game.initialize()
  783.             Clock.schedule_interval(self.ids.game.update_glsl, 1.0/60.0)
  784.  
  785. # Create the screen manager
  786. sm = ScreenManager()
  787. sm.add_widget(MenuScreen(name='menu'))
  788. sm.add_widget(MainScreen(name='main'))
  789. sm.add_widget(SecondScreen(name='second'))
  790.  
  791.  
  792.  
  793. class Game1App(App):
  794.     def build(self):
  795.         EventLoop.ensure_window()
  796.         return sm
  797.     Window.clearcolor = get_color_from_hex('111110')#(1, 1, 1, 1)
  798.     LabelBase.register(name='Roboto',
  799.                        fn_regular='Roboto-Thin.ttf',
  800.                        fn_bold='Roboto-Medium.ttf')
  801.  
  802. if __name__ == '__main__':
  803.     Game1App().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement