Создайте новый холст для каждого нового нажатия клавиши (стрельба из револьвера)

Во-первых, я новичок в kivy и не очень опытен в Python. Следующая программа предназначена исключительно для обучения основам киви, не более того.

Программа представляет собой игру, в которой пользователь управляет орудийной башней. Он стреляет по объектам, которые подпрыгивают в окне программы, а точки и время показаны на панели ниже. (В настоящее время занят кнопкой.) Клавиши, которые поворачивают турель, - это "A" и "D", а "P" - для стрельбы.

Проблема, с которой я сейчас сталкиваюсь, заключается в следующем: мне нужно генерировать дополнительные метательные снаряды каждый раз, когда пользователь нажимает "P". На более позднем этапе мне также потребуется генерировать и удалять графику целевых объектов, когда они попадают под удар, что, я думаю, будет включать ту же технику.

Как мне сгенерировать дополнительные объекты canvas и \ или эллипса? (графическое представление каждого снимка)

Мой код Python:

from kivy.config import Config
Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '900')
Config.set('graphics','resizable',0)

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.properties import NumericProperty
from kivy.properties import ReferenceListProperty
from kivy.properties import BooleanProperty
from kivy.properties import ListProperty
from kivy.clock import Clock
import math

from kivy.core.window import Window

class MainScreen(BoxLayout): #Contains the whole program

    #Turret rotation:
    the_angle = NumericProperty(0)

    #Projectile vector:
    the_pos_x = NumericProperty(0)
    the_pos_y = NumericProperty(0)
    the_pos = ReferenceListProperty(the_pos_x, the_pos_y)

    #Shots data:
    shot_fired = BooleanProperty(False)

    shot_count = NumericProperty(0)
    angle_list = ListProperty([])
    pos_list_x = ListProperty([])
    pos_list_y = ListProperty([])


    def update(self, dt):
        if self.shot_fired == True:
            self.shot_count += 1
            self.angle_list.append(self.the_angle)
            self.pos_list_x.append(400)
            self.pos_list_y.append(400)
            self.shot_fired = False

        for i in range(0, self.shot_count):
            self.shoot(i, self.angle_list[i], self.pos_list_x[i], self.pos_list_y[i])




    def shoot(self, cur_shot, the_angle, pos_x, pos_y):

        #Make correct shot data:
        velocity = 1.5
        angle_rad = math.radians(the_angle+90)
        pos_x += ( math.cos(angle_rad)*velocity )
        pos_y += ( math.sin(angle_rad)*velocity )

        #Give the shots positions new data :
        self.the_pos_x = pos_x
        self.the_pos_y = pos_y

        #Update data for the next round of this function:
        self.pos_list_x[cur_shot] = pos_x
        self.pos_list_y[cur_shot] = pos_y


    def keypress(self, *args):
        the_key = args[3]
        if the_key == "a":
            self.the_angle += 1.5
        elif the_key == "d":
            self.the_angle += -1.5
        elif the_key == "p":
            self.shot_fired = True




class GameScreen(RelativeLayout): #The game part of the screen
    pass

class Gun(Widget): #Holds canvas and drawings for gun
    pass    

class Projectile(Widget): #Holds canvas and drawings for projectile
    pass    

class InfoBar(FloatLayout): #Holds point counters and buttons
    pass


#Set screen size and prevent resizing:
Window.size = (800, 900)

class MyApp(App):
    def build(self):
        Builder.load_file("interface.kv")
        game = MainScreen()
        Window.bind(on_key_down=game.keypress)
        Clock.schedule_interval(game.update, 1.0/60.0)
        return game


MyApp().run()

Мой код кв:

<MainScreen>:

    the_angle: 45
    the_pos: [400,400]

    GameScreen:
        size_hint:(None,None)
        size:800,800
        pos_hint:{"top":1, "left":1}

        Gun:
            canvas.before:
                PushMatrix
                Rotate:
                    axis: 0,0,1
                    angle: root.the_angle
                    origin: 400,400


            canvas:
                Rectangle:
                    size:50,100
                    pos: 400,400

            canvas.after:
                PopMatrix


        Projectile:

            canvas:
                Ellipse:
                    size:10,20
                    pos: root.the_pos[0], root.the_pos[1]


    InfoBar:
        size_hint:(None,None)
        size:800,100
        pos_hint:{"bottom":1, "left":1}
        Button:

0 ответов

Другие вопросы по тегам