- 实现了完整的Android游戏框架 (Kotlin + Jetpack Compose) - 科技暗黑风格UI设计与终端风格界面组件 - 完整的故事系统 (主线+支线剧情) - 固定底部操作区布局,解决选择按钮可见性问题 - 集成Gemini AI智能对话支持 - 游戏状态管理与存档系统 - 动态天气系统与角色状态跟踪 - 支持离线游戏,兼容Android 11+
216 lines
7.5 KiB
Python
Executable File
216 lines
7.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
快速音频设置脚本
|
|
为游戏创建音频文件 - 组合了下载和占位文件创建
|
|
"""
|
|
|
|
import os
|
|
import requests
|
|
import time
|
|
from pathlib import Path
|
|
|
|
TARGET_DIR = "app/src/main/res/raw"
|
|
|
|
# 可靠的免费音频下载链接
|
|
RELIABLE_DOWNLOADS = {
|
|
# 从 opengameart.org 和其他可靠的免费资源
|
|
"button_click.mp3": "https://opengameart.org/sites/default/files/button-09.wav",
|
|
"notification_beep.mp3": "https://opengameart.org/sites/default/files/notification.wav",
|
|
"error_alert.mp3": "https://opengameart.org/sites/default/files/error.wav",
|
|
"discovery_chime.mp3": "https://opengameart.org/sites/default/files/pickup.wav",
|
|
}
|
|
|
|
# 无法下载的文件将创建占位符
|
|
ALL_AUDIO_FILES = [
|
|
("ambient_mystery.mp3", "神秘氛围音乐 - 适合探索场景"),
|
|
("electronic_tension.mp3", "电子紧张音乐 - 适合危险场景"),
|
|
("orchestral_revelation.mp3", "管弦乐启示 - 适合重大发现"),
|
|
("epic_finale.mp3", "史诗终章 - 适合游戏结局"),
|
|
("ventilation_soft.mp3", "轻柔通风音效 - 基地背景音"),
|
|
("heart_monitor.mp3", "心率监控音效 - 医疗舱音效"),
|
|
("reactor_hum.mp3", "反应堆嗡鸣 - 工业区背景音"),
|
|
("space_silence.mp3", "太空寂静 - 外太空氛围"),
|
|
("wind_gentle.mp3", "微风音效 - 晴朗天气"),
|
|
("rain_light.mp3", "小雨音效 - 下雨天气"),
|
|
("storm_cyber.mp3", "电子风暴 - 特殊天气"),
|
|
("solar_storm.mp3", "太阳风暴 - 极端天气"),
|
|
("button_click.mp3", "按钮点击音效 - UI反馈"),
|
|
("notification_beep.mp3", "通知提示音 - 系统通知"),
|
|
("error_alert.mp3", "错误警报音 - 错误提示"),
|
|
("discovery_chime.mp3", "发现音效 - 物品发现"),
|
|
("time_distortion.mp3", "时间扭曲音效 - 特殊事件"),
|
|
("oxygen_leak_alert.mp3", "氧气泄漏警报 - 紧急情况"),
|
|
]
|
|
|
|
def create_directories():
|
|
"""创建必要的目录"""
|
|
Path(TARGET_DIR).mkdir(parents=True, exist_ok=True)
|
|
print(f"📁 目录已准备: {TARGET_DIR}")
|
|
|
|
def try_download(url, filename):
|
|
"""尝试下载文件"""
|
|
file_path = Path(TARGET_DIR) / filename
|
|
|
|
if file_path.exists():
|
|
print(f"✅ 已存在: {filename}")
|
|
return True
|
|
|
|
print(f"⬇️ 尝试下载: {filename}")
|
|
|
|
try:
|
|
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'}
|
|
response = requests.get(url, headers=headers, timeout=10, stream=True)
|
|
|
|
if response.status_code == 200:
|
|
with open(file_path, 'wb') as f:
|
|
for chunk in response.iter_content(chunk_size=8192):
|
|
if chunk:
|
|
f.write(chunk)
|
|
print(f"✅ 下载成功: {filename}")
|
|
return True
|
|
else:
|
|
print(f"❌ 下载失败: {filename} (HTTP {response.status_code})")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ 下载错误: {filename} - {e}")
|
|
return False
|
|
|
|
def create_audio_placeholder(filename, description):
|
|
"""创建音频占位文件"""
|
|
file_path = Path(TARGET_DIR) / filename
|
|
|
|
if file_path.exists():
|
|
return
|
|
|
|
# 创建一个简单的文本占位文件
|
|
placeholder_content = f"""AUDIO PLACEHOLDER FILE
|
|
音频占位文件
|
|
|
|
文件名: {filename}
|
|
描述: {description}
|
|
|
|
这是一个占位文件,用于测试音频系统架构。
|
|
要获得完整的游戏体验,请下载真实的音频文件。
|
|
|
|
推荐下载网站:
|
|
1. https://pixabay.com/sound-effects/ (免费,无需注册)
|
|
2. https://freesound.org/ (免费,需注册)
|
|
3. https://opengameart.org/ (开源游戏音频)
|
|
|
|
下载后,请将文件重命名为: {filename}
|
|
并放置在目录: {TARGET_DIR}/
|
|
|
|
提示: 运行 ./audio_rename.sh 可以自动重命名下载的文件
|
|
"""
|
|
|
|
try:
|
|
with open(file_path, 'w', encoding='utf-8') as f:
|
|
f.write(placeholder_content)
|
|
print(f"📄 占位符已创建: {filename}")
|
|
except Exception as e:
|
|
print(f"❌ 创建占位符失败: {filename} - {e}")
|
|
|
|
def create_download_instructions():
|
|
"""创建下载说明文件"""
|
|
instructions_file = Path(TARGET_DIR) / "README_AUDIO.txt"
|
|
|
|
instructions = """音频文件下载说明
|
|
=================
|
|
|
|
本目录包含游戏所需的 18 个音频文件。
|
|
|
|
当前状态:
|
|
- ✅ 部分文件可能已通过脚本自动下载
|
|
- 📄 其他文件为占位符,需要手动下载替换
|
|
|
|
手动下载步骤:
|
|
1. 访问 https://pixabay.com/sound-effects/
|
|
2. 搜索对应的音效类型 (例如: "button click", "ambient space")
|
|
3. 下载 MP3 格式的音频文件
|
|
4. 重命名为对应的文件名 (如 button_click.mp3)
|
|
5. 替换本目录中的占位符文件
|
|
|
|
自动化工具:
|
|
- 运行 ../../../audio_rename.sh 自动重命名下载的文件
|
|
- 查看 ../../../AUDIO_DOWNLOAD_GUIDE.md 获取详细下载指南
|
|
|
|
测试音频系统:
|
|
即使使用占位文件,游戏的音频系统也能正常运行,
|
|
这样你就可以先测试功能,稍后再添加真实音频。
|
|
|
|
编译游戏:
|
|
cd ../../../
|
|
./gradlew assembleDebug
|
|
|
|
下载完成后,游戏将拥有完整的音频体验!
|
|
"""
|
|
|
|
try:
|
|
with open(instructions_file, 'w', encoding='utf-8') as f:
|
|
f.write(instructions)
|
|
print(f"📖 说明文件已创建: {instructions_file.name}")
|
|
except Exception as e:
|
|
print(f"❌ 创建说明文件失败: {e}")
|
|
|
|
def main():
|
|
"""主函数"""
|
|
print("🎵 快速音频设置工具")
|
|
print("=" * 40)
|
|
print("🎯 目标: 为游戏设置完整的音频文件集")
|
|
print("💡 策略: 下载 + 占位符 = 立即可测试")
|
|
print()
|
|
|
|
# 创建目录
|
|
create_directories()
|
|
|
|
# 尝试下载可靠的文件
|
|
print("⬇️ 尝试下载可用的音频文件...")
|
|
download_count = 0
|
|
for filename, url in RELIABLE_DOWNLOADS.items():
|
|
if try_download(url, filename):
|
|
download_count += 1
|
|
time.sleep(1) # 避免请求过频
|
|
|
|
print(f"\n📊 下载统计: {download_count}/{len(RELIABLE_DOWNLOADS)} 个文件成功下载")
|
|
|
|
# 为所有文件创建占位符(如果不存在)
|
|
print(f"\n📄 创建完整的音频文件集 ({len(ALL_AUDIO_FILES)} 个文件)...")
|
|
for filename, description in ALL_AUDIO_FILES:
|
|
create_audio_placeholder(filename, description)
|
|
|
|
# 创建说明文件
|
|
create_download_instructions()
|
|
|
|
# 检查结果
|
|
audio_files = list(Path(TARGET_DIR).glob("*"))
|
|
print(f"\n📂 音频目录文件总数: {len(audio_files)}")
|
|
|
|
# 最终说明
|
|
print("\n🎉 音频设置完成!")
|
|
print("\n✅ 你现在可以:")
|
|
print(" 1. 立即编译并测试: ./gradlew assembleDebug")
|
|
print(" 2. 音频系统界面将正常显示")
|
|
print(" 3. 所有音频功能都可以测试")
|
|
|
|
print("\n🎵 要获得完整音频体验:")
|
|
print(" 1. 访问 https://pixabay.com/sound-effects/")
|
|
print(" 2. 下载对应类型的音频文件")
|
|
print(" 3. 使用 ./audio_rename.sh 自动重命名")
|
|
print(" 4. 或查看 AUDIO_DOWNLOAD_GUIDE.md 详细指南")
|
|
|
|
if download_count > 0:
|
|
print(f"\n🎊 已有 {download_count} 个真实音频文件!")
|
|
|
|
print(f"\n📁 音频文件位置: {TARGET_DIR}/")
|
|
print("🔧 占位符确保系统正常运行,真实音频提升体验")
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
print("\n⏹️ 设置中断")
|
|
except Exception as e:
|
|
print(f"\n💥 设置错误: {e}")
|
|
print("请检查目录权限和网络连接")
|