Pyr0
Pyr0

Reputation: 116

How can I continuously change images' positions in kivy?

What I am trying to do is continuously generate new cloud images onto the kivy window -which I have done successfully-, but now I want them to continuously move to the left and off the screen to give the "sky" environment a moving effect. Though I haven't been able to change the images' positions. Any suggestions as to how I could make it work?

from kivy.app import App
from kivy.properties import Clock
from kivy.uix.widget import Widget
from kivy.graphics.context_instructions import Color
from kivy.uix.image import Image
from kivy.core.window import Window
import random

class MainWidget(Widget):
    state_game_ongoing = True

    clouds = []

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        Clock.schedule_interval(self.init_clouds, 1 / 10)

    def init_clouds(self, dt):
        x = random.randint(-100, self.width)
        y = random.randint(-100, self.height)

        cloud = Image(source="images/cloudbig.png",
                      pos=(x, y))
        self.add_widget(cloud)

class BalloonGameApp(App):
    def build(self):
        Window.clearcolor = (.2, .6, .8, 1)
        xd = MainWidget()
        return xd

BalloonGameApp().run()

I tried adding the clouds into a list using .append(), and calling each cloud and changing its position in a for loop via

clouds = []
def init_clouds(self, dt):
    x = random.randint(-100, self.width)
    y = random.randint(-100, self.height)

    cloud = Image(source="images/cloudbig.png",
                  pos=(x, y))
    self.add_widget(cloud)
    clouds.append(cloud)

    x += 100
    y += 100
    for cloud in self.clouds:
        cloud.pos(x, y)

I also tried the same method but in an "update" function that was on loop via Clock.schedule_interval() kivy function, which also didn't work the error I usually get is

TypeError: 'ObservableReferenceList' object is not callable

Any help would be appreciated, thanks in advance!

Upvotes: 0

Views: 183

Answers (1)

320V
320V

Reputation: 495

You need to check all Image's Parent. For more soft move lets create another Clock:

Clock.schedule_interval(self.move_clouds,1/100)

Now lets edit this function:

def move_clouds(self,*args):
    out_cloud_list = []    #If cloud not in screen remove:
    for child in self.children:
        if child.pos[0] >= self.width:
            out_cloud_list.append(child)
        else:
            child.pos[0] += 5
    for cloud in out_cloud_list:
        self.remove_widget(cloud)

Upvotes: 1

Related Questions