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

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

ただいまの
回答率

90.51%

  • C++

    3468questions

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

  • openFrameworks

    85questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 105

xxxxxxx

score 30

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

#include "ofApp.h"

static const int NUM = 210;

float loc_x[NUM];
float loc_y[NUM];
float speed_x[NUM];
float speed_y[NUM];
float radius[NUM];
int red[NUM];
int blue[NUM];
int green[NUM];

//--------------------------------------------------------------
void ofApp::setup(){
    ofBackground(0, 0, 0);
    ofSetFrameRate(60);
    ofSetCircleResolution(64);
    ofEnableAlphaBlending();

    ofTrueTypeFont::setGlobalDpi(72);

    verdana.load("verdana.ttf", 30); // フォントのデータを指定する
    verdana.setLetterSpacing(1.0);   // 文字間を指定する

    for(int i = 0; i < NUM; i++){
        loc_x[i] = ofRandom(0, ofGetWidth());
        loc_y[i] = ofRandom(0, ofGetHeight());
        speed_x[i] = ofRandom(4);
        speed_y[i] = ofRandom(4);
        radius[i] = ofRandom(30, 40);
        red[i] = ofRandom(255);
        blue[i] = ofRandom(255);
        green[i] = ofRandom(255);
    }
}
//--------------------------------------------------------------
void ofApp::update(){
    for(int i = 0; i < NUM; i++){
        loc_x[i] = loc_x[i] + speed_x[i];
        loc_y[i] = loc_y[i] + speed_y[i];

        if(loc_x[i] < 0){
            speed_x[i] = speed_x[i] * -1;
        }
        if(loc_x[i] > ofGetWidth()){
            speed_x[i] = speed_x[i] * -1;
        }
        if(loc_y[i] < 0){
            speed_y[i] = speed_y[i] * -1;
        }
        if(loc_y[i] > ofGetHeight()){
            speed_y[i] = speed_y[i] * -1;
        }
    }
}

//--------------------------------------------------------------
void ofApp::draw(){
    for(int i = 0; i < NUM/3; i++){
        ofSetColor(60, 255, 0, 200);
        ofDrawCircle(loc_x[i], loc_y[i], radius[i]);
    }
    for(int i = 0; i < NUM/3; i++){
        ofSetColor(140, 255, 20, 200);
        ofDrawCircle(loc_x[i+1], loc_y[i], radius[i]);
    }
    for(int i = 0; i < NUM/3; i++){
        ofSetColor(200, 255, 40, 200);
        ofDrawCircle(loc_x[i], loc_y[i+1], radius[i]);
    }
    ofSetColor(250, 255, 0, 200);
    ofDrawCircle(loc_x[1], loc_y[3], radius[3]); //対象となる円
}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){

}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/24 08:55

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Unity shader内でテクスチャの任意の座標に値を書き込む方法

    Unity5.4.xのshaderで、 下記の様な1024x1024 8bitのバッファに格納されている0~7の値が各何個あるかを集計し、 RenderTexture su

  • 解決済

    三秒点灯させて三秒点滅 JS

    信号っぽいものを作ろうとしています。青をボタンを押してから三秒点灯させて、そこから自動的に三秒点滅させて、黄色というようにしたいのですが、三秒点灯させてから点滅させるやり方がよくわ

  • 解決済

    Unityで指定時間後のフェード表現ができない

    Unityでフェードアウトするシーン遷移を行いたいのですが、 「28秒後にPanelの透明度を上げる→30秒後にシーン切り替え」 という動作を以下のコードで実装しようとしたとこ

  • 解決済

    選択されたcellの色を指定する

    選択されたcellの色を、特定の色に変更する方法を教えて頂きたく思います。 下記1つ目のコードのように簡単な色の変更をすることは可能ですが、2つ目のコードのように色を指定すると上

  • 解決済

    Matlab での画像の領域抽出

    前提・実現したいこと Matlabを用いて画像の特定の領域のトリミング 発生している問題・エラーメッセージ 現在、研究でMatlabを用いて以下の花の画像の中心の黄色の花

  • 解決済

    OpenCVにおける、色のオーバーフロー問題

    前提・実現したいこと 色に色を加算して、色の混合をしようとしています。Microsoft office付属のpicture managerの色の補正機能のようなことを、CUIにした

  • 解決済

    PHP 二次配列で特定条件のデータ抽出

    ID Color1 Color2 Color3 1 red red red 2 red green green 3 red green green 4 r

  • 解決済

    OpenCVを使った笑顔検出での問題

    前提・実現したいこと OpenCVで元からあるサンプルコード「smiledetect.cpp」を用いて笑顔検出のシステムを作っています。 検出機能を実装中に以下の問題が発生しました

同じタグがついた質問を見る

  • C++

    3468questions

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

  • openFrameworks

    85questions

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