１つのイラストから動くイラストGIFとして作成保存するツール

openFrameworksというものを使っています。
私が今まで作ってきたものの中で一番手が込んでいるものです。
イメージがつきにくいと思いますがコードだけでも見ていただけたら幸いです。


##ofApp.h

```
#pragma once

#include "ofMain.h"

#include "ofxGif.h"

class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();

		void keyPressed(int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);
		
		ofxGIF::fiGifSaver gifsaver;
    //表示画像
    ofImage img,im01,im02;
    
    //サイズ
    float sizeX , sizeY;
    //画像の方向のためのやつ
    float xx, yy;
    
    //ファイル選択
    ofFileDialogResult File,File2;
    ofTrueTypeFont myFont,myFont2,myFont3,myFont4,myFont5,myFont6;//フォントオブジェクト
    
    //ボタン
    ofImage goodBtn, selectBtn, plusBtn, minusBtn, upBtn, downBtn, rBtn, lbtn, rotateBtn;//ボタンの画像オブジェクト
    int goodBtnPos[2];//ボタンの座標(x,y)のint型配列
    int selectBtnPos[2];
    int plusBtnPos[2];
    int minusBtnPos[2];
    int upBtnpos[2];
    int downBtnpos[2];
    int rBtnpos[2];
    int lpBtnpos[2];
    int rotateBtnpos[2];
    bool isGood, isP ,isMn, isUp, isDown, isR, isL, isRtt;//ボタンが押せれている状態か否か
    int btnState, btnStateP ,btnStateMn, btnStateUp, btnStateDown, btnStateR, btnStateL, btnStateRtt; //ボタンの状態を記録する変数
    double angle;
    vector<ofImage> Image;
    
};
```
##ofApp.cpp
```
#include "ofApp.h"


//--------------------------------------------------------------
void ofApp::setup(){
    ofBackground(255);
    //保存
    gifsaver.create("/Users/shion/Downloads/2018後期授業フォルダ/openframeworks/apps/myApps/GIFmaker02/bin/test"+ofGetTimestampString()+".gif");
    //文字
    myFont.load("frabk.ttf", 15);
    myFont2.load("frabk.ttf", 10);
    myFont3.load("frabk.ttf", 10);
    myFont4.load("frabk.ttf", 10);
    myFont5.load("frabk.ttf", 10);
    myFont6.load("frabk.ttf", 10);
    
    //goodボタンの画像の読み込み
    goodBtn.loadImage("good.png");
    //goodボタンの座標を設定
    goodBtnPos[0]=350;//x
    goodBtnPos[1]=100;//y
    isGood=false;
    
    //選択ボタンの画像の読み込み
    selectBtn.loadImage("select.png");
    //選択ボタンの座標を設定
    selectBtnPos[0]=350;//x座標
    selectBtnPos[1]=300;//y座標
    btnState=0;//ボタンが押されていない状態
    
    //plusボタンの画像の読み込み
    plusBtn.loadImage("Plus.png");
    //plusボタンの座標を設定
    plusBtnPos[0]=350;//x
    plusBtnPos[1]=50;//y
    btnStateP=0;
    isP = false;
    
    //minusボタンの画像の読み込み
    minusBtn.loadImage("minusbtn.png");
    //plusボタンの座標を設定
    minusBtnPos[0]=400;//x
    minusBtnPos[1]=50;//y
    btnStateMn=0;
    isMn = false;
    
    //upボタンの画像の読み込み
    upBtn.loadImage("up.png");
    //upボタンの座標を設定
    upBtnpos[0]=380;//x
    upBtnpos[1]=150;//y
    btnStateUp=0;
    isUp = false;
    
    //downボタンの画像の読み込み
    downBtn.loadImage("down.png");
    //downボタンの座標を設定
    downBtnpos[0]=380;//x
    downBtnpos[1]=210;//y
    btnStateDown=0;
    isDown = false;
    
    //rボタンの画像の読み込み
    rBtn.loadImage("R.png");
    //lボタンの座標を設定
    rBtnpos[0]=410;//x
    rBtnpos[1]=180;//y
    btnStateR=0;
    isR = false;
    
    //lボタンの画像の読み込み
    lbtn.loadImage("L.png");
    //lボタンの座標を設定
    lpBtnpos[0]=350;//x
    lpBtnpos[1]=180;//y
    btnStateL=0;
    isL = false;
    
    //rotateボタンの読み込み
    rotateBtn.loadImage("rotation.png");
    //rotateボタンの座標を設定
    rotateBtnpos[0]=350;//x
    rotateBtnpos[1]=260;//y
    btnStateRtt=0;
    isRtt = false;
    
    sizeX = 30; //初期値
    sizeY = 30;
    xx = 120;
    yy = 120;
    angle = 0;
    
	
}

//--------------------------------------------------------------
void ofApp::update(){
//    sizeX += 0.15;
//    sizeY += 0.15;
}

//--------------------------------------------------------------
void ofApp::draw(){
    //表示させる画像
    ofSetColor(255,255,255,255); //真っ黒にならないように
//    float winH = ofGetWindowHeight(),
//          winW = ofGetWindowWidth();
    im01.draw(xx, yy , sizeX, sizeY);
    ofNoFill();
    
     ofSetColor(0);
     ofRect(0, 0, 300, 300);
    ofDrawLine(0, 347, 500, 347);
    ofDrawLine(0, 365, 500, 365);
     myFont.drawString("'a'key capture  's'key save", 20, 330);
    myFont2.drawString("size", 315, 70);
    myFont3.drawString("color", 315, 120);
    myFont4.drawString("move", 315, 200);
    myFont5.drawString("file", 315, 320);
    myFont6.drawString("↓↓ preview ↓↓", 50, 360);
    
   //~~~~~~~~~~~~~~~~~~ ボタン系　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ofSetColor(225);
    goodBtn.draw(goodBtnPos[0], goodBtnPos[1], 30, 30);
    selectBtn.draw(selectBtnPos[0], selectBtnPos[1], 30, 30);
    plusBtn.draw(plusBtnPos[0], plusBtnPos[1], 30, 30);
    minusBtn.draw(minusBtnPos[0], minusBtnPos[1], 30, 30);
    upBtn.draw(upBtnpos[0], upBtnpos[1], 30, 30);
    downBtn.draw(downBtnpos[0], downBtnpos[1], 30, 30);
    rBtn.draw(rBtnpos[0], rBtnpos[1], 30, 30);
    lbtn.draw(lpBtnpos[0], lpBtnpos[1], 30, 30);
    rotateBtn.draw(rotateBtnpos[0], rotateBtnpos[1], 30, 30);
    
    if(isGood){//ボタンが押されている時
        ofSetColor(128);//ボタンの色を少し暗くする
        goodBtn.draw(goodBtnPos[0], goodBtnPos[1], 30, 30);
    }
    if(isP){//ボタンが押されている時
        ofSetColor(128);//ボタンの色を少し暗くする
        plusBtn.draw(plusBtnPos[0], plusBtnPos[1], 30, 30);
    }
    
    if(isMn){//ボタンが押されている時
        ofSetColor(128);//ボタンの色を少し暗くする
        minusBtn.draw(minusBtnPos[0], minusBtnPos[1], 30, 30);
    }
    
    if(isUp){//ボタンが押されている時
        ofSetColor(128);//ボタンの色を少し暗くする
        upBtn.draw(upBtnpos[0], upBtnpos[1], 30, 30);
    }
    
    if(isDown){//ボタンが押されている時
        ofSetColor(128);//ボタンの色を少し暗くする
        downBtn.draw(downBtnpos[0], downBtnpos[1], 30, 30);
    }
    
    if(isR){//ボタンが押されている時
        ofSetColor(128);//ボタンの色を少し暗くする
        rBtn.draw(rBtnpos[0], rBtnpos[1], 30, 30);
    }
    
    if(isL){//ボタンが押されている時
        ofSetColor(128);//ボタンの色を少し暗くする
        lbtn.draw(lpBtnpos[0], lpBtnpos[1], 30, 30);
    }
    
    if (isRtt) {
        ofSetColor(128);
        rotateBtn.draw(rotateBtnpos[0], rotateBtnpos[1], 30, 30);
    }
    
//preview
    img.draw(30, 380, 100, 100);
    
    ofPushMatrix();//現在の座標を保存
    ofTranslate(150, 150);
    ofRotate(angle);
    ofPopMatrix();
    
}

//--------------------------------------------------------------
void ofApp::keyPressed(int key){

    if (key == 's'){
        gifsaver.save();
        cout<<"save"<<endl;
    }
    
    if (key == 'a')
    {
        img.grabScreen(0, 0, 300, 300);
        gifsaver.append(img.getPixelsRef());
        cout<<"a"<<endl;

    }
  
}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){
    //選択ボタンの上にカーソルがあると時
    if((x>=selectBtnPos[0])&&(x<=selectBtnPos[0]+30)&&
       (y>=selectBtnPos[1])&&(y<=selectBtnPos[1]+30)){
        btnState=1;//ボタンの上にマウスカーソルがある時
        selectBtn.loadImage("select_hover.png");//画像の読み込み
    }else{
        btnState=0;//ボタンの上にマウスカーソルがない状態
        selectBtn.loadImage("select.png");//画像の再読み込み
    }
}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){
    if((x>=goodBtnPos[0])&&(x<=goodBtnPos[0]+30)&&
       (y>=goodBtnPos[1])&&(y<=goodBtnPos[1]+30)){
        isGood=true;
    }
    if((x>=selectBtnPos[0])&&(x<=selectBtnPos[0]+30)&&
       (y>=selectBtnPos[1])&&(y<=selectBtnPos[1]+30)){
        btnState=2;//ボタンが押されている状態
        selectBtn.loadImage("select_push.png");//画像の再読み込み
    }
    if((x>=plusBtnPos[0])&&(x<=plusBtnPos[0]+30)&&
       (y>=plusBtnPos[1])&&(y<=plusBtnPos[1]+30)){
        btnStateP=2;//ボタンが押されている状態
        im01.loadImage(File.filePath);
        sizeX += 3.5;
        sizeY += 3.5;
    }
    if((x>=minusBtnPos[0])&&(x<=minusBtnPos[0]+30)&&
       (y>=minusBtnPos[1])&&(y<=minusBtnPos[1]+30)){
        btnStateMn=2;//ボタンが押されている状態
        im01.loadImage(File.filePath);
        sizeX -= 3.5;
        sizeY -= 3.5;
    }
    if((x>=upBtnpos[0])&&(x<=upBtnpos[0]+30)&&
       (y>=upBtnpos[1])&&(y<=upBtnpos[1]+30)){
        btnStateUp=2;//ボタンが押されている状態
        im01.loadImage(File.filePath);
        yy -= 5.5;
    }
    if((x>=downBtnpos[0])&&(x<=downBtnpos[0]+30)&&
       (y>=downBtnpos[1])&&(y<=downBtnpos[1]+30)){
        btnStateDown=2;//ボタンが押されている状態
        im01.loadImage(File.filePath);
        yy += 5.5;
    }
    if((x>=rBtnpos[0])&&(x<=rBtnpos[0]+30)&&
       (y>=rBtnpos[1])&&(y<=rBtnpos[1]+30)){
        btnStateR=2;//ボタンが押されている状態
        im01.loadImage(File.filePath);
        xx += 5.5;
    }
    if((x>=lpBtnpos[0])&&(x<=lpBtnpos[0]+30)&&
       (y>=lpBtnpos[1])&&(y<=lpBtnpos[1]+30)){
        btnStateL=2;//ボタンが押されている状態
        im01.loadImage(File.filePath);
        xx -= 5.5;
    }
    
    if((x>=rotateBtnpos[0])&&(x<=rotateBtnpos[0]+30)&&
       (y>=rotateBtnpos[1])&&(y<=rotateBtnpos[1]+30)){
        btnStateRtt=2;//ボタンが押されている状態
        im01.loadImage(File.filePath);
        angle +=1;
        
        
    }
    
    

    
    
    
    
}

//--------------------------------------------------------------

void ofApp::mouseReleased(int x, int y, int button){
    if((x>=goodBtnPos[0])&&(x<=goodBtnPos[0]+30)&&
       (y>=goodBtnPos[1])&&(y<=goodBtnPos[1]+30)){
        isGood=false;
        //グッドボタンを押したら背景がランダムで変わる
        ofBackground(ofRandom(255), ofRandom(255), ofRandom(255));
    }

    if((x>=selectBtnPos[0])&&(x<=selectBtnPos[0]+30)&&
       (y>=selectBtnPos[1])&&(y<=selectBtnPos[1]+30)){
        btnState=0;//ボタンが押されていない状態
       selectBtn.loadImage("select.png");//画像の読み込み

     File = ofSystemLoadDialog("Select Image File");
    
    if (File.bSuccess) {
        cout << File.filePath << "ファイルの読み込みに成功しました" << endl;
    }
    else {
        cout << "ファイルの読み込みに失敗しました" << endl;
        std::exit(1);//プログラムを終了(異常終了)
    }
    }
    
    
     im01.loadImage(File.filePath);
}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

	if (dragInfo.files.size() > 0)
	{
		for (int i = 0; i < dragInfo.files.size(); i++ )
		{
			gifsaver.append(dragInfo.files[i]);
		}
		
	}

}