我需要创建一些对象并在 newgame 按钮的on_release事件上调用一些函数



我需要创建一个类 GameScreen 的对象,并在带有文本的按钮的on_release事件发生时调用它的 init 并计划它的更新方法的间隔

以下是缩短的代码:

class Snake(Widget):
def init(self, bool, list):
pass    
def update(self):
pass

class Food(Widget):
def init():
pass
def draw(snake_instance):
pass
def check(snake_instance):
pass

class WindowManager(ScreenManager):
pass
class MainMenuScreen(Screen):
pass    
class GameScreen(Screen):   
snk = ObjectProperty(None)
fd = ObjectProperty(None)

def init(self):
self.snk.init(False, (0,1,0,1))
self.fd.init()
Clock.schedule_interval(self.update, 1/20)
def update(self, deltaTime):
self.snk.update()
self.fd.draw(self.snk)
self.fd.check(self.snk)
class GameOverScreen(Screen):
pass
class OptionsScreen(Screen):
pass
class HighScoreScreen(Screen):
pass

kivyFile = Builder.load_string("""
#: import FadeTransition kivy.uix.screenmanager.FadeTransition
WindowManager:
transition: FadeTransition()
MainMenuScreen:
GameScreen:
GameOverScreen
OptionsScreen:
HighScoreScreen:

<Button>:
font_size: 50
size_hint: None, None
background_color: 0,0,0,0

color: self.parent.red if self.state=="normal" else self.parent.black

canvas.before:
Color:
rgba: self.parent.black if self.state=="normal" else self.parent.red
RoundedRectangle:
size: self.size
pos: self.pos
radius: [self.height*0.4]
Color:
rgba: self.parent.red if self.state=="normal" else self.parent.black
Line:
width: 2
rounded_rectangle: self.x, self.y, self.width, self.height, self.height*0.4

<MainMenuScreen>:
name: "mainmenuscreen"
red: (1,0,0,1)
black: (0,0,0,1)

canvas.before:
Color:
rgba: 0.15,0,0,1
Rectangle:
size: root.size
pos: root.pos

Widget:
Label:
text: "Snake Game"
bold: True
color: (0,0,0,1)
font_size: 100

outline_width: 3
outline_color: (1,0,0,1)

pos: 0, 1050
center_x: root.center_x

Button:
text: "New Game"
size: 350, 90
pos: 0, 800
center_x: root.center_x

on_release:
root.manager.current = "gamescreen"

Button:
text: "Options"
size: 300, 90
pos: 0, 650
center_x: root.center_x

Button:
text: "High Scores"
size: 350, 90
pos: 0, 500
center_x: root.center_x

Button:
text: "Exit"
size: 200, 90
pos: 0, 350
center_x: root.center_x

on_release: app.stop()

<GameScreen>:
name: "gamescreen"
snk: snake_id
fd: fd_id

canvas.before:
Color:
rgba: .2, .2, .2, 1
Rectangle:
pos: self.pos
size: self.size

Widget:
Snake:
id: snake_id
Label:
font_size: 50
color: self.parent.color
text: self.parent.disScore
size: self.texture_size
size_hint: None, None
pos: root.width-self.width-20, root.height-self.height-10

Food:
id: fd_id

""")

runTouchApp(kivyFile)

一切正常,没有错误。 我需要某种方法来创建 GameScreen 类的实例并调用它的 init((,并安排一个间隔来调用它的 update(( 方法。

如果我能猜到的话,像这样的事情:

def someMethod():
gs = GameScreen()
gs.init()
Clock.schedule_interval(gs.update,1/20)

任何人都可以帮助这个菜鸟基维开发人员吗?

你的代码的一个问题是你似乎在你应该使用__init__()的地方使用了init()。创建Widget时会自动调用__init__()方法,但init()只是另一种方法,除非您显式调用它,否则不会调用它。当您编写自己的__init__()方法时,您应该调用基类__init__()。看到这个问题。

因此,如果您将init()方法替换为__init__()GameScreen,那么您的update()方法应该被安排。

也许更好的方法可能是仅在显示GameScreen时开始使用on_enter()方法进行更新:

def on_enter(self, *args):
self.snk.init(False, (0, 1, 0, 1))
self.fd.init()
self.update_event = Clock.schedule_interval(self.update, 1 / 20)
def on_leave(self, *args):
self.update_event.cancel()

这样可以避免在GameScreen甚至不可见时对其进行更新。现在你甚至不需要__init__()覆盖,因为默认的将被调用。

此外,上述关于init()__init__()的评论也适用于您的SnakeFoodWidgets

请注意,GameScreen是在计算kv字符串时创建的,因此切勿实际调用GameScreen()

最新更新