创建稳定的图像Python Arcade

时间:2018-11-09 17:57:04

标签: python

我正在尝试使用Python Arcade库编写一个程序,其中用户按下空格键会导致屏幕上出现一个红色圆圈。但是,每当我按空格键时,图像都会出现,但会非常快速地闪烁,就像每秒被绘制,擦除和重新绘制几次一样。我要这样做,所以在按空格键后,圆圈将保留在屏幕上而不会闪烁。下面是我正在使用的代码。

import arcade

SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600

class Ball:
    def __init__(self, x , y, radius, color):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color

    def draw(self):
        arcade.draw_circle_filled(self.x, self.y, self.radius, self.color)


class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)

        arcade.set_background_color(arcade.color.ASH_GREY)

        self.ball=Ball(300, 300, 50, arcade.color.AUBURN)

        arcade.start_render()

    def on_key_press(self, key, modifiers):
        if key == arcade.key.SPACE:
            self.ball.draw()

def main():
    window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, "Press spacebar")
    arcade.run()

if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:0)

我没有安装arcade库,但是在我看来,您可以简单地使用跟踪变量来检查是否已按下空格键。

class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)
        self.first_press = False # added tracking variable

        arcade.set_background_color(arcade.color.ASH_GREY)

        self.ball=Ball(300, 300, 50, arcade.color.AUBURN)

        arcade.start_render()

    def on_key_press(self, key, modifiers):
        # added an "and" clause to the if statement to check tracking variable
        if key == arcade.key.SPACE and self.first_press == False:
            self.ball.draw()
            # with this change this if statement will no longer trigger after first press.
            self.first_press = True 

答案 1 :(得分:0)

根据我使用 Arcade 的经验,绘制圆圈的位置是 def on_draw(self):。你把它放在你的 MyGame 类中,然后在 arcade.start_render() 之后画出你想要的东西(所以这就是你的 self.ball.draw() 去的地方)。由于您想让对象 Ball 出现在您的屏幕上,因此您可以创建一个触发变量来使其出现。

以下是基于您的代码的示例:

import arcade

SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600


class Ball:
    def __init__(self, x, y, radius, color):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color

    def draw(self):
        arcade.draw_circle_filled(self.x, self.y, self.radius, self.color)


class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)

        arcade.set_background_color(arcade.color.ASH_GREY)

        self.ball = Ball(300, 300, 50, arcade.color.AUBURN)
        self.show_ball = False

        arcade.start_render()

    def on_draw(self):
        arcade.start_render()

        # will draw the ball if self.show_ball is True
        if self.show_ball:
            self.ball.draw()

    def on_key_press(self, key, modifiers):
        if key == arcade.key.SPACE:
            self.show_ball = True


def main():
    window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, "Press spacebar")
    arcade.run()


if __name__ == "__main__":
    main()

在我看来,dataclass 的使用可能很有趣,因为球基本上只是数据,我认为它会更容易阅读(我认为这不是标准,只是方式我是在学校学的)。 根据我的建议,它会给你:

import arcade
from dataclasses import dataclass

SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600

@dataclass
class Ball:
    x: int
    y: int
    radius: int
    color: (int, int, int)

    def draw(self):
        arcade.draw_circle_filled(self.x, self.y, self.radius, self.color)


class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)

        arcade.set_background_color(arcade.color.ASH_GREY)

        self.ball = Ball(300, 300, 50, arcade.color.AUBURN)
        self.show_ball = False

        arcade.start_render()

    def on_draw(self):
        arcade.start_render()

        # will draw the ball if self.show_ball is True
        if self.show_ball:
            self.ball.draw()

    def on_key_press(self, key, modifiers):
        if key == arcade.key.SPACE:
            self.show_ball = True


def main():
    window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, "Press spacebar")
    arcade.run()


if __name__ == "__main__":
    main()

如果您对街机图书馆有任何其他问题,请随时向 Discord 服务器 (https://discord.gg/s4ctsYbC) 提问,他们将很乐意为您提供帮助。