マウスでタッチしたマスを反転させる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kabuto

マウスでタッチしたマスを反転させる

#1

投稿記事 by kabuto » 15年前

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:マウスでタッチしたマスを反転させる

#2

投稿記事 by シエル » 15年前

一瞬しか見ていないですが、全部のマスを処理しちゃまずいんじゃないですか?
該当のマスだけ処理したらbreakしないと。

紅葉

Re:マウスでタッチしたマスを反転させる

#3

投稿記事 by 紅葉 » 15年前

>>シエルさん
breakしなくても問題ないのでは?
全部のマスを見に行ってますが処理は一部分しか行っておりません。
質問者を混乱させている気がします。

ソース的には問題ないと思うのですが
panel[j].x等にきちんと値が入ってますか?
値が0だったりするとこのソースは動かないかと思います。
描画で使っている部分のソースをあげて頂けないでしょうか?
又、座標をキャストしているのですが意味があるのでしょうか?

真等

Re:マウスでタッチしたマスを反転させる

#4

投稿記事 by 真等 » 15年前

初めまして、こんにちは。
回答させていただきます。


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;
            }
        }
    }

}

mats

Re:マウスでタッチしたマスを反転させる

#5

投稿記事 by mats » 15年前

これも混乱を招いてしまうのかもしれないのですが…

panel[((int)y-32)%64][((int)x-32)%64]

のように,マウス座標から直接マスを求めることはできないのでしょうか?
(マスが移動したりしないという前提ですが)

マスがどのように並んでいるのか理解していないので,計算式は微妙に違っているかもしれません

シエル

Re:マウスでタッチしたマスを反転させる

#6

投稿記事 by シエル » 15年前

すいません。一瞬しか見てなかったので、質問の意味を勘違いしてました。
私の投稿は完全無視してください。

kabuto

Re:マウスでタッチしたマスを反転させる

#7

投稿記事 by kabuto » 15年前

>>紅葉s
それでした!!
テスト用に描画してたものを使っており
変数には値が入っておりませんでした・・・。

>>真等s
テストソースありがとうございます。
お手数お掛け致しました。

>>mats さん
ご回答ありがとうございます。
そのようなやり方もあるのですねw
配列を壊さないように気をつけます。

>>シエルs
回答ありがとうございました。
breakをした方が処理が軽くなりそうなので入れさせて頂きます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る