質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

1494閲覧

c言語とHandyGraphicsによるゲーム

TheLastSoldier

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/07/13 06:44

編集2016/07/13 07:06

###前提・実現したいこと
c言語とHandyGraphicsを用いたゲームを作っています。それは四角い空間の中でプレイヤー(棒)でボールを跳ね返すゲームです。
動画:https://www.youtube.com/watch?v=wb_pbFPGY5E&feature=youtu.be
ボールの描く軌跡は,y = 2x - 750
壁に当たると、その壁(直線)に対称に動くようにしたいです。
(例えば、上の壁に当たったら、上の壁に対称な直線(y = -2(x-衝突した時のx)+衝突した時のy)上を進む。スタート地点は衝突した時の座標)
最終的にはプレイヤーを動かしてボールを跳ね返すゲームにするつもりですが、とりあえずボールが反射するアニメーションを作っています。
今週、自由課題として制作しているのですが、なかなか進みません。どうかご回答宜しくお願いします!
###発生している問題・エラーメッセージ
上の壁に当たったのに下に行かず、そのままyが反復し、xが増加していっている。
X;増加 Y;380->370->400->390->400->390->400->・・・繰り返し
なぜ下に行かず、同じ動きをしているのかわかりません。

###該当のソースコード
C言語

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

int main () {

int x,y;//ボールの座標
int a;//ボールが動く軌跡(直線)の傾き
int countk;//何に衝突したかを判断するための値
int numy[5]; //配列
int numx[5]; //配列

y = 250;
x = 500;
a = 2;
count = 0;

doubleLayer layers; // ダブルバッファ用のデータ
int windowID; // ウィンドウの番号
int layerID; // レイヤーの番号

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

HgLine(0,80 ,800,80); //壁 上
HgLine(0,420 ,800,420); //壁 下
HgLine(800,80 ,800,420); //壁 右
HgLine(100,180 ,100,320); //プレイヤー

//ここからアニメーション開始
for(;x > 0;){

layerID = HgLSwitch(&layers); // 表示レイヤを入れ替える HgLClear(layerID); // 描画用レイヤを消去する //ボールが衝突した場合のcountの値 if (y >= 380){ //壁 上 count = 1; numx[1] = x; numy[1] = y; } if (y <= 120){ //壁 下 count = 2; numx[2] = x; numy[2] = y; } if (x >= 760){ //壁 右 count = 3; numx[3] = x; numy[3] = y; } if (x <= 140 && (180 <= y && y <= 320)){ //プレイヤー count = 4; numx[4] = x; numy[4] = y; } //衝突した場合の処理 switch (count) { case 1: x += 5; a = -1 * a; y = a * (x - numx[1]) + numy[1]; break; case 2: x -= 5; a = -1 * a; y = a * (x - numx[2]) + numy[2]; break; case 3: x += 5; a = -1 * a; y = a * (x - numx[3]) + numy[3]; break; case 4: x -= 5; a = -1 * a; y = a * (x - numx[4]) + numy[4]; break; case 0: x += 5; a = a; y = 2 * x - 750; break; default: break; } printf("X:%d ",x); printf("Y;%d\n ",y); HgWCircle(layerID, x, y, 40); // 描画用レイヤに円を描く HgSleep(0.10);

}

HgGetChar();
HgClose();
return 0;
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

どこにもぶつからなかったら case 0x += 5;

xに比例してyはどんどん増加して
y >= 360 で上にぶつかったらcase 1x += 5;

a は ループ1回ごとにプラスマイナスが反転するから、この辺で振動

case 1: x += 5; a = -1 * a; y = a * (x - numx[1]) + numy[1];

X がどんどん増加して
x >= 760 で右にぶつかったらcase 3x += 5;

一度ぶつかったらcountの値はぶつかったときのままで0になることはないようですが、
この辺りは想定通りの動きでしょうか?

投稿2016/07/13 13:06

kopio

総合スコア487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問