回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

用行空板M10加扩展版套装实现环球影城魔杖自由 简单

头像 米菲爸爸 2025.06.24 21 0

北京环球影城哈利波特区有十个互动区,购买正版互动魔杖就可以在魔法世界里互动。但是互动魔杖动辄349元起跳的价格着实让人亚历山大。作为一个理工男我从北京环球影城还没有开业就开始研究了那个互动游戏原理,终于让我有所发现。关于原理和互动魔杖制作请收看我专门的影片,影片链接在这里

https://www.bilibili.com/video/BV11G411g7Bm

当我拿到行空板扩展套装的时候我发现,巧了么这不是,这个扩展版就完美的拥有了互动魔杖的功能,随时可以运行的程序,自带电池自带红外线发射,这简直就是一根互动魔杖啊!

物料清单:

行空板M10

行空板M10电池扩展板

行空板M10外设扩展板

首先我们只要把pin脚15打开即可

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from unihiker import GUI
from pinpong.board import Board,Pin
Board().begin()

p_IR_tx=Pin(Pin.P15, Pin.OUT)
p_IR_tx.write_digital(1)

while True:
    pass

为了方便我在这里又增加了十张互动区域的图片

举例Wingardumleviosa.jpeg

图片中标记了互动区的位置及位置描述,互动手势,以及咒语的名称。用按键A和B来实现滚动翻页

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from unihiker import GUI
from pinpong.board import Board,Pin
import time

spell_list = ["ArrestoMomentumn", "Descendo",
            "Finiteincantatem","Herbivicus",
            "Incendio", "LocomotorMusicBox",
            "Revelio","Silencio",
            "Ventus","Wingardumleviosa",]
num = 0

def show(num):
    u_gui.draw_image(image="pic/"+spell_list[num]+".jpeg",x=0,y=0)

# 事件回调函数
def on_buttona_click_callback():
    global num
    num += 1
    num %= 10
    show(num)

def on_buttonb_click_callback():
    global num
    num -= 1
    num %= 10
    show(num)

u_gui=GUI()
u_gui.on_a_click(on_buttona_click_callback)
u_gui.on_b_click(on_buttonb_click_callback)
show(num)

Board().begin()
p_IR_tx=Pin(Pin.P15, Pin.OUT)
p_IR_tx.write_digital(1)

while True:
    pass

下面的部分属于气氛组,当我电机互动手势的时候会提示我咒语的发音导读(这一部分需要额外引入USB喇叭)可以选择不要。十个咒语都是我自己按实际发音录制的。

播放声音这里有一个小技术,因为m10提供的库中没有提供mouseclick方法,只能使用mousemove来代替,但是这样就会产生多次的重复事件,我根据咒语的长度上限3秒来允许调用声音的播放

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from unihiker import GUI
from unihiker import Audio
from pinpong.board import Board,Pin
import time

spell_list = ["ArrestoMomentumn", "Descendo",
            "Finiteincantatem","Herbivicus",
            "Incendio", "LocomotorMusicBox",
            "Revelio","Silencio",
            "Ventus","Wingardumleviosa",]
num = 0
last_play_time = 0

def show(num):
    u_gui.draw_image(image="pic/"+spell_list[num]+".jpeg",x=0,y=0)

# 播放声音的方法,5 秒内只能调用一次
def play_sound():
    global last_play_time
    current_time = time.time()
    # 检查是否距离上一次播放已经过去了 3 秒
    if current_time - last_play_time >= 3:
        u_audio.play("wav/"+spell_list[num]+".wav")
        last_play_time = current_time

# 事件回调函数
def on_buttona_click_callback():
    global num
    num += 1
    num %= 10
    show(num)

def on_buttonb_click_callback():
    global num
    num -= 1
    num %= 10
    show(num)

def mouse_move(x,y):
    if x > 90 and x < 145 and y > 190 and y < 245 :
        play_sound()

u_gui=GUI()
u_audio = Audio()
u_gui.on_a_click(on_buttona_click_callback)
u_gui.on_b_click(on_buttonb_click_callback)
u_gui.on_mouse_move(mouse_move)
show(num)
#u_gui.fill_rect(x=90,y=190,w=55,h=55,color="#0000FF")

Board().begin()
p_IR_tx=Pin(Pin.P15, Pin.OUT)
p_IR_tx.write_digital(1)
while True:
    pass

程序中用到的资源已经放到了附件里

好了!用你的行空板M10和扩展套装一起在环球影城互动起来吧!

附件

评论

user-avatar