gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

シェルター

四角をたくさん書いて、色を滑らかに変えようと思っていたら、すごくメリハリがついて、濃い赤の枠のシェルターが開いて、中から出てくるような感じになったのでこの題名に。
クリックをするとシェルターがシャッと開いてまた閉じます。


今回は初めてmousePressed関数を使いました。
for文回してループ変数を色の部分に使って、255を越えれば255を引くという無理やり実装です。

boolは2つ使っていて、
f がマウスをクリックしてから変化が終わる1サイクルを判定するものです。
cmoveJudge が、シェルターが開ききったときに戻ってくる機構のためのものです。開ききるとtrueになって、シェルターが閉じ始めます。
変数名は適当ですね。

色の値に三項演算子を使っているので、コードは読みにくくなりましたねえ。

#include "ofApp.h"
#define rep(i,j,k) for(int i=j;i<k;i++)

bool f=false,cmoveJudge=false;
float cmove=0;
void ofApp::setup(){
    ofNoFill();
    ofSetBackgroundColor(0);
    ofSetColor(255);
}

void ofApp::update(){
    
}

void ofApp::draw(){
    rep(i,0,25){
        //マウスが押されていない時
        if(!f){
            ofSetColor(80+i*7,0,100+i*6);
            ofDrawRectangle(i*10, i*10, ofGetWidth()-10*i*2, ofGetWidth()-10*i*2);
        //マウスが押されて、変化している時
        }else {
            //色の設定に三項演算子。255越えたら255引きます
            ofSetColor((cmove+80+i*7)>255?(cmove+80+i*7-255):(cmove+80+i*7),0,(cmove+100+i*6>255)?(cmove+100+i*6-255):(cmove+100+i*6));
            ofDrawRectangle(i*10, i*10, ofGetWidth()-10*i*2, ofGetWidth()-10*i*2);
            if(!cmoveJudge)cmove+=0.2;
            else cmove-=0.2;
            if(cmove>255){
                cmoveJudge=true;
            }
            if(cmoveJudge && cmove<0){
                f=false;
                cmoveJudge=false;
            }
            
        }
    }
}

void ofApp::mousePressed(int x, int y, int button){
    if(button==0){
        if(!f)f=true;
    }
}