2 回答
TA贡献1785条经验 获得超4个赞
该问题有两种解决方案。
方法一——kv文件
消除
Image:
添加
size_hint: None, None
以覆盖 (1, 1) 或 (100, 100) 的默认大小添加
canvas:
片段
Builder.load_string('''
<Ball>:
size_hint: None, None
size: 15, 15
canvas:
Rectangle:
source: '58-Breakout-Tiles.png'
pos: self.pos
size: self.size
Kivy Canvas »来源
source
此属性表示要从中加载纹理的文件名。如果要使用图像作为源,请执行以下操作:
with self.canvas:
Rectangle(source='mylogo.png', pos=self.pos, size=self.size)
这是 Kivy 语言中的等价物:
<MyWidget>:
canvas:
Rectangle:
source: 'mylogo.png'
pos: self.pos
size: self.size
方法 2 - kv & py 文件
将球定义从 kv 文件移动到 Python 脚本中
创建球图像的纹理
向画布声明一个包含球纹理的矩形
只要有一个或更改
self.rect
,就将矩形绑定到一个方法。update_ball()
pos
size
片段 - py
from kivy.core.image import Image
from kivy.graphics import Rectangle
...
class Ball(Widget):
velocityX, velocityY = NumericProperty(0), NumericProperty(0)
velocity = ReferenceListProperty(velocityX, velocityY)
def __init__(self, **kwargs):
super(Ball, self).__init__(**kwargs)
texture = Image('58-Breakout-Tiles.png').texture
self.size_hint = None, None
self.size = (15, 15)
with self.canvas:
self.rect = Rectangle(texture=texture, pos=self.pos, size=self.size)
self.bind(pos=self.update_ball, size=self.update_ball)
def update_ball(self, *args):
self.rect.pos = self.pos
self.rect.size = self.size
def move(self):
self.pos = Vector(*self.velocity) + self.pos
片段 - kv
Builder.load_string('''
<SettingsScreen>:
Kivy 帆布 »纹理
texture
表示用于绘制此指令的纹理的属性。你可以像这样设置一个新的纹理:
from kivy.core.image import Image
texture = Image('logo.png').texture
with self.canvas:
Rectangle(texture=texture, pos=self.pos, size=self.size)
通常,您将使用源属性而不是纹理。
TA贡献1852条经验 获得超7个赞
您的代码大部分都在工作。一个相当简单的解决方法是将您更改Ball为扩展Image(而不是Widget),然后添加size_hint: None, None.
因此,Ball类声明变为:
class Ball(Image):
类本身可以保持不变
对于规则Ball在你的kv文件被简化为:
<Ball>:
source: '58-Breakout-Tiles.png'
在您的GameScreen规则中,该Ball部分变为:
Ball:
id: ball
size_hint: None, None
center: self.parent.center
只需添加size_hint.
我认为这足以让它发挥作用。
或者,您可以将size_hint加到您的Ball作为:
Ball:
id: ball
size_hint: None, None
center: self.parent.center
并改变pos: self.pos对pos: root.pos你的<Ball>:规则为:
<Ball>:
Image:
source: '58-Breakout-Tiles.png'
size: 15, 15
pos: root.pos
原始代码的主要问题是Image向 aWidget添加一个只是向Ball Widget. Widget不是 a 的ALayout不处理绘制其子项。原Pong游戏的把球图像中得到解决这个Canvas的Ball Widget。这Image门课基本上是为你做的。
添加回答
举报