2

我是 Pascal 的初学者,我正在开发一个小型 WIngraph 游戏。在游戏的某个时刻,角色(即一个方块)必须躺下(方块得到其原始高度的一半)。我希望在按住向下箭头键时发生这种情况,但我实现它的方式实际上并没有奏效。我遇到的另一个问题是我不知道如何同时读取键(例如,向右跑和跳跃时需要这样做)。

这就是我尝试编写它的方式:

procedure joystick;
begin
  key:=readkey;
  case key of 
  #0:begin  
  key:=readkey;  
    case key of  
    #80:with block do  
       begin  
        y1:=y2-100; //make it get half of its height  
        repeat  
         moveblock; //these are the drawing routines.   
         moveball;  //they are in another procedure, which is the 'main loop'   
         collisioncheck;  
         draw;      //i expected the code to run inside here with the block's  
         alternateball; //height changed, and as soon as the arrow key gets released  
         updateGraph(updateNow);  //it should go back to the 'main loop'  
         killball;  
         delay(10);  
        until keypressed = false; //<--thats what i think is not working  
        y1:=y2-200; //this would make the block get normal again  
       end;  
     end;  
   end;      
 end;  

我希望代码在按键被按下时运行良好,一旦它被释放,块应该得到它的正常高度,然后程序将根据它的主循环运行,但在这个过程之外。

一切正常,除了那个拿钥匙的东西。

4

2 回答 2

4

它不起作用,因为在每个之后keypressed()你应该有一个readkey(). 该函数keypressed()返回 true,直到您readkey()再次调用。

演示:

uses crt;
var c:char;
    i:longint;
begin
while c<>#27 do
  begin
  while not keypressed() do
    begin
    clrscr;
    writeln('not pressing anything');
    delay(500);
    end;
  i:=0;
  while keypressed() do
    begin
    clrscr;
    c:=readkey();
    if(c=#0) then
      c:=readkey();
    inc(i);
    writeln(c,' ',i);
    delay(300);
    end;
  end
end.
于 2012-06-01T19:19:05.527 回答
4

如果你使用 freepascal/Lazarus:

  • 不要将 unit crt与 wingraph 一起使用,而是使用wincrt。Wingraph 挂钩到 win32 GUI 事件,而 (win32) crt 通过控制台 API 调用挂钩到作品。Wincrt 挂钩到 GUI(消息泵)事件。
  • 最好不要使用 *crt,但最好使用单位键盘
  • 看看 Free Pascal 示例,它包含几个小游戏(俄罗斯方块和相同游戏实现),它们也可以选择使用 wingraph 和单位键盘。甚至还有一些用于高分的单元,以及在键盘和 wingraph 之上的简单行编辑程序。

下次,请提供有关您使用的开发平台(和版本)的更准确的详细信息。

于 2012-06-02T10:01:41.030 回答