ページ 1 / 1
マウスでタッチしたマスを反転させる
Posted: 2010年7月31日(土) 09:48
by kabuto
2次元配列でマスの情報を管理してます。(1マス64*64)
タッチしたマスを1なら2に2なら1にしたいのですが上手くいきません。
タッチした瞬間に全てのマスが反転してしまいます。
x,y・・・マウスの座標
panel[*][*].num・・・1か2の情報
マスのサイズ・・・中心原点で64*64
for( int i=0; i<HEIGHT_MAX; i++ ){
for( int j=0; j<WIDTH_MAX; j++ ){
if((int)x-32 < panel[j].x+32 && (int)x+32 > panel[j].x-32 &&
(int)y-32 < panel[j].y+32 && (int)y+32 > panel[j].y-32){
if( panel[j].num == 1 ) panel[j].num = 2;
else if( panel[j].num == 2 ) panel[j].num = 1;
}
}
}
わかりにくい質問で申し訳ないのですが
みては頂けないでしょうか?
Re:マウスでタッチしたマスを反転させる
Posted: 2010年7月31日(土) 09:50
by シエル
一瞬しか見ていないですが、全部のマスを処理しちゃまずいんじゃないですか?
該当のマスだけ処理したらbreakしないと。
Re:マウスでタッチしたマスを反転させる
Posted: 2010年7月31日(土) 10:31
by 紅葉
>>シエルさん
breakしなくても問題ないのでは?
全部のマスを見に行ってますが処理は一部分しか行っておりません。
質問者を混乱させている気がします。
ソース的には問題ないと思うのですが
panel[j].x等にきちんと値が入ってますか?
値が0だったりするとこのソースは動かないかと思います。
描画で使っている部分のソースをあげて頂けないでしょうか?
又、座標をキャストしているのですが意味があるのでしょうか?
Re:マウスでタッチしたマスを反転させる
Posted: 2010年7月31日(土) 10:49
by 真等
初めまして、こんにちは。
回答させていただきます。
breakはしなくても問題なさそうですね。
もしパネルに重なり部分がないのでしたら、breakした方が処理的には軽くて良いかとは思いますが。
ソースをお借りしまして試してみたのですが、私の環境では、多少違和感がありました(後述)が、基本的に問題なく意図した動作をしました。
ですので、紅葉さんの仰る通り、何かしらの値が正確にinputされてないのだと思います。
x, y, panelの値をご確認いただければと思います。
以下、ソースとなります。
コメントアウトしました箇所は、お借りしたソースの原本です。
コメントアウトされてないものは、元の
panel
[j].x+32,panel[j].x-32,panel[j].y+32,panel[j].y-32
の部分の[+|-]32が気になりまして、削除いたしましたものです。
#include <stdio.h>
#include <stdlib.h>
static const int HEIGHT_MAX = 10;
static const int WIDTH_MAX = 10;
class CPanel{
public:
int x;
int y;
int num;
};
int main(){
int x = 100;
int y = 100;
CPanel panel[HEIGHT_MAX][WIDTH_MAX];
for( int i=0; i<HEIGHT_MAX; i++ ){
for( int j=0; j<WIDTH_MAX; j++ ){
panel[j].x = j*64;
panel[j].y = i*64;
panel[j].num = ((int)rand())%2 + 1;
}
}
/*
for( int i=0; i<HEIGHT_MAX; i++ ){
for( int j=0; j<WIDTH_MAX; j++ ){
if((int)x-32 < panel[j].x+32 && (int)x+32 > panel[j].x-32 &&
(int)y-32 < panel[j].y+32 && (int)y+32 > panel[i][j].y-32){
if( panel[i][j].num == 1 ) panel[i][j].num = 2;
else if( panel[i][j].num == 2 ) panel[i][j].num = 1;
}
}
}
*/
for( int i=0; i<HEIGHT_MAX; i++ ){
for( int j=0; j<WIDTH_MAX; j++ ){
if((int)x-32 < panel[i][j].x && (int)x+32 > panel[i][j].x &&
(int)y-32 < panel[i][j].y && (int)y+32 > panel[i][j].y){
if( panel[i][j].num == 1 ) panel[i][j].num = 2;
else if( panel[i][j].num == 2 ) panel[i][j].num = 1;
}
}
}
}
Re:マウスでタッチしたマスを反転させる
Posted: 2010年7月31日(土) 11:52
by mats
これも混乱を招いてしまうのかもしれないのですが…
panel[((int)y-32)%64][((int)x-32)%64]
のように,マウス座標から直接マスを求めることはできないのでしょうか?
(マスが移動したりしないという前提ですが)
マスがどのように並んでいるのか理解していないので,計算式は微妙に違っているかもしれません
Re:マウスでタッチしたマスを反転させる
Posted: 2010年7月31日(土) 12:14
by シエル
すいません。一瞬しか見てなかったので、質問の意味を勘違いしてました。
私の投稿は完全無視してください。
Re:マウスでタッチしたマスを反転させる
Posted: 2010年7月31日(土) 12:38
by kabuto
>>紅葉s
それでした!!
テスト用に描画してたものを使っており
変数には値が入っておりませんでした・・・。
>>真等s
テストソースありがとうございます。
お手数お掛け致しました。
>>mats さん
ご回答ありがとうございます。
そのようなやり方もあるのですねw
配列を壊さないように気をつけます。
>>シエルs
回答ありがとうございました。
breakをした方が処理が軽くなりそうなので入れさせて頂きます。
ありがとうございました。