■ OnKeyDownの処理

[Delphi Q & A 掲示板] [過去ログの一覧]


プレアデスV世 2009/03/31(火) 14:48:25
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_RIGHT:
    begin
      FMyPtn.Cmd := cmdActive; //FMyPtn はクラス
      FMyPtn.Houkou := diRight;
    end;
    VK_LEFT:
    begin
      FMyPtn.Cmd := cmdActive;
      FMyPtn.Houkou := diLeft;
    end;
    VK_SPACE:
    GeigekidanOn( FMyPtn.X, FMyPtn.Y );
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  UraGamen.Canvas.CopyRect( UraGamen.Canvas.ClipRect,
                            Haikei.Canvas,
                            UraGamen.Canvas.ClipRect );
  if FMyPtn <> nil then FMyPtn.Move;  //操作用キャラクタの移動処理
  for i := 1 to GD_MAX do  //迎撃弾の移動処理
    if FGeigekidan[i] <> nil then  FGeigekidan[i].Move;
  OmoteGamen.Canvas.CopyRect( OmoteGamen.Canvas.ClipRect,
                              UraGamen.Canvas,
                              OmoteGamen.Canvas.ClipRect );
  //  if (GetKeyState(VK_SPACE) < 0) then
  // GeigekidanOn( FMyPtn.X, FMyPtn.Y );
end;

プレアデスV世 2009/03/31(火) 14:53:14
 質問を書き忘れていました。
 シューティングゲームで左右キーを押しながらスペースキーで迎撃弾を
連射するにはどうしたらいいのでしょう? 上記のコードでは、一端スペースキーを上げて押さないと弾は発射されません。

そりゃ 2009/03/31(火) 23:07:52
押しっぱなしで認識するならKeyPressでイベント起こすか、
メイン処理の中でフレームごとにSpaceを押してるかどうか検出したら?
あるいはKeyDownでフラグON、KeyUpでフラグOFFにして、
フラグを検出して弾を出すとか

そりゃKeyDownは押したときに発生するから、何度も実行するには
そのたびに押さなきゃだめでしょ

ん? 2009/03/31(火) 23:36:27
> //  if (GetKeyState(VK_SPACE) < 0) then
> // GeigekidanOn( FMyPtn.X, FMyPtn.Y );
ココは何でコメント化したのかな?
このGetKeyStateによるKeyチェックで連射できるんじゃないの?

予想 2009/04/01(水) 01:16:00
>ココは何でコメント化したのかな?
多分、最初はそれでやってみたけれどうまくいかなかったのでOnKeyDownイベントにしてみたってとこではないかと。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_RIGHT:
    begin
      FMyPtn.Cmd := cmdActive; //FMyPtn はクラス
      FMyPtn.Houkou := diRight;
    end;
    VK_LEFT:
    begin
      FMyPtn.Cmd := cmdActive;
      FMyPtn.Houkou := diLeft;
    end;
    VK_SPACE:
    begin
      Beep;
      GeigekidanOn( FMyPtn.X, FMyPtn.Y );
    end;
  end;
end;

というようにスペースが押されたときにBeepを鳴らすようにしてみて、
「ボ、ボボボボボボ…」とBeepが連続で鳴るなら(通常は鳴る)弾の発射処理を間違えているのではないかな。

プレアデスV世 2009/04/01(水) 01:16:12
[[解決]]

 そうですね。というかこういう場合でのキー操作はGetKeyStateだけでやった方がいいようですね。タイトルのセレクトなどのカーソル選択が必要な時はOnKeyDownが使いやすいかもしれませんが。

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library