我可以使用列表检查collide_widget吗?

时间:2014-03-24 09:55:06

标签: kivy

我正在尝试制作一个游戏,你可以在屏幕上移动一个角色,然后我就拥有它,这样如果我的角色碰到一张树的图片,角色就会停止移动。在让这个工作之后,我尝试做的是更改代码,而不是仅仅使用树小部件,我想迭代一个小部件列表,这样如果我的角色遇到其中任何一个,角色就会停止移动。奇怪的是,当我在列表中只有一个小部件时,它可以工作。我也可以将list [0]或list [1]放在我的代码中,当我的角色在遇到这些小部件时停止。但同样,如果我在列表中有多个小部件并尝试遍历列表,它就不起作用,我的角色在遇到任何小部件时都不会停止。

我想知道我做错了什么或如何解决这个问题。最终我想要它,这样如果我的角色遇到列表中的任何图像,角色就会停止移动。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.label import Label
from kivy.uix.behaviors import ButtonBehavior
from kivy.core.audio import SoundLoader
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import FallOutTransition
from kivy.clock import Clock
from kivy.graphics import Color



gamelayout = FloatLayout(size=(300, 300))
bglayout = FloatLayout()
characterselectionlayout = GridLayout(cols=2)


class Game(Screen):

class Bg(Image):

    def __init__(self, **kwargs):
        super(Bg, self).__init__(**kwargs)
        self.allow_stretch = True
        self.size_hint = (None, None)
        self.size = (1440, 1440)



class Npcs(Image):
    def __init__(self, **kwargs):
        super(Npcs, self).__init__(**kwargs)
        self.allow_stretch=True   



class MoveableImage(Image):

    def __init__(self, **kwargs):
        super(MoveableImage, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(None, self)
        if not self._keyboard:
            return
        self._keyboard.bind(on_key_down=self.on_keyboard_down)
        self._keyboard.bind(on_key_up=self.on_keyboard_up)

        self.y = (Window.height/2.1)
        self.app = App.get_running_app()



    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'left':
            self.source = 'selectionscreen/left.zip'
            self.anim_delay=.20
            if self.x < (Window.width * .25):
                bglayout.x += 4
            else:
                for i in listofwidgets:
                    if self.collide_widget(i):
                        self.x -=0
                    else:
                        self.x -=6

        elif keycode[1] == 'right':
            self.source ='selectionscreen/right.zip'
            self.anim_delay=.20
            if self.x > (Window.width * .70):
                bglayout.x -= 4
            else:
                for i in listofwidgets:
                    if self.collide_widget(i):
                        self.x += 0
                    else:
                        self.x += 6

        else:
            return False
        return True


class gameApp(App):
    def build(self):
        global sm 
        sm = ScreenManager()
        game = Game(name='game')
        sm.add_widget(game)
        global listofobject
        listofobject = []
        hero = MoveableImage(source='selectionscreen/right1.png', size_hint=(None,None), allow_stretch = False, size=(40, 65))
        self.tree = Npcs(source='selectionscreen/tree.zip', allow_stretch=False, size_hint=(None,None), pos_hint={'x':.20, 'y':.30}, size=(50, 50), pos=(300, 300))
        self.testdude = Npcs(source='selectionscreen/testdude.png', allow_stretch=False, size_hint=(None,None), pos_hint={'x':.60, 'y':.70}, size=(100, 124), pos=(800, 900))
        listofwidgets.append(self.tree)
        listofwidgets.append(self.testdude)
        self.background=Bg(source='selectionscreen/background12.png', pos_hint={'x':0, 'y':0})
        bglayout.add_widget(self.background)
        bglayout.add_widget(self.tree)
        bglayout.add_widget(self.testdude)
        gamelayout.add_widget(bglayout)
        gamelayout.add_widget(hero)
        game.add_widget(gamelayout)

        return sm





if __name__ == '__main__':
    gameApp().run()

1 个答案:

答案 0 :(得分:1)

回答你的整体问题......是的,没有理由你不应该这样做。

追踪您的问题需要更多代码......目前您的代码段没有意义,因为list未在任何地方定义。您是否可以发布一个简短的示例,或者至少发布您正在使用的完整代码?

作为旁注,list不是一个好的变量名,因为它会覆盖list类实例化器,这可能会让人讨厌或者在以后会出现问题。