2016-04-01 12 views
1

Çocuğunu bir kılavuzda konumlandırarak RelativeLayout alt sınıfını oluşturdum (Python, kv dosyası değil). Çalışır, ancak tuval bloğu tarafından gösterildiği gibi öğeler mizanpajın kendisinden sağ üst tarafa 25 piksel yerleştirilir. Düzen alt sınıf için Python kodu:kivy'de ankraj bileşenleri 1.9.0 RelativeLayout

class RLMapWidget(RelativeLayout): 

    def __init__(self, map=None, **kwargs): 
     super(FloatLayout, self).__init__(**kwargs) 
     # Connecting to map, factories and other objects this class should know about 
     self.tile_factory = TileWidgetFactory() 
     self.map = map 
     # Initializing tile widgets for BG layer and adding them as children 
     for x in range(self.map.size[0]): 
      for y in range(self.map.size[1]): 
       tile_widget = self.tile_factory.create_tile_widget(self.map.get_item(layer='bg', 
                        location=(x, y))) 
       # tile_widget.pos = (50*x, 50*y) 
       tile_widget.pos = self._get_screen_pos((x, y)) 
       self.add_widget(tile_widget) 
     # Initializing widgets for actor layers 
     for x in range(self.map.size[0]): 
      for y in range(self.map.size[1]): 
       if self.map.has_item(layer='actors', location=(x, y)): 
        actor_widget = self.tile_factory.create_actor_widget(self.map.get_item(layer='actors', 
           displayed               location=(x, y))) 
        actor_widget.pos=(50*x, 50*y) 
        self.add_widget(actor_widget) 
     # Map background canvas. Used solely to test positioning 
     with self.canvas.before: 
      Color(0, 0, 1, 1) 
      self.rect = Rectangle(size = self.size, pos=self.pos) 
      self.bind(pos=self.update_rect, size=self.update_rect) 
     # Initializing keyboard bindings and key lists 
     self._keyboard = Window.request_keyboard(self._keyboard_closed, self) 
     self._keyboard.bind(on_key_down=self._on_key_down) 
     # The list of keys that will not be ignored by on_key_down 
     self.used_keys=['w', 'a', 's', 'd'] 

    def redraw_actors(self): 
     for actor in self.map.actors: 
      actor.widget.pos = self._get_screen_pos(actor.location) 

    def _get_screen_pos(self, location): 
     """ 
     Return screen coordinates (in pixels) for a given location 
     :param location: int tuple 
     :return: int tuple 
     """ 
     return (location[0]*50, location[1]*50) 

    # Keyboard-related methods 

    def _on_key_down(self, keyboard, keycode, text, modifiers): 
     """ 
     Process keyboard event and make a turn, if necessary 
     :param keyboard: 
     :param keycode: 
     :param text: 
     :param modifiers: 
     :return: 
     """ 
     if keycode[1] in self.used_keys: 
      self.map.process_turn(keycode) 
      self.redraw_actors() 

    def _keyboard_closed(self): 
     self._keyboard.unbind(on_key_down=self._on_key_down) 
     self._keyboard = None 

    def update_rect(self, pos, size): 
     self.rect.pos = self.pos 
     self.rect.size = self.size 


class CampApp(App): 

    def build(self): 
     root = FloatLayout() 
     map_factory = MapFactory() 
     map = map_factory.create_test_map() 
     map_widget = RLMapWidget(map=map, 
           size=(map.size[0]*50, map.size[1]*50), 
           size_hint=(None, None)) 
     root.add_widget(map_widget) 
     return root 

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

Fabrika sınıf fayans yapar:

class TileWidgetFactory(object): 
    def __init__(self): 
     pass 

    def create_tile_widget(self, tile): 
     tile.widget = Image(source=tile.image_source, 
          size_hint=(None, None)) 
     return tile.widget 

    def create_actor_widget(self, actor): 
     actor.widget = Image(source='Tmp_frame_black.png', 
          size_hint=(None, None)) 
     return actor.widget 
+2

ilgisiz ancak 'staticmethod' kullanarak 'TileWidgetFactory' yöntemlerini kullanmayı düşünebilirsiniz –

+0

Muhtemelen hayır: Bir fabrikanın niteliklerini kullanmayı daha sonra kullanmayı planlıyorum, böylece tam olarak hangi tür parçacıkların üretildiğini bilmesi gerekecek. boyut, düzeye özgü etkiler ve benzeri). – Synedraacus

+0

Ben sessiz olacağım, bir statikmethod olarak etiketli olmadığından düzgün çalışması için MyClass.should_be_static (Yok, my_value) 'gibi bir şey yapmak zorunda olduğunuzda, sadece bir hayvan peeve benim. –

cevap

0

Tamam, kendim çözüldü. Bu, fabrikada çocuk widget'larına boyut sağladığım takdirde, düzgün bir şekilde konumlandırıldıkları ortaya çıkıyor. Sahip olduğum problemi çözse de, eğer birisi bu tuhaflığın nereden geldiğini açıklayabilirse yine de minnettar olurum.