我目前正在尝试为IOS/Android制作一个平台游戏,但我卡在了一个问题上。我已经创建了两个按钮和一个角色。我希望角色保持移动直到按钮被释放。也就是说:当按钮被按下时,我可以移动角色一次,但我希望它保持移动直到按钮被释放。
我尝试过多种解决方案,例如使用Python的时间模块:
class Level1(Screen):
posx = NumericProperty(0)
posy = NumericProperty(0)
moving = True
i = 0
def __init__(self, **kwargs):
super(Level1, self).__init__(**kwargs)
def rightmove(self):
self.posx = self.posx+1
time.sleep(10)
def goright(self):
while self.moving == True:
self.rightmove()
i += 1
if i == 10:
break
def stopright(self):
self.moving == False
但是它不起作用。我认为它以某种方式陷入了无限循环,因为当我按下按钮时,应用程序停止工作(“应用程序已停止运行…”错误)。
我几乎不知道如何解决这个问题。我已经尝试了几个小时,但还没有找到解决方案。 这是我的.py文件:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition, SlideTransition
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, NumericProperty
from kivy.clock import Clock
from kivy.uix.floatlayout import FloatLayout
import time
Config.set('graphics','resizable',0) #don't make the app re-sizeable
#Graphics fix
#this fixes drawing issues on some phones
Window.clearcolor = (0,0,0,1.)
language = "english"
curr1msg = 1
class HomeScreen(Screen):
pass
class OptionsScreen(Screen):
pass
class GameScreen(Screen):
pass
class LevelScreen(Screen):
pass
class Level1intro(Screen):
global language
global curr1msg
if language == "english" and curr1msg == 1:
pName = "Pedro"
msg1 = """Hello my friend!
My name is Pedro and I have a problem. Will you help me?
My spanish studens have a spanish test tomorrow, but I lost the exams!
You are the only one who can help me!"""
cont = "Press anywhere to continue..."
elif language == "swedish" and curr1msg == 1:
pName = "Pedro"
msg1 = """Hejsan!
Jag är Pedro och jag har ett problem. Kan du hjälpa mig?
Mina spanska-elever har ett spanskaprov imorgon men jag har tappat bort proven!
Du är den enda som kan hjälpa mig!"""
cont = "Tryck på skärmen för att fortsätta..."
class Level1(Screen):
posx = NumericProperty(0)
posy = NumericProperty(0)
moving = True
i = 0
def __init__(self, **kwargs):
super(Level1, self).__init__(**kwargs)
def rightmove(self):
self.posx = self.posx+1
time.sleep(10)
def goright(self):
while self.moving == True:
self.rightmove()
i += 1
if i == 10:
break
def stopright(self):
self.moving == False
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("main.kv")
class MainApp(App):
def build(self):
return presentation
if __name__ == "__main__":
MainApp().run()
这是我的.kv文件:
#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import SlideTransition kivy.uix.screenmanager.SlideTransition
ScreenManagement:
transition: FadeTransition()
HomeScreen:
OptionsScreen:
LevelScreen:
Level1intro:
Level1:
<HomeScreen>:
name: 'home'
FloatLayout:
canvas:
Rectangle:
source:"images/home_background.jpg"
size: self.size
Image:
source:"images/logo.png"
allow_stretch: False
keep_ratio: False
opacity: 1.0
size_hint: 0.7, 0.8
pos_hint: {'center_x': 0.5, 'center_y': 0.9}
Button:
size_hint: 0.32,0.32
pos_hint: {"x":0.34, "y":0.4}
on_press:
app.root.transition = SlideTransition(direction="left")
app.root.current = "level"
background_normal: "images/play_button.png"
allow_stretch: False
Button:
size_hint: 0.25,0.25
pos_hint: {"x":0.38, "y":0.15}
on_press:
app.root.transition = SlideTransition(direction="left")
app.root.current = 'options'
background_normal: "images/settings_button.png"
<OptionsScreen>:
name: 'options'
<LevelScreen>
name: "level"
FloatLayout:
canvas:
Rectangle:
source:"images/home_background.jpg"
size: self.size
Label:
text: "[b]Choose Level[/b]"
markup: 1
font_size: 40
color: 1,0.5,0,1
pos: 0,250
Button:
size_hint: 0.1,0.1
pos_hint: {"x": 0.1, "y": 0.8}
on_press:
app.root.current = "level1intro"
Image:
source:"images/level1.png"
allow_stretch: True
y: self.parent.y + self.parent.height - 70
x: self.parent.x
height: 80
width: 80
Button:
background_normal: "images/menu_button.png"
pos_hint: {"x": 0.4, "y": 0}
size_hint: 0.3,0.3
pos_hint: {"x": 0.35}
on_press:
app.root.transition = SlideTransition(direction="right")
app.root.current = "home"
<Level1intro>
name: "level1intro"
canvas:
Rectangle:
source: "images/background.png"
size: self.size
Image:
source: "images/dialog.png"
pos_hint: {"y": -0.35}
size_hint: 0.7,1.0
Label:
font_size: 20
color: 1,1,1,1
pos_hint: {"x": -0.385, "y": -0.285}
text: root.pName
Label:
font_size: 15
color: 1,1,1,1
pos_hint: {"x": -0.15, "y": -0.4}
text: root.msg1
Label:
font_size: 15
color: 0.7,0.8,1,1
pos_hint: {"x": 0.025, "y": -0.449}
text: root.cont
on_touch_down:
app.root.transition = FadeTransition()
app.root.current = "level1"
<Level1>
name: "level1"
canvas:
Rectangle:
source: "images/background.png"
size: self.size
Button:
text: ">"
size_hint: 0.1,0.1
pos_hint: {"x":0.9, "y":0.0}
on_press:
root.goright()
on_release:
root.stopright()
Button:
text: "<"
size_hint: 0.1,0.1
pos_hint: {"x": 0.0, "y": 0.0}
on_press:
root.posx = root.posx-1
Image:
id: char
source: "images/idle1.png"
size: self.size
pos: root.posx,root.posy
感谢您的时间和帮助。 GryTrean
//我将“i”更改为“self.i”,但它没有解决问题。
Level1
类被实例化。听起来你可能会尝试去解引用一个不存在于全局范围内的变量,因此根指针指向空值并导致了段错误。 - TypeKazt