TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.9 KiB
87 lines
2.9 KiB
<?php
|
|
|
|
/**
|
|
* 海贼王 · 斗地主 —— TypePHP / Win32 入口。
|
|
*
|
|
* 本文件替代原 libui 版 onepiece-doudizhu.php 的入口:不再依赖 libui 事件循环,
|
|
* 而是用 Win32 消息循环驱动 GameController(见 php-src/doudizhu/GameController.php)。
|
|
* 所有游戏逻辑(发牌 / 叫地主 / 出牌 / AI / 技能 / 渲染)均在 PHP 中实现,
|
|
* C++ 仅负责窗口、GDI 绘制原语与输入(cpp-src/win32.cc)。
|
|
*
|
|
* 编译:在 examples/onepiece-doudizhu-win32 目录执行
|
|
* tpc.exe project.yml
|
|
* 运行:生成的 .exe(无外部 PHP 依赖,纯 Win32 + GDI)。
|
|
*
|
|
* 注意:TypePHP 的 bin 模式会自动以 main() 作为程序入口,无需手动调用。
|
|
*/
|
|
|
|
// Win32 常量
|
|
const SW_SHOW = 5;
|
|
|
|
// win_peek_message() 返回的消息类型
|
|
const MSG_OTHER = 0;
|
|
const MSG_MOUSE_DOWN = 1;
|
|
const MSG_MOUSE_UP = 2;
|
|
const MSG_MOUSE_MOVE = 3;
|
|
const MSG_KEY_DOWN = 4;
|
|
|
|
use Yangweijie\Ui2\Games\OnePieceDoudizhu\GameController;
|
|
use Yangweijie\Ui2\Games\OnePieceDoudizhu\Sound;
|
|
|
|
function main(): void
|
|
{
|
|
\date_default_timezone_set('Asia/Shanghai');
|
|
\Yangweijie\Ui2\Games\OnePieceDoudizhu\ensureDdzFont();
|
|
|
|
$hWnd = win_create_window('海贼王 · 斗地主', GameController::WIN_W, GameController::WIN_H);
|
|
if ($hWnd == 0) {
|
|
echo "窗口创建失败!\n";
|
|
|
|
return;
|
|
}
|
|
win_show_window($hWnd, SW_SHOW);
|
|
|
|
$ctrl = new GameController();
|
|
$ctrl->hWnd = $hWnd;
|
|
$ctrl->newGame();
|
|
|
|
echo "海贼王 · 斗地主 已启动(Win32 / TypePHP)\n";
|
|
echo "提示:拖拽手牌选牌,底部按钮出牌/不出/提示/技能/托管,右上角切换音效。\n";
|
|
|
|
while (true) {
|
|
// 1) 处理所有待处理消息
|
|
while (true) {
|
|
$m = win_peek_message();
|
|
if (\count($m) === 0) {
|
|
break;
|
|
}
|
|
$type = $m[0] ?? MSG_OTHER;
|
|
if ($type === MSG_MOUSE_DOWN) {
|
|
$ctrl->onMouse((object) ['x' => $m[1], 'y' => $m[2], 'down' => 1, 'up' => 0, 'held' => 0]);
|
|
} elseif ($type === MSG_MOUSE_UP) {
|
|
$ctrl->onMouse((object) ['x' => $m[1], 'y' => $m[2], 'down' => 0, 'up' => 1, 'held' => 0]);
|
|
} elseif ($type === MSG_MOUSE_MOVE) {
|
|
$ctrl->onMouse((object) ['x' => $m[1], 'y' => $m[2], 'down' => 0, 'up' => 0, 'held' => $m[3]]);
|
|
} elseif ($type === MSG_KEY_DOWN) {
|
|
$ctrl->onKey((int) $m[1]);
|
|
}
|
|
// MSG_OTHER (例如 WM_PAINT) 已在 WndProc 中 ValidateRect,此处忽略
|
|
}
|
|
|
|
if (win_quit_requested()) {
|
|
break;
|
|
}
|
|
|
|
// 2) 触发到期的定时器(AI 走子 / 叫分 / 托管自动出牌)
|
|
$ctrl->tick();
|
|
|
|
// 3) 渲染当前帧(双缓冲,整窗重绘)
|
|
$ctrl->render();
|
|
|
|
// 4) 简单节流到 ~60 FPS
|
|
\usleep(16000);
|
|
}
|
|
|
|
Sound::instance()->unload();
|
|
echo "游戏结束,bye!\n";
|
|
}
|
|
|