слишком большой размер коллайдера - PullRequest
0 голосов
/ 31 мая 2018

Что я пытался сделать:

Я хотел, чтобы моя программа печатала сообщение, когда оно сталкивается со спрайтом посередине.

Проблема:

Это не останавливает печать, что он столкнулся.Я посмотрел на него с помощью pdb, и он говорит, что Player 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 Ответ

0 голосов
/ 31 мая 2018

В этом случае проблема заключается в том, что FloatLayout использует size_hint для установки размера виджета при его добавлении, поскольку он не устанавливает его, они принимают значение (1, 1), то есть размерокно.

Решение состоит в том, чтобы установить size_hint на (None, None), в дополнение к использованию allow_stretch в True и keep_ratio в False.В коде я установил для блока pos_hint значение (0.5, 0.5), и он будет привязан к этой позиции, поэтому он не будет двигаться, если вы хотите, чтобы он мог двигаться, вы должны установить pos, а не pos_hint.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...