OnKeyDownの処理

解決


プレアデスⅢ世  2009-03-31 23:48:25  No: 33800

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;


プレアデスⅢ世  2009-03-31 23:53:14  No: 33801

質問を書き忘れていました。
  シューティングゲームで左右キーを押しながらスペースキーで迎撃弾を
連射するにはどうしたらいいのでしょう?  上記のコードでは、一端スペースキーを上げて押さないと弾は発射されません。


そりゃ  2009-04-01 08:07:52  No: 33802

押しっぱなしで認識するならKeyPressでイベント起こすか、
メイン処理の中でフレームごとにSpaceを押してるかどうか検出したら?
あるいはKeyDownでフラグON、KeyUpでフラグOFFにして、
フラグを検出して弾を出すとか

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


ん?  2009-04-01 08:36:27  No: 33803

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


予想  2009-04-01 10:16:00  No: 33804

>ココは何でコメント化したのかな?
多分、最初はそれでやってみたけれどうまくいかなかったので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が連続で鳴るなら(通常は鳴る)弾の発射処理を間違えているのではないかな。


プレアデスⅢ世  2009-04-01 10:16:12  No: 33805

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加