ここから本文です

C言語でホッケーのようなゲームを作っているのですが、思うようにうごきません。

アバター

ID非公開さん

2019/7/1223:58:57

C言語でホッケーのようなゲームを作っているのですが、思うようにうごきません。

キー入力を1回したら停止して、もう一度押すとまた動き出すようになってしまいます。
どのように書き直せば普通に動かせるようになりますか?


/*
final3.c
*/

#include <stdio.h>
#include <handy.h>

#define WINDOWSIZE 600
#define RADIUS 10

int main () {
doubleLayer layers; //ダブルバッファ用のデータ
int windowID; //ウィンドウの番号
int layerID; //レイヤーのID
int cx = 150; //円の中心のx座標
int cy = WINDOWSIZE - 10; //円の中心のy座標
int vx = 5; //円のx座標の速度
int vy = 5; //円のy座標の速度
int bx = 125; //長方形のx座標
int by = 30; //長方形のy座標
int w = 100; //長方形の横幅
int h = 20; //長方形の高さ
int key; //押したキーを覚えておく変数

windowID = HgOpen(300, WINDOWSIZE);
layers = HgWAddDoubleLayer(windowID); //ダブルバッファを作る

while(cx <= WINDOWSIZE && cy <= WINDOWSIZE) {
layerID = HgLSwitch(&layers); //表示レイヤを入れ替える
HgLClear(layerID); //描画用レイヤを消去する
hgevent *event = HgEventNonBlocking();
HgSetEventMask(HG_KEY_DOWN);
HgWBox(layerID, bx, by, w, h);
HgWCircle(layerID, cx, cy, RADIUS);
HgSleep(0.05);

cy += vy;

if(cy + RADIUS >= WINDOWSIZE) {
vy = -3; //円を下に動かす
} else if(cy - RADIUS <= by + h) { //長方形に当たれば
vy = 3; //円を上向きに動かす
}
if (event != NULL) {
key = HgGetChar();
if (key == 'a') {
bx -= vx;
}
if (key == 'd') {
bx += vx;
}
HgClear();
HgWBox(layerID, bx, by, w, h);
}
}

HgClose();
return 0;
}

閲覧数:
34
回答数:
2

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

uso********さん

2019/7/1314:16:15

HgGetChar()は同期関数[キー入力
されるまで待つ]です。待たないなら
HgEventNonBlocking()の方だけ使い
非同期でイベントを取得すべきかと
http://www.cc.kyoto-su.ac.jp/~ogihara/Hg/products/guide0.80.pdf

key = event->ch; // = HgGetChar();

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

yah********さん

2019/7/1300:55:05

Q1.HgGetChar()は、キーを触ってないときに即時リターンするの?

Q2.'a'や'd'ではないリターンが戻るとどう動くの?

Q3.キーバッファは常にクリアしてる?
ioctl()で、buffered をoffにしていますか??


この手のゲームって、キーを押してないときの処理ができるかどうか。

離したのに、前のキーを押してるって誤認識するか、
バッファを持っていて、先行入力を溜めてしまうか・・・・。

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる