I'm drawing a background into kivy, and then wrap and place a transparent image on top of it. Each second I move the location of the transparent a little bit.
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.uix.image import Image
from kivy.clock import Clock
class ScrollApp(App):
def build(self):
self.bkg = Background()
self.clock = Clock.schedule_interval(self.bkg.scroll_texture, 1)
return self.bkg
class Background(Widget):
plx_2 = ObjectProperty(None)
def __init__(self, **kwargs):
super().__init__(**kwargs)
# set as texture
self.plx_2 = Image(source=r"assets\plx-2.2.png").texture
self.plx_2.wrap = 'repeat'
self.plx_2.uvsize = (1,-1)
def scroll_texture(self, time_passed):
# update uvpos
x,y = self.plx_2.uvpos
x = x - 0.05 % 1 # this magic number will change later
self.plx_2.uvpos = (x, y)
# redraw the image
texture = self.property('plx_2')
texture.dispatch(self)
if __name__=='__main__':
ScrollApp().run()
And the .kv
file:
#:kivy 1.11.1
<Background>:
canvas.before:
Rectangle:
size : self.size
pos : self.pos
source: "assets\plx-1.png"
Rectangle:
size : self.size
texture: self.plx_2
The code works, but I feel very odd about the way I'm redrawing the texture with dispatching itself as an event. Is there a better way? Second, now if I were to add multiple transparent images on top, I would have to add a lot of code. Is there a a better way than just adding another Rectangle
in the .kv
file, adding another ObjectProperty
in the Background
class etc, etc.?