在自己的虚拟机Ubuntu系统下,逐步编译 mininim源码(波斯王子重制开源版)
指令流程
bash
sudo apt-get remove liballegro5-dev liballegro-image5-dev \
liballegro-audio5-dev liballegro-acodec5-dev liballegro-dialog5-dev
sudo apt-get install automake autoconf gcc make gnulib cmake lua50 \
liblua50-dev liblualib50-dev libreadline-dev
sudo apt-get build-dep allegro5
git clone https://github.com/oitofelix/allegro5.git
cd allegro5
cmake
make
sudo make install
cd ..
git clone https://github.com/oitofelix/mininim.git
cd mininim
./bootstrap
./configure LUA_LIB="-llua50 -llualib50"
make
./mininim
进入allegro5文件夹里有对应的cmake文件,但此时还不能直接cmake
在 CMakeLists.txt 文件中的 find_package(OpenGL) 之前添加set(OpenGL_GL_PREFERENCE GLVND) 。
这样配置后,CMake 会使用 GLVND(现代 OpenGL)而不是传统的 LEGACY 库。
bash
#若运行cmake报如下错误
X11 support requires Xcursor library.
#则去安装Xcursor 库
sudo apt-get install libgl1-mesa-dev libx11-dev libglx-dev
#安装完后删掉之前cmake的程序,再去cmake就可以了
rm -rf CMakeCache.txt CMakeFiles
走完最后的流程就可以运行该游戏了
将编译好的mininim的二进制执行程序、游戏资源库data,已经执行程序所依赖的各种动态链接库,打包,复制到另外一台Ubuntu系统,直接运行
将上面mininim目录里的mininim可执行文件复制到另外一台Ubuntu系统的home目录,mininim文件里的data文件和lib文件也一起打包移植
在该移植目录下运行可执行mininim就可以play了
在树莓派上完成编译 mininim源码,并成功运行
树莓派也是linux系统,将移植包放入树莓派中解压,运行可执行的mininim,可以使用XTerminal或者VNC,两者都是带有可视化图像界面的。
在Android手机上 编译mininim游戏,并运行
Android手机也是同样的操作,需要在手机上安装NSC软件去开启ssh连接,访问手机ip和用户名,设置ssh端口,使用XTerminal去连接手机。
在树莓派3B上用python编程完成流水灯实验
python
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
import atexit
import signal
# 配置参数
PWM_PIN = 18 # BCM编号18引脚
FREQUENCY = 1000 # PWM频率1kHz
DUTY_CYCLE = 50 # 初始占空比50%
class SafePWMController:
def __init__(self):
self.pwm = None
self._setup()
self._register_handlers()
def _setup(self):
"""初始化GPIO和PWM"""
try:
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # 使用BCM编号
GPIO.setup(PWM_PIN, GPIO.OUT)
self.pwm = GPIO.PWM(PWM_PIN, FREQUENCY)
self.pwm.start(DUTY_CYCLE)
print(f"PWM已启动,引脚BCM {PWM_PIN},频率{FREQUENCY}Hz")
except Exception as e:
self._cleanup()
raise RuntimeError(f"初始化失败: {str(e)}")
def _register_handlers(self):
"""注册退出处理函数"""
atexit.register(self._cleanup) # 正常退出
signal.signal(signal.SIGTERM, self._signal_handler) # kill命令
signal.signal(signal.SIGINT, self._signal_handler) # Ctrl+C
def _signal_handler(self, signum, frame):
"""信号处理函数"""
print(f"\n接收到终止信号 {signum},正在清理资源...")
self._cleanup()
exit(0)
def _cleanup(self):
"""安全清理资源"""
if self.pwm is not None:
try:
self.pwm.stop()
print("PWM已停止")
except Exception as e:
print(f"停止PWM时出错: {str(e)}")
finally:
self.pwm = None
try:
GPIO.cleanup()
print("GPIO资源已释放")
except Exception as e:
print(f"清理GPIO时出错: {str(e)}")
def run(self):
"""主运行循环"""
try:
while True:
# 在这里添加您的PWM控制逻辑
# 示例:呼吸灯效果
for dc in range(0, 101, 5):
self.pwm.ChangeDutyCycle(dc)
time.sleep(0.1)
for dc in range(100, -1, -5):
self.pwm.ChangeDutyCycle(dc)
time.sleep(0.1)
except Exception as e:
print(f"运行时错误: {str(e)}")
raise
finally:
self._cleanup()
if __name__ == "__main__":
try:
controller = SafePWMController()
controller.run()
except KeyboardInterrupt:
print("程序被用户中断")
except Exception as e:
print(f"程序异常: {str(e)}")
finally:
print("程序退出")
效果展示: