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門課基本上是為你做的。
添加回答
舉報