猫史档案馆


【Python作品分享】雷达-1-1【作品秀】

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


【作品展示】

center_image

 

【作品介绍】

雷达——可以侦测的(左右键调位,空格发射)

 

【作品源代码】

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


回复

上一页1 页 / 共 0下一页