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

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

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

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

Q&A

0回答

923閲覧

バーに当たったら反転させたいです。

hacch

総合スコア15

Qt

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

0グッド

0クリップ

投稿2020/05/23 07:32

編集2020/05/23 17:03

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

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

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

Qt

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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問