用户:
yj皓月当空查看:0 回复:0 评论:0 创建时间:2020-07-25T18:37:24
【作品展示】

【作品介绍】
雷达——可以侦测的(左右键调位,空格发射)
【作品源代码】
from arcade import *
# 窗体宽高
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
# 设置窗体标题
SCREEN_TITLE = "雷达"
# 雷达状态常量
RADAR_INIT = 0
RADAR_SEND = 1
RADAR_REFLEX = 2
class Target():
def __init__(self):
self.x, self.y = random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)
def draw(self):
draw_point(self.x, self.y, color.RED, 20)
class Wave():
def __init__(self, send_angle, reflex_x, reflex_y):
self.send_angle = send_angle
self.send_x, self.send_y = SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2
self.send_r = 0
self.reflex_x, self.reflex_y = reflex_x, reflex_y
self.reflex_r = 0
def draw_send_wave(self):
ox, oy = SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2
self.send_x, self.send_y = ox + self.send_r * math.sin(
math.radians(self.send_angle)), oy + self.send_r * math.cos(math.radians(self.send_angle)),
draw_point(self.send_x, self.send_y, color.BLACK, 10)
self.send_r += 3
def draw_reflex_wave(self):
# 绘制反射波
draw_circle_outline(self.reflex_x, self.reflex_y, self.reflex_r, color.BLUE, 3)
self.reflex_r += 3
class MyRadar(arcade.Window):
def __init__(self, width, height, title):
super().__init__(width, height, title)
# 窗体初始化
self.setup()
def setup(self):
# 设置窗体颜色
set_background_color(color.WHITE)
self.angle = 0
self.change_angle = 0
self.status = RADAR_INIT
self.target = Target()
self.wave = Wave(self.angle, self.target.x, self.target.y)
def on_draw(self):
start_render()
self.draw_radar()
self.target.draw()
if self.status == RADAR_SEND:
self.wave.draw_send_wave()
elif self.status == RADAR_REFLEX:
self.wave.draw_reflex_wave()
def on_update(self, delta_time):
self.angle += self.change_angle
if self.status == RADAR_SEND:
# 移出屏幕
if self.wave.send_x > SCREEN_WIDTH or self.wave.send_y > SCREEN_HEIGHT \
or self.wave.send_x < 0 or self.wave.send_y < 0:
self.status = RADAR_INIT
dis = math.hypot(self.wave.send_x - self.target.x ,self.wave.send_y - self.target.y)
if dis <= 10:
self.status = RADAR_REFLEX
elif self.status == RADAR_REFLEX:
dis = math.hypot(self.target.x - SCREEN_WIDTH // 2, self.target.y - SCREEN_HEIGHT // 2)
if self.wave.reflex_r >= dis:
self.status = RADAR_INIT
def on_key_press(self, symbol, modifiers):
if symbol == key.LEFT:
self.change_angle = -1
elif symbol == key.RIGHT:
self.change_angle = 1
def on_key_release(self, symbol, modifiers):
if symbol == key.SPACE and self.status == RADAR_INIT:
self.status = RADAR_SEND
self.wave = Wave(self.angle, self.target.x, self.target.y)
if symbol == key.LEFT or symbol == key.RIGHT:
self.change_angle = 0
def draw_radar(self):
ox, oy = SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2
# 雷达底盘坐标
ax, ay = ox - 25, oy - 80
bx, by = ox, oy - 80
cx, cy = ox + 25, oy - 80
# 雷达底盘代码(下)
draw_line(ox, oy, bx, by, color.BLACK, 5)
draw_line(ax, ay, cx, cy, color.BLACK, 5)
# 雷达收发机(椭圆(中))
draw_ellipse_filled(ox, oy, 100, 40, color.BLACK, 180 - self.angle)
# 雷达天线(上)
R = 50
dx, dy = ox + R * math.sin(math.radians(self.angle)), oy + R * math.cos(math.radians(self.angle))
draw_line(ox, oy, dx, dy, color.BLACK, 5)
if __name__ == '__main__':
game = MyRadar(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
run()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn