【问题标题】:Changing Widget Size更改小部件大小
【发布时间】:2014-03-22 01:31:29
【问题描述】:

所以我有一个游戏,我有一张树的图片和一个可移动的角色。我无法让 collide_widget 工作,也不知道为什么。我打开Kivy Inspector,发现当我点击我的可移动角色时有一个红色的小框,但是当我点击树的图片时,整个kivy窗口变成红色,所以我猜测小部件的大小是和整个窗口一样大(这也解释了为什么 collide_widget 总是显示 True)。为了解决这个问题,我被告知添加 size_hint = None 并指定树的大小。当我在构建中实例化树时,我这样做了,但是我点击树时整个屏幕仍然变红。

那么我的问题是里面的小部件树太大了吗?我如何使它变小?添加 size_hint=None 并将大小更改为 50,50 并没有解决它,除非我做错了。

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.gridlayout import GridLayout
from kivy.uix.screenmanager import FallOutTransition


gamelayout = RelativeLayout(size=(300, 300))
bglayout = RelativeLayout()

class Game(Screen):
    pass    

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 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.size_hint = (.11, .11)
        self.y = (Window.height/2.1)
        self.app = App.get_running_app()

    def collide_with_tree(self, tree):
        if self.widget_collide(self.app.tree):
            print "success"


    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'left':
            print self.pos
            print self.app.tree.pos
            self.collide_with_tree(self.app.tree)
            self.source = 'selectionscreen/left.zip'
            self.anim_delay=.20
            if self.x < (Window.width * .25):
                bglayout.x += 4
            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:
                self.x += 6
        elif keycode[1] == 'down':
            self.source ='selectionscreen/right.zip'
            self.anim_delay=.20
            if self.y < (Window.height * .25):
                bglayout.y += 4
            else:
                self.y -= 6
        elif keycode[1] == 'up':
            self.source = 'selectionscreen/back.zip'
            self.anim_delay=.1
            if self.y > (Window.height * .70):
                bglayout.y -= 4
            else:
                self.y += 6
        else:
            return False
        return True

    def on_keyboard_up(self, keyboard, keycode):
        if keycode[1] == 'left':
            self.source = 'selectionscreen/left1.png'
        elif keycode[1] == 'right':
            self.source ='selectionscreen/right1.png'
        elif keycode[1] == 'down':
            self.source ='selectionscreen/right1.png'
        elif keycode[1] == 'up':
            self.source ='selectionscreen/back2.png'
        else:
            return False
        return True


class gameApp(App):
    def build(self):
        global sm
        sm = ScreenManager()
        game = Game(name='game')
        sm.add_widget(game)
        hero = MoveableImage(source='selectionscreen/right1.png')
        self.tree = Image(source='selectionscreen/tree.zip', size_hint=(None, None), size=(50, 50))
        self.background=Bg(source='selectionscreen/background9.png')

        #add widgets to bglayout
        bglayout.add_widget(self.background)
        bglayout.add_widget(self.tree)

        #add bglayout and moveable hero to gamelayout
        gamelayout.add_widget(bglayout)
        gamelayout.add_widget(hero)
        game.add_widget(gamelayout)

        return sm



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

【问题讨论】:

    标签: kivy


    【解决方案1】:

    您需要使用 FloatLayout 而不是RelativeLayout(或者只是将FloatLayout 添加到ScreenManager 的Screen(即RelativeLayout)中,然后将所有游戏小部件放入FloatLayout 中。 p>

    所以,你需要这样的东西:

    sm = ScreenManager()
    game_screen = Screen()
    game = FloatLayout()
    game_screen.add_widget(game)
    

    ..然后将所有游戏小部件添加到游戏中,以便大小固定,而不是“相对”于父布局管理器。

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多