Несколько дней назад (вчера на самом деле: D) Я начал программировать в KIVY (который является модулем python - если можно так выразиться).KIVY - Python Продолжайте делать, пока кнопка нажата
Я знаком с самим python, но я нахожу KIVY довольно пробным и сложным в некоторых решениях.
В настоящее время я пытаюсь создать платформер для IOS/Android, но я застрял в проблеме. Я создал две кнопки и символ. Я хочу, чтобы персонаж продолжал двигаться до тех пор, пока кнопка не будет отпущена. Под этим я имею в виду: я могу перемещать символ один раз, когда нажимается кнопка, но я хочу, чтобы он продолжал двигаться, пока кнопка не будет отпущена.
Я пробовал несколько решение, например, я использовал время модуль питонов:
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», и это не устраняет проблему.
Я знаю, но я хочу, чтобы сохранить добавляя значение к root.posx до тех пор, пока кнопка не будет отпущена. Как мне это сделать? Спасибо за вашу помощь/попробуйте помочь :) – GryTrean
Вы не разместили свой код, который показывает, как вы прикрепляетесь к привязкам кнопок, поэтому я упомянул кнопку API. Отправьте свой код, который показывает привязки кнопок. – TypeKazt
Im не использует привязку. Кнопки создаются в файле .kv, и именно поэтому код есть (посмотрите на вторую кнопку, которая отображает изображение слева == self.posx-1). Я хочу продолжать добавлять/удалять это значение, пока клиент не остановит нажатие кнопки. Я занимаюсь мобильной платформерной игрой, и я не знаю, знаете ли вы, что я имею в виду, но в самых играх с платформой у вас есть кнопка, и пока вы нажимаете ее (удерживая ее), вы продолжаете двигаться в направлении (например правильно). Я надеюсь, что вы знаете, что я имею в виду: D – GryTrean