2016-12-04 48 views
1

我試圖用Kivy來試驗一個小遊戲。我一直鬆散地遵循教程,但我基本上對浮動佈局在屏幕上呈現圖形的方式感到困惑。困惑於Kivy放置一個圓圈的「中心」 - 包含屏幕截圖和代碼

我試圖在屏幕中間畫一個矩形的「玩家」。但它顯然不是在中心(我已經通過渲染十字線在中心所示)渲染:

Why is there an offset?

下面的代碼:

<Game>: 
    FloatLayout: 
     size: root.size 
     Widget: 
      id: game 
      canvas: 
       Color: 
        rgb: dark 
       Rectangle: 
        pos: root.center_x/5, 0 
        size: root.width*4/5, root.height 
       Color: 
        rgb: violet 
       Rectangle: 
        pos: root.center_x, 0 
        size: 2, root.height 
       Rectangle: 
        pos: 0, root.center_y 
        size: root.width, 2 
     Player: 
      id: player 
      size_hint: 300, 300 
      center_x: root.center_x 
      center_y: root.center_y 

<Player>: 
    canvas: 
     Color: 
      rgb: crimson 
     Rectangle: 
      pos: self.pos 
      size: self.size_hint 
     Color: 
      rgb: dark 
     Ellipse: 
      pos: self.x+5, self.y+5 
      size: self.size_hint_x-10, self.size_hint_y-10 

的Python代碼確實是最小馬上;我只是試圖學習我的方式圍繞圖形:

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.properties import ObjectProperty, ListProperty, NumericProperty 
from kivy.graphics.vertex_instructions import(Rectangle, Ellipse) 
from kivy.graphics.context_instructions import Color 

class Player(Widget): 
    pass 

class Game(Widget): 
    player = ObjectProperty(None) 

class GameApp(App): 

    def build(self): 
     game = Game() 
     return game 


if __name__ == '__main__': 
    GameApp().run() 
+0

任何關於kivy如何工作的一般反饋將非常受歡迎。 –

+0

只是注意到,如果我將Player的size_hint設置爲100,100,它會完全呈現在中心。但我不知道爲什麼會這樣... –

+1

'size_hint'與其他窗口小部件或父窗口相比是相對大小(取決於上下文)。它看起來像你想把'size_hint'設置爲'(None,None)'而不是引用'self.size'。 – inclement

回答

1

請嘗試下面的代碼。使用顯式大小而不是size_hint並將它們相對於父級放置。

<Game>: 
    FloatLayout: 
     size: root.size 
     Widget: 
      id: game 
      canvas: 
       Color: 
        rgb: 1, 0, 0 
       Rectangle: 
        pos: root.center_x/5, 0 
        size: root.width*4/5, root.height 
       Color: 
        rgb: 1, 1, 0 
       Rectangle: 
        pos: root.center_x, 0 
        size: 2, root.height 
       Rectangle: 
        pos: 0, root.center_y 
        size: root.width, 2 
     Player: 
      id: player 
      center_x: root.center_x 
      center_y: root.center_y 

<Player>: 
    size_val_r: 300 
    size_val_e: 290 
    canvas: 
     Color: 
      rgb: 0.8, 0.6, 0 
     Rectangle: 
      size: self.size_val_r, self.size_val_r 
      pos: root.width/2 - self.size_val_r/2, self.height/2 - self.size_val_r/2 
     Color: 
      rgb: 1, 1, 0.6 
     Ellipse: 
      pos: root.width/2 - self.size_val_e/2, self.height/2 - self.size_val_e/2 
      size: self.size_val_e, self.size_val_e 
+0

你是個很酷的人。當我有機會時,我會嘗試這個。 –

+0

如果你想要相對尺寸,不要使用size_hint,它將與父親相關。您想要使用與版面相關的root.width倍數。 – Daniel

+0

感謝您的幫助,這解決了我的問題。 –