巨蟒奇异果更新游戏比分

Python kivy updating game score(巨蟒奇异果更新游戏比分)

本文介绍了巨蟒奇异果更新游戏比分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Kivy上做了一个游戏,并试图在每次按下足球时将比赛比分更新为1。我正面临着这个问题。 在On_Touch_Down中(&P) Self.root.ids.game_screen.ids.label.score.text=str(int(self.root.ids.game_screen.ids.score.text)+1)

AttributeError:‘ball’对象没有‘Root’属性

这是我的代码!

main.py

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.image import Image
from kivy.core.audio import SoundLoader
from kivy.clock import Clock
from kivy.properties import NumericProperty
from kivy.vector import Vector


class HomeScreen(Screen):
    pass

def play_sound(self):
    sound = SoundLoader.load('button press sound.wav.')
    if sound:
        sound.play()


sound = SoundLoader.load('Crowd sound effect.wav')
sound.loop = True
sound.play()


class GameScreen(Screen):
    pass

def play_sound(self):
    sound = SoundLoader.load('button press sound.wav.')
    if sound:
        sound.play()


class Ball(Image):
    velocity = NumericProperty(0)


def on_touch_down(self, touch):
    if Vector(self.center).distance(touch.pos) <= 33:
        self.root.ids.game_screen.ids.label.score.text = str(int(self.root.ids.game_screen.ids.score.text)+1)
        sound = SoundLoader.load('Soccer ball sound.wav')
        sound.play()
        self.source = "icons/ball.png"
        self.velocity = 275
    return super().on_touch_down(touch)


def on_touch_up(self, touch):
    if Vector(self.center).distance(touch.pos) <= 33:
        self.source = "icons/ball.png"
    return super().on_touch_up(touch)


class MainApp(App):
    GRAVITY = 300


def move_ball(self, time_passed):
    ball = self.root.ids.game_screen.ids.ball
    ball.y = ball.y + ball.velocity * time_passed
    ball.velocity = ball.velocity - self.GRAVITY * time_passed


def start_game(self):
    Clock.schedule_interval(self.move_ball, 1/60.)
    self.root.ids.game_screen.ids.score.text = "0"


def change_screen(self, screen_name):
    self.root.current = screen_name




MainApp().run()

HomeScreen.kv

#:import utils kivy.utils
#:import FadeTransition kivy.uix.screenmanager.FadeTransition


<HomeScreen>:
    FloatLayout:
        canvas:
            Color:
                rgb: utils.get_color_from_hex("#39B3F2")
            Rectangle:
                size: self.size
                pos: self.pos
        GridLayout:
            rows: 1
            pos_hint: {"top": 1, "left": 1}
            size_hint: 1, .9
            Image:
                source: "icons/keepyup.png"
        FloatLayout:
            Button:
                font_size: dp(20)
                font_name: 'SackersGothicStd-Medium.otf'
                text: "PLAY"
                color: "gold"
                pos_hint: { "center_x": .5, "center_y": .3}
                size: 80, 55
                size_hint: None, None
                background_normal: ''
                background_color: (57/255.0, 179/255.0, 242/255.0, .10)


                on_press:

                on_release:
                    root.play_sound()
                    root.manager.transition = FadeTransition()
                    app.change_screen("game_screen")

Gamescreen.kv

#:import utils kivy.utils


<GameScreen>:
    FloatLayout:
        canvas:
            Color:
                rgb: utils.get_color_from_hex("#39B3F2")
            Rectangle:
                size: self.size
                pos: self.pos
        GridLayout:
            rows: 1
            pos_hint: {"top": 1, "left": 1}
            size_hint: 1, .1
            Image:
                source: "icons/sun.png"
        GridLayout:
            rows: 1
            pos_hint: {"top": 1, "left": 1}
            size_hint: 1, .2
            Image:
                source: "icons/clouds.png"
        GridLayout:
            rows: 1
            pos_hint: {"bottom": 1, "left": 1}
            size_hint: 1, .5
            Image:
                source: "icons/Field4.png"
                allow_stretch: True
                keep_ratio: False
                pos: self.pos

        Label:
            id: score
            size_hint: None, None
            font_size: dp(25)
            font_name: 'SackersGothicStd-Medium.otf'
            text: "0"
            color: "gold"
            pos_hint: { "center_x": 0.1, "center_y": 0.9}

        Button:
            size_hint: None, None
            font_size: dp(20)
            font_name: 'SackersGothicStd-Medium.otf'
            text: "Start Game"
            color: "gold"
            pos_hint: { "center_x": 0.5, "center_y": 0.3}
            size: 150, 55
            size_hint: None, None
            background_normal: ''
            background_color: (57/255.0, 179/255.0, 242/255.0, .10)


            on_release:
                self.disabled = True
                self.opacity = 0
                root.play_sound()
                app.start_game()


        Ball:
            source: "icons/ball.png"
            size_hint: None, None
            size: 500, 500
            pos_hint: {"center_x": 0.5}
            id: ball

main.kv

#:include kv/homescreen.kv
#:include kv/gamescreen.kv


ScreenManager:
    id: screen_manager
    HomeScreen:
        name: "home_screen"
        id: home_screen
    GameScreen:
        name: "game_screen"
        id: game_screen

推荐答案

您的代码:

self.root.ids.game_screen.ids.label.score.text = str(int(self.root.ids.game_screen.ids.score.text)+1)
正在尝试访问Ball对象(self.root)的root属性,但您的Ball没有root属性。这样您就会得到所描述的错误。

您可以通过访问Approot属性来完成您想要的操作。尝试将上一行替换为:

        label = App.get_running_app().root.get_screen('game_screen').ids.score
        label.text = str(int(label.text)+1)

这篇关于巨蟒奇异果更新游戏比分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:巨蟒奇异果更新游戏比分