代码之家  ›  专栏  ›  技术社区  ›  Azazer

Kivy图像对撞机尺寸太大

  •  1
  • Azazer  · 技术社区  · 8 年前

    我想做的是:

    我希望我的程序在中间与精灵发生冲突时打印一条消息。

    问题:

    它不会停止打印,因为它碰撞了。我用pdb查了一下,上面说播放器sprite是整个屏幕的大小,这很奇怪,因为我把图像大小设置为32px乘以32px。

    它看起来像什么

    enter image description here

    提到的代码和精灵

    链接到所述块

    enter image description here

    链接到提到的精灵

    enter image description here

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.clock import Clock
    import random
    import time
    from kivy.uix.image import Image
    from kivy.uix.widget import Widget
    from kivy.uix.button import Button
    from kivy.core.window import Window
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    
    #############################################################################
    
    class Collider(Image):
        pass
    
    #############################################################################
    
    root = FloatLayout()
    
    class GameScreen(Screen):
        def __init__(self, **kwargs):
            super(GameScreen, self).__init__(**kwargs)
            self.wimg = Basic(size = (32,32), source='sprite.png', pos=(270,-120))
            self.block = Collider(size = (32,32), source = 'block.png')
    
    
        def playy(self):
            root.add_widget(self.wimg)
            Clock.schedule_interval(self.wimg.update, 1.0 / 60.0)
    
        def worldgen1(self):
            self.add_widget(root)
            root.add_widget(self.block)
    
        def on_enter(self):
            self.worldgen1()
            self.playy()
    
    #############################################################################
    
    class Basic(Image):
    
        pFrame = 0
    
        def __init__(self, **kwargs):
            super(Basic, 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)
    
        def on_keyboard_down(self, keyboard, keycode, text, modifiers):
            if keycode[1] == 'left':
                self.x -= 10
            elif keycode[1] == 'right':
                self.x += 10
            elif keycode[1] == 'up':
                self.y += 10
            elif keycode[1] == 'down':
                self.y -= 10
            else:
                return False
            return True
    
        def update(self, dt):
            self.pFrame += 1
            if self.parent.parent.block.collide_widget(self.parent.parent.wimg):
                print ("collide with", self.parent.parent.block)
    
    #############################################################################
    
    class MeinApp(App):
    
        def build(self):
            sm = ScreenManager()
            sm.add_widget(GameScreen(name='gameplay'))
            return sm
    
    if __name__ == '__main__':
        MeinApp().run()
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   eyllanesc    8 年前

    在这种情况下,问题是 FloatLayout 使用size_提示在添加小部件时设置小部件的大小,因为它没有设置它,所以它们采用 (1, 1) ,即窗口的大小。

    解决办法是 size_hint (None, None) ,除了使用 allow_stretch 在里面 True keep_ratio 在里面 False . 在代码中我设置了块 pos_hint (0.5, 0.5) 它会把它固定在那个位置,这样它就不会移动,如果你想让它能够移动,你必须设置 pos ,而不是 POS U提示 .

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.clock import Clock
    import random
    import time
    from kivy.uix.image import Image
    from kivy.uix.widget import Widget
    from kivy.uix.button import Button
    from kivy.core.window import Window
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    
    #############################################################################
    
    class Collider(Image):
        pass
    
    #############################################################################
    
    root = FloatLayout()
    
    class GameScreen(Screen):
        def __init__(self, **kwargs):
            super(GameScreen, self).__init__(**kwargs)
            self.wimg = Basic(size = (32,32), pos=(200, 100), source='sprite.png', size_hint=(None, None), allow_stretch=True, keep_ratio=False)
            self.block = Collider(size = (32,32), pos_hint={'x': 0.5, 'y':0.5}, source = 'block.png', size_hint=(None, None), allow_stretch=True, keep_ratio=False)
    
        def playy(self):
            root.add_widget(self.wimg)
            Clock.schedule_interval(self.wimg.update, 1.0 / 60.0)
    
        def worldgen1(self):
            self.add_widget(root)
            root.add_widget(self.block)
    
        def on_enter(self):
            self.worldgen1()
            self.playy()
    
    #############################################################################
    
    class Basic(Image):
    
        pFrame = 0
    
        def __init__(self, **kwargs):
            super(Basic, 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)
    
        def on_keyboard_down(self, keyboard, keycode, text, modifiers):
            if keycode[1] == 'left':
                self.x -= 10
            elif keycode[1] == 'right':
                self.x += 10
            elif keycode[1] == 'up':
                self.y += 10
            elif keycode[1] == 'down':
                self.y -= 10
            else:
                return False
            return True
    
        def update(self, dt):
            self.pFrame += 1
            if self.parent.parent.block.collide_widget(self.parent.parent.wimg):
                print ("collide with", self.parent.parent.block)
    
    #############################################################################
    
    class MeinApp(App):
    
        def build(self):
            sm = ScreenManager()
            sm.add_widget(GameScreen(name='gameplay'))
            return sm
    
    if __name__ == '__main__':
        MeinApp().run()