gpt4 book ai didi

delphi - 在 Delphi 和 openGL 中按下多个箭头键来移动对象

转载 作者:行者123 更新时间:2023-12-02 07:42:15 26 4
gpt4 key购买 nike

我在delphi程序中有一个3d对象,我正在尝试编程以使用箭头键控制他在3d空间中的移动。

第一个问题:对于单箭头键,移动工作正常 - 对象根据按下的键转动或前进,但似乎不适用于多个按键。按下UP键和Left或Right键时,它会旋转但不会前进。

第二个问题:向上键移动有某种延迟。按下 UP 键后仅 0.5 秒,物体开始向前移动。这是为什么?

代码如下:

function KeyPressed(nKey: Integer): Boolean;
begin
Result := (GetAsyncKeyState(nKey) and $8000) <> 0;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if keypressed(VK_LEFT) then
if heroMove.angle < 360 then inc(heroMove.angle,5) else heroMove.angle:=0
else if keypressed(VK_RIGHT) then
if heroMove.angle < 360 then inc(heroMove.angle,-5) else heroMove.angle:=0 else
if keypressed(VK_UP) then
begin
heroMove.x:=heroMove.x+0.2*Sin(heroMove.angle*3.1415/180);
heroMove.y:=heroMove.y+0.2*Cos(heroMove.angle*3.1415/180);
pose:=1;
end;

if keypressed(VK_LEFT) and keypressed(VK_UP) then
begin
if heroMove.angle < 360 then inc(heroMove.angle,5) else heroMove.angle:=0;
heroMove.x:=heroMove.x+0.2*Sin(heroMove.angle*3.1415/180);
heroMove.y:=heroMove.y+0.2*Cos(heroMove.angle*3.1415/180);
pose:=1;
end else
if keypressed(VK_RIGHT) and keypressed(VK_UP) then
begin
if heroMove.angle < 360 then inc(heroMove.angle,-5) else heroMove.angle:=0;
heroMove.x:=heroMove.x+0.2*Sin(heroMove.angle*3.1415/180);
heroMove.y:=heroMove.y+0.2*Cos(heroMove.angle*3.1415/180);
pose:=1;
end;

end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=VK_UP then
pose:=0;
end;

附注参数“pose”只是控制对象的动画类型。

最佳答案

这里您需要的是停止使用事件驱动的编程方法。您需要切换到更传统的游戏编程风格。

您想要运行一个游戏循环,为您的程序提供稳定的脉冲。此循环的每次迭代都会检查键盘状态。为此,请使用GetAsyncKeyState。检查您感兴趣的每个键的状态。在游戏循环中,您还将驱动 OpenGL Canvas 的任何更新。

从您的更新中我可以看到您已经在使用 GetAsyncKeyState。但当用于响应 OnKeyDown 事件时,这确实没有多大意义。您可以使用事件驱动的同步 I/O,也可以使用轮询异步 I/O。我不明白你为什么试图混合这两种范式。

您调用 GetAsyncKeyState 的方式看起来错误。你应该这样写:

function KeyPressed(nKey: Integer): Boolean;
begin
Result := GetAsyncKeyState(nKey) < 0;
end;

我还建议在主循环的每次迭代中,您为每个键调用一次 GetAsyncKeyState 一次。将返回值保存到局部变量中。这避免了这样的情况:一个键在迭代开始时被认为是关闭的,但随后相同的键在迭代的稍后某个时刻又打开了。对于异步 I/O,这是您需要注意的一个问题。

关于delphi - 在 Delphi 和 openGL 中按下多个箭头键来移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com