gpt4 book ai didi

android - KIVY - Python 在按下按钮时继续执行

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:57 24 4
gpt4 key购买 nike

我目前正在尝试为 IOS/Android 制作一款平台游戏,但我遇到了一个问题。我创建了两个按钮和一个角色。我希望角色在释放按钮之前一直移动。我的意思是:我可以在按下按钮时移动角色一次,但我希望它一直移动直到释放按钮。

我尝试了多种解决方案,例如我使用了 pythons 时间模块:

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

感谢您的宝贵时间和帮助。 Gerrit 兰

//我将“i”更改为“self.i”,但并没有解决问题。

最佳答案

我为您创建了一个简单的示例,展示了如何通过按下按钮移动角色(在本例中为 elf warrior level 1):

#!/usr/bin/env python3.5
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import mainthread, Clock

gui = '''
Root:
orientation: 'vertical'

arena: arena
control_button: control_button

Arena:
id: arena

Button
id: control_button
size_hint_y: None
height: dp(50)
text: 'move'


<Arena@FloatLayout>:
player: player

Button:
id: player
pos: 150, 300
text: 'elf warrior\\nlevel 1'
size_hint: None, None
size: 100, 100
'''


class Root(BoxLayout):

def __init__(self, **kwargs):
super().__init__(**kwargs)

@mainthread
def job():
self.control_button.bind(on_press=self._on_press)
self.control_button.bind(on_release=self._on_release)

job()

def _on_press(self, button):
self.arena.start_movement()

def _on_release(self, button):
self.arena.stop_movement()


class Arena(FloatLayout):

def start_movement(self):
Clock.schedule_interval(self._move_right, 0.01)

def stop_movement(self):
Clock.unschedule(self._move_right)

def _move_right(self, dt):
self.player.x += 1


class Test(App):

def build(self):
return Builder.load_string(gui)


Test().run()

关于android - KIVY - Python 在按下按钮时继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38578280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com