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

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

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

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

0回答

1002閲覧

ボールがバーあたったら跳ね返したいです。

hacch

総合スコア15

C

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/05/23 16:45

編集2020/05/23 17:02

プログラミングでスカッシュゲームを作っているのですが、ボールがバーに当たったかどうかの判定、当たった場合のボールが跳ね返りするところが書けません。。
今は長方形の中をボールが永遠と動き、バーがキー操作で動いているだけの状態です。
使っているのはオープンフレームワークスでQt creatorです。

変数はそれぞれ、

bx 円の中心のx座標
by 円の中心のy座標
radius 円の半径

rx バーの中心のx座標
ry バーの中心のy座標
rw バーの幅
rh バーの高さ

x_speed バーのx移動速度
y_speed バーのy移動速度

bx_speed 円のx移動速度
by_speed 円のy移動速度

今書こうとしているのは
ボールの座標(bx,by)が
by+半径>バーの上辺のy座標かつ
by-半径<バーの底辺のy座標かつ
bx+半径>バーの左端のx座標かつ
bx-半径<バーの右端のx座標
の場合、y軸の移動方向を反転
(たぶんby_speed*=-1)
する、プログラムです。
それぞれの変数の値は記載しておりませんので、コメントしていただければ記載します。

これらの「バーの上辺のy座標」とかってどうやって表しますか?
if〜?

とりあえず、
if(by+radius>ry){
by_speed*=-1
}
としてみたのですが、それでは
バーがあるx軸全体が反転の対象になってしまいました。

こちらに現在のソースコードの写真をアップしました。
https://d.kuku.lu/60e92a2e4

Qt

1 2#include "ofApp.h" 3float fx; //長方形(枠)の中心のx座標 4float fy; //長方形(枠)の中心のy座標 5float fw; //長方形(枠)の幅 6float fh; //長方形(枠)の高さ 7 8float bx; //円の中心のx座標 9float by; //円の中心のy座標 10float radius; //円の半径 11 12 13float rx; //パドルの中心のx座標 14float ry; //パドルの中心のy座標 15float rw; //パドルの幅 16float rh; //パドルの高さ 17 18float x_speed; //パドルのx移動速度 19float y_speed; //パドルのy移動速度 20 21float bx_speed; //円のx方向速度 22float by_speed; //円のy方向速度 23 24 25 26//-------------------------------------------------------------- 27void ofApp::setup(){ 28 ofBackground(0, 0, 0); //背景を黒 29 ofSetCircleResolution(64); //円の解像度 30 31 //長方形の中心を描画位置にする 32 ofSetRectMode(OF_RECTMODE_CENTER); 33 ofSetFrameRate(30); //フレームレートの設定 34 35 fx = ofGetWidth()/2.0; //枠の描画位置 x座標 36 fy = ofGetHeight()/2.0; //枠の描画位置 y座標 37 fw = 900; //幅 38 fh = 570; //高さ 39 bx = 300; //円の描画位置 x座標 40 by = 300; //円の描画位置 y座標 41 bx_speed = 8; //円のx軸方向の移動速度 42 by_speed = 3; //円のy軸方向の移動速度 43 radius = 25; //円の半径 44 45 rx = ofGetWidth()/2; //パドルの初期位置 x座標 46 ry = ofGetHeight()/2; //パドルの初期位置 y座標 47 rw = 100; //パドルの幅 48 rh = 10; //パドルの高さ 49 50 x_speed = 50; //パドルのx移動速度 51 y_speed = 25; //パドルのy移動速度 52 53 54} 55 56//-------------------------------------------------------------- 57void ofApp::update(){ 58 bx += bx_speed ; //x軸方向の移動 59 by += by_speed ; //y軸方向の移動 60 61 //円のx軸方向の範囲制限 62 if ((bx<fx-fw/2+radius)|| 63 64 (bx>fx+fw/2-radius)){ 65 66 bx_speed *= -1 ; //円のy軸方向の移動方向反転 67 } 68 //円のy軸方向の範囲制限 69 if ((by<fy-fh/2+radius)|| 70 71 (by>fy+fh/2-radius)){ 72 73 by_speed *= -1 ; //円のy軸方向の移動方向反転 74 } 75 76 //パドルのx軸方向の移動範囲制限 77 if(rx<fx-fw/2+rw/2){//パドル左端の制限 78 rx=fx-fw/2+rw/2; 79 } 80 if(rx>fx+fw/2-rw/2){//右端の制限 81 rx=fx+fw/2-rw/2; 82 } 83 84 85 86 //y軸方向の移動範囲制限 87 if(ry<fy-fh/2+rh/2){//パドル上の制限 88 ry=fy-fh/2+rh/2; 89 } 90 if(ry>fy+fh/2-rh/2){//パドル下の制限 91 ry=fy+fh/2-rh/2; 92 } 93 94 95 if(by+radius>ry){ 96 by_speed*=-1; 97 } 98 99} 100 101//-------------------------------------------------------------- 102void ofApp::draw(){ 103 ofNoFill();//塗りつぶしなし 104 ofSetLineWidth(4);//線の太さを4 105 ofSetColor(255,255,255);//白色に 106 ofDrawRectangle(fx,fy,fw,fh);//長方形を描く 107 108 ofFile();//塗りつぶしあり 109 ofSetColor(255,0,0);//赤色 110 ofDrawCircle(bx,by,radius);//円を描く 111 112 //パドルの描画 113 ofFile(); 114 ofSetColor(255,255,255);//描画色 白 115 ofDrawRectangle(rx,ry,rw,rh);//パドルの描画 116 117 118} 119 120//-------------------------------------------------------------- 121void ofApp::keyPressed(int key){ 122 123 //左矢印キー 124 if(key==OF_KEY_LEFT){ 125 rx-=x_speed; 126 } 127 //右矢印キー 128 if(key==OF_KEY_RIGHT){ 129 rx+=x_speed; 130 } 131 if(key==OF_KEY_UP){ 132 ry-=y_speed; 133 } 134 if(key==OF_KEY_DOWN){ 135 ry+=y_speed; 136 } 137} 138

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問