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

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

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

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

813閲覧

オブジェクトクリック判定とその処理

xxxxxxx

総合スコア50

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/23 02:36

オープンフレームワークスを用いてゲームアプリを作っています。
コードは以下の通りで、

c++

1#include "ofApp.h" 2 3static const int NUM = 210; 4 5float loc_x[NUM]; 6float loc_y[NUM]; 7float speed_x[NUM]; 8float speed_y[NUM]; 9float radius[NUM]; 10int red[NUM]; 11int blue[NUM]; 12int green[NUM]; 13 14//-------------------------------------------------------------- 15void ofApp::setup(){ 16 ofBackground(0, 0, 0); 17 ofSetFrameRate(60); 18 ofSetCircleResolution(64); 19 ofEnableAlphaBlending(); 20 21 ofTrueTypeFont::setGlobalDpi(72); 22 23 verdana.load("verdana.ttf", 30); // フォントのデータを指定する 24 verdana.setLetterSpacing(1.0); // 文字間を指定する 25 26 for(int i = 0; i < NUM; i++){ 27 loc_x[i] = ofRandom(0, ofGetWidth()); 28 loc_y[i] = ofRandom(0, ofGetHeight()); 29 speed_x[i] = ofRandom(4); 30 speed_y[i] = ofRandom(4); 31 radius[i] = ofRandom(30, 40); 32 red[i] = ofRandom(255); 33 blue[i] = ofRandom(255); 34 green[i] = ofRandom(255); 35 } 36} 37//-------------------------------------------------------------- 38void ofApp::update(){ 39 for(int i = 0; i < NUM; i++){ 40 loc_x[i] = loc_x[i] + speed_x[i]; 41 loc_y[i] = loc_y[i] + speed_y[i]; 42 43 if(loc_x[i] < 0){ 44 speed_x[i] = speed_x[i] * -1; 45 } 46 if(loc_x[i] > ofGetWidth()){ 47 speed_x[i] = speed_x[i] * -1; 48 } 49 if(loc_y[i] < 0){ 50 speed_y[i] = speed_y[i] * -1; 51 } 52 if(loc_y[i] > ofGetHeight()){ 53 speed_y[i] = speed_y[i] * -1; 54 } 55 } 56} 57 58//-------------------------------------------------------------- 59void ofApp::draw(){ 60 for(int i = 0; i < NUM/3; i++){ 61 ofSetColor(60, 255, 0, 200); 62 ofDrawCircle(loc_x[i], loc_y[i], radius[i]); 63 } 64 for(int i = 0; i < NUM/3; i++){ 65 ofSetColor(140, 255, 20, 200); 66 ofDrawCircle(loc_x[i+1], loc_y[i], radius[i]); 67 } 68 for(int i = 0; i < NUM/3; i++){ 69 ofSetColor(200, 255, 40, 200); 70 ofDrawCircle(loc_x[i], loc_y[i+1], radius[i]); 71 } 72 ofSetColor(250, 255, 0, 200); 73 ofDrawCircle(loc_x[1], loc_y[3], radius[3]); //対象となる円 74} 75 76//-------------------------------------------------------------- 77void ofApp::mousePressed(int x, int y, int button){ 78 79} 80 81

複数描かれた円の中から対象となる円をクリックした時に「That's right!」というテキストを表示させるようにしたいのですが、円の座標をその都度取得してクリック判定に用いるという考え方であっていますでしょうか?できればやり方などを教えていただきたく、投稿させていただきました。もちろん自分でも調べて見ましたが検索に引っかからずに困っています。ご教授お願いいたします。

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

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

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

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

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

guest

回答2

0

「円:中心P(x,y) 半径r の中にクリックされた点C(a,b) があるか否か」
なら、
「PとCの距離:√((x-a)^2+(y-b)^2) が r 以下か否か」で判定できますが。

...そーゆーことじゃなくて?

投稿2018/07/23 23:37

episteme

総合スコア16614

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

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

0

ベストアンサー

一般論(?)として
複数の円が描かれた時点で、当たりの円は決定しているはずなので
対象となる円の座標は別クラスに確保(Set)しておいて、
クリック時にクリック座標と確保しておいた座標を取得(Get)して比較するということでよいと思います。

もう少し頑張るならば、
クリックした座標も当たり円の座標を確保しているクラスに渡してやり、
そこで比較した結果を表示しているクラスに返してやり、表示を決める。

A:表示用のViewクラス(要はGUIに相当)
B:当たり座標を確保しているクラス

Aでは、クリックした際に座標がわかるので、それをBに渡してやり
Bは手持ちの当たり円の座標と比較して
Aに結果を返す。
Aはそれをもとに表示を決定

字だと分かりづらいな・・・

期待に沿えていないかもしれないが、考え方としてはこんな感じでどうでしょう。

投稿2018/07/23 09:16

ardin

総合スコア544

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

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

xxxxxxx

2018/07/23 23:55

詳しいご説明ありがとうございます。BAは迷いましたがより詳しく記述くださったardinさんにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問