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;
質問を書き忘れていました。
シューティングゲームで左右キーを押しながらスペースキーで迎撃弾を
連射するにはどうしたらいいのでしょう? 上記のコードでは、一端スペースキーを上げて押さないと弾は発射されません。
押しっぱなしで認識するならKeyPressでイベント起こすか、
メイン処理の中でフレームごとにSpaceを押してるかどうか検出したら?
あるいはKeyDownでフラグON、KeyUpでフラグOFFにして、
フラグを検出して弾を出すとか
そりゃKeyDownは押したときに発生するから、何度も実行するには
そのたびに押さなきゃだめでしょ
> // if (GetKeyState(VK_SPACE) < 0) then
> // GeigekidanOn( FMyPtn.X, FMyPtn.Y );
ココは何でコメント化したのかな?
このGetKeyStateによるKeyチェックで連射できるんじゃないの?
>ココは何でコメント化したのかな?
多分、最初はそれでやってみたけれどうまくいかなかったので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が連続で鳴るなら(通常は鳴る)弾の発射処理を間違えているのではないかな。
そうですね。というかこういう場合でのキー操作はGetKeyStateだけでやった方がいいようですね。タイトルのセレクトなどのカーソル選択が必要な時はOnKeyDownが使いやすいかもしれませんが。
ツイート | ![]() |