I have a big problem about my code. I want to change screen background image's x position when I click button. Actually I think I am changing position correctly. Because im checking image's current position with other button. But there is a nothing on screen. Image is not moving anywhere. What is my fault or shouldn't I use widget to show image on screen ? Is there any way to do this little game.
My .py file:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition , FadeTransition
from kivy.properties import ObjectProperty, NumericProperty
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.layout import Layout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.core.window import Window
Builder.load_file('jumpergame.kv')
class MainMenu(Screen):
pass
class Dark(Screen):
pass
class SettingsMenu(Screen):
pass
class Game(Screen):
first_image_py = ObjectProperty(None)
def test(self):
print(self.first_image_py.pos)
def swipe(self):
print(self.first_image_py.pos[0])
self.first_image_py.pos[0] -= 100
print(self.first_image_py.pos[0])
def show_bg_first_pos(self):
print('*******************')
print('First Background [X] Position ==>',self.first_image_py.pos[0])
print('First Background [Y] Position ==>',self.first_image_py.pos[1])
return self.bg_first_pos_x,self.bg_first_pos_y
def show_screen_size(self):
print('*******************')
print('Screen [X] Size ==>',self.width)
print('Screen [Y] Size ==>',self.height)
def show_bg_second_pos(self):
print('*******************')
sm = ScreenManager()
sm.add_widget(MainMenu(name='mainmenu'))
sm.add_widget(SettingsMenu(name='settings'))
sm.add_widget(Game(name='game'))
sm.add_widget(Dark(name='dark'))
class JumperGame(App):
def build(self):
return sm
if __name__ == "__main__":
JumperGame().run()
My .kv file :
<MainMenu>:
BoxLayout:
orientation : 'vertical'
Label:
text: 'JumperGame v1.00 \n by 320V'
Button:
text: 'Start'
on_press: root.manager.current = 'game'
Button:
text: 'Settings'
on_press: root.manager.current = 'settings'
<SettingsMenu>:
Button:
text: 'BACK to MENU'
on_press: root.manager.current = 'mainmenu'
<Game>:
first_image_py : first_image_kv
Widget:
id: first_image_kv
pos: 0,0
canvas.before:
Color:
rgb: (1,1,1)
Rectangle:
source: 'bg.png'
size: self.width , self.height
AnchorLayout:
anchor_x : 'right'
anchor_y : 'top'
Button:
text: 'Check image 1 pos'
size_hint: .25,.1
on_press: root.show_bg_first_pos()
AnchorLayout:
anchor_x : 'left'
anchor_y : 'top'
Button:
text: 'Check Image 2 Pos'
size_hint:.25,.1
on_press: root.show_bg_second_pos()
AnchorLayout:
anchor_x : 'center'
anchor_y : 'bottom'
Button:
text: 'Check Window Size'
size_hint: .25 , .1
on_press: root.show_screen_size()
FloatLayout:
canvas:
Color:
rgb: (1,1,1)
Rectangle:
id: bg_Image_Second
source: 'bg.png'
size: self.width , self.height
pos: root.width,root.height
Button:
text: 'Swipe Images'
size_hint: .1,.1
on_press: root.swipe()
Button:
text: 'TEST'
size_hint: .1 , .1
on_press: root.test()
pos: 50,0
Your swipe
method is changing the position of your widget, but your image is in the Rectangle
canvas
instruction. Since you haven't bound the position of that Rectangle
to the position of the Widget
, the image never moves. You only need to add that binding by adding pos: self.pos
in the kv
file as:
<Game>:
first_image_py : first_image_kv
Widget:
id: first_image_kv
pos: 0,0
canvas.before:
Color:
rgb: (1,1,1)
Rectangle:
source: 'bg.png'
size: self.width , self.height
pos: self.pos