亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Kivy:對象運動/更新問題(Kivy Pong 教程改編)

Kivy:對象運動/更新問題(Kivy Pong 教程改編)

呼啦一陣風 2022-01-05 10:22:27
我改編了 kivy pong 教程 ( https://kivy.org/doc/stable/tutorials/pong.html ) 的一部分來創建一個應該每秒更新 60 次的球類,在屏幕上移動球。同樣,當球擊中兩側時,應向相反方向反射。然而,球只是坐在屏幕的角落一動不動。我犯的語法/邏輯錯誤是什么?這是我的代碼:from kivy.lang import Builderfrom kivy.app import Appfrom kivy.uix.boxlayout import BoxLayoutfrom kivy.uix.image import Imagefrom kivy import Configfrom kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition,\SlideTransitionfrom kivy.uix.widget import Widgetfrom kivy.animation import Animationfrom kivy.properties import NumericProperty, ReferenceListProperty,\ObjectPropertyfrom kivy.clock import Clockfrom kivy.vector import Vectorfrom random import randintBuilder.load_string('''<Ball>:    Image:        source: '58-Breakout-Tiles.png'        size: 15, 15        pos: self.pos<SettingsScreen>:    close: close    AnchorLayout:        anchor_x: 'left'        anchor_y: 'top'        Image:            id: close            size_hint: .03, .03            source: 'grey_crossGrey.png'    GridLayout:        cols: 2        Label:            font_name: 'vgafix.fon'            text: 'Music: '        Switch:            active: True        Label:            font_name: 'vgafix.fon'            text: 'Sounds: '        Switch:            active: True<MenuScreen>:    cog: cog    AnchorLayout:        anchor_x: 'right'        anchor_y: 'top'        Image:            id: cog            size_hint: .03, .03            source: 'settings-cog.png'    BoxLayout:        orientation: 'vertical'        Image:            source: 'brickbreaker log.png'        Label:            font_name: 'vgafix.fon'            text: 'Tap to start'<GameScreen>:    ball: ball    cog: cog    AnchorLayout:        anchor_x: 'right'        anchor_y: 'top'        Image:            id: cog            size_hint: .03, .03            source: 'settings-cog.png'    Ball:        id: ball        center: self.parent.center''')
查看完整描述

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()possize

片段 - 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)

通常,您將使用源屬性而不是紋理。


查看完整回答
反對 回復 2022-01-05
?
慕姐4208626

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門課基本上是為你做的。


查看完整回答
反對 回復 2022-01-05
  • 2 回答
  • 0 關注
  • 255 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號