###前提・実現したいこと
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;
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/13 14:32