我正在学习python编程,并在一个简单的游戏应用程序上工作,在该应用程序中,我需要在单个屏幕上单击时旋转两个矩形,但是发生的事情是当我单击其中的两个矩形时,两个矩形都沿原点旋转那个被点击的矩形,但是另一个矩形不是这种情况,实际上,它的位置也不应该是那个矩形,当单击分配的位置(不存在该矩形)时,它旋转而不旋转两个矩形。我只需要在独立单击时旋转两个矩形即可。很难解释,所以请尝试执行代码并查找发生的情况。
from kivy.app import App
from kivy.graphics import Rotate, Rectangle, Ellipse, Color
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, CardTransition
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, NumericProperty, ReferenceListProperty, ListProperty
from kivy.uix.floatlayout import FloatLayout
Builder.load_string('''
<Stage_2>:
object2: Object2
object3: Object3
Object2:
id: Object2
center: self.rotate_origin
Object3:
id: Object3
center: self.rotate_origin
<Manager>:
id: screen_manager
Screen:
name:"P"
FloatLayout:
Button:
pos_hint:{"x":0.2,"y":0.05}
size_hint: 0.6, 0.2
font_size: (root.width**2 + root.height**2) / 13**4
text: "Play"
background_color: 255,0,1,1
on_release:
root.transition.direction = "up"
root.current = "stage2"
Screen:
name: 'stage2'
Stage_2:
id:s2
''')
class Object2(Widget):
def __init__(self, *args, **kwargs):
Widget.__init__(self, *args, **kwargs)
self.rect_pos_x = 500
self.rect_pos_y = 425
self.rect_pos = self.rect_pos_x, self.rect_pos_y
self.rect_width = 150
self.rect_height = 30
self.rect_size = self.rect_width, self.rect_height
self.rotate_origin_x = self.rect_pos_x + self.rect_width / 2
self.rotate_origin_y = self.rect_pos_y + self.rect_height / 2
self.rotate_origin = self.rotate_origin_x, self.rotate_origin_y
self.angle = 135
print('rect 1')
with self.canvas:
Rotate(origin=self.rotate_origin, angle=self.angle)
Color(rgb=(0,197,68))
Rectangle(pos=self.rect_pos, size=self.rect_size)
def rotate(self):
self.canvas.clear()
self.angle += 90
if (self.angle > 315):
self.angle = 225
with self.canvas:
Rotate(origin=self.rotate_origin, angle=self.angle)
Color(rgb=(0, 255, 100))
Rectangle(pos=self.rect_pos, size=self.rect_size)
def on_touch_up(self, touch):
if self.collide_point(*touch.pos):
self.rotate()
print(self.angle)
class Object3(Widget):
def __init__(self, *args, **kwargs):
Widget.__init__(self, *args, **kwargs)
self.rect_pos_x = 500
self.rect_pos_y = 250
self.rect_pos = self.rect_pos_x, self.rect_pos_y
self.rect_width = 150
self.rect_height = 30
self.rect_size = self.rect_width, self.rect_height
self.rotate_origin_x = self.rect_pos_x + self.rect_width / 2
self.rotate_origin_y = self.rect_pos_y + self.rect_height / 2
self.rotate_origin = self.rotate_origin_x, self.rotate_origin_y
self.angle = 135
print('rect 2')
with self.canvas:
Rotate(origin=self.rotate_origin, angle=self.angle)
Color(rgb=(1,255,0))
Rectangle(pos=self.rect_pos, size=self.rect_size)
def rotate(self):
self.canvas.clear()
self.angle += 90
if (self.angle > 315):
self.angle = 225
with self.canvas:
Rotate(origin=self.rotate_origin, angle=self.angle)
Color(rgb=(0, 255, 100))
Rectangle(pos=self.rect_pos, size=self.rect_size)
def on_touch_up(self, touch):
if self.collide_point(*touch.pos):
self.rotate()
print(self.angle)
class Stage_2(Widget):
object2 = ObjectProperty(None)
object3 = ObjectProperty(None)
class Manager(ScreenManager):
pass
sm = Manager()
class ScreensApp(App):
def build(self):
return sm
if __name__ == '__main__':
ScreensApp().run()
PushMatrix()
指令中包含PopMatrix()
和canvas
,则仅当前的Widget
将受到影响。然后,如果将Widget
size
和pos
调整为Rectangle
,则应该会获得更好(但不是完美)的性能: with self.canvas:
PushMatrix()
Rotate(origin=self.rotate_origin, angle=self.angle)
Color(rgb=(1,255,0))
Rectangle(pos=self.rect_pos, size=self.rect_size)
PopMatrix()
self.pos = self.rect_pos
self.size = self.rect_size
只要您使用涉及with self.canvas
,Rotation
或Scale
的Translate
,就需要这样做。collide_point()
仍将注视Widget
size
和pos
,而不是Rectangle
,但至少Widget
及其Rectangle
的中心应重合。