我正在尝试使用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()
答案 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) 提问,他们将很乐意为您提供帮助。