【问题标题】:Keyboard Management in PascalPascal 中的键盘管理
【发布时间】:2019-10-22 17:00:11
【问题描述】:

我是 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;  

我希望代码在按键被按下时运行良好,并且一旦释放,块应该会达到正常高度,然后程序将根据其主循环运行,但在此过程之外。

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

【问题讨论】:

  • 请发布您的实际代码。没有它,我们无法判断您做错了什么。 (这样想——告诉你的汽车修理工,“我的车发出奇怪的声音。它是一辆红色的车,看起来像停在那里的那辆。我的车出了什么问题?”。你会期待答案吗?我希望不会。)我们无法从这里读取您的代码(或您的想法);我们只有您提供给我们的东西。请编辑您的问题并发布您的实际代码;发布时通过根据需要将每行缩进四个(或更多)空格来格式化它,以便它可读,并在您输入的位置下方预览。谢谢。
  • 这里是代码:pastebin.com/AqkD90kL
  • 快到了。 :-) 首先,您的代码需要here,而不是pastebin。如果由于某种原因 pastebin 已关闭或链接消失,您的问题将变得毫无意义。其次,你发布了太多方式的代码;您只需要在此处发布有关处理密钥的部分。 StackOverflow is not going to read all that - 将其减少到给您带来麻烦的部分,并在此处发布您的问题。我们很想帮助你,但是这里有很多问题,你需要通过提出好的问题来帮助我们。谢谢。 :-)
  • 我又改了。很抱歉给您带来不便,如果我再次做错了什么,请告诉我。 ;)
  • 您需要对键盘进行比KeyPressedReadKey 更全面的控制才能实现您想要的。 This tutorial(Word 文档)关于如何在 Pascal 中制作键盘处理程序可能是一个很好的起点。我怀疑周围肯定有很多现成的单元,也有源代码,但我只设法在俄语中遇到this site(有一些部分是英文),在那里你可以下载带有源代码的工作示例(不是全部他们是你需要的!)。

标签: keyboard pascal freepascal


【解决方案1】:

它不起作用,因为在每个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.

【讨论】:

    【解决方案2】:

    如果你使用 freepascal/Lazarus:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 2014-03-03
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多