为每个新的按键生成一个新画布(射击炮塔)

时间:2017-11-28 14:32:34

标签: python python-3.x canvas kivy kivy-language

首先,我是kivy的初学者,在Python方面也不是很有经验。 以下程序仅用于教育自己的基础知识,仅此而已。

该程序是用户控制炮塔的游戏。他拍摄了在程序窗口中反弹的物体,而使用的点和时间显示在下面的栏中。 (目前被一个按钮占用。)转动炮塔的钥匙是“A”和“D”,而“P”是用于射击。

我目前遇到的问题是: 每次用户按下“P”时,我需要生成额外的抛射物图形。在稍后阶段,我还需要生成和删除目标对象图形,当它们被一个镜头击中时,我想这将涉及相同的技术。

我应该如何生成额外的画布和\或椭圆对象? (每个镜头的图形表示)

我的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()

我的kv代码:

<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 个答案:

没有答案