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

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

ただいまの
回答率

87.34%

dxlib アニメーションクリップをラップするイテレーターを作りたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 751
退会済みユーザー

退会済みユーザー

Animationクラスでアニメーションするための 走っている状態を表すイテレータをラップするといいと言われたのですが どのようにイテレーターを作りそれをどう使ったらいいか教えてくれますでしょうか?

1,2,3,1,2といった感じにサイクルさせたいのですが
ちなみに1,2,3の番号は走っているときのアニメーションです。

#include <iostream>
#include <fstream>
#include "Input.h"
#include "Player.h"
#include "DxLib.h"
#include "Map.h"
#include "Fps.h"

#define MOVE_SPD 5

/*コンストラクタ*/
Player::Player(const char* str, int xx, int yy)
{
    LoadDivGraph(str,7,7,1,64,64,g_handle);



}

/*計算更新*/
void Player::Update()
{
    frame.Update();
    input_key();
    //gravity();


}


/*描画更新*/
void Player::Draw_Update()
{



    if ( key == -1)
    {
        //DrawTurnGraph(gPos_x(), gPos_y(), g_handle[0], true);
        DrawTurnGraph(pos->gPos_x(), pos->gPos_y(), g_handle[AnimeClip->setClip()], true);

    }
    /*右→*/
    if (key == 1)
    {
        DrawGraph(pos->gPos_x(), pos->gPos_y(), g_handle[AnimeClip->setClip()], true);
    }

    AnimeClip->Draw_Update();


    frame.Wait();
}

/*キー入力*/
void Player::input_key()
{
    if (keybord(KEY_INPUT_LEFT) > 0)//←
    {

        key = -1;
        AnimeClip->Update_changeAnime(anime_s::ewalk,key);
        pos->sPos_x(-MOVE_SPD);


    }else if (keybord(KEY_INPUT_RIGHT) > 0)//→
    {

        key = 1;
        AnimeClip->Update_changeAnime(anime_s::ewalk,key);

        pos->sPos_x(+MOVE_SPD);

    }else if (keybord(KEY_INPUT_UP) > 0)//上
    {
        pos->sPos_y(+MOVE_SPD);

    }else if (keybord(KEY_INPUT_DOWN) > 0)//下
    {
        pos->sPos_y(-MOVE_SPD);
    }

    else if (keybord(KEY_INPUT_SPACE) > 0)//ジャンプ
    {
        AnimeClip->Update_changeAnime(anime_s::ejump);

    }
    else//何も押していない時
    {
        AnimeClip->Update_changeAnime(anime_s::ewait);

    }



    jump_up();
    gravity();

}

/*************************************描画 アニメーション管理**************************************/

void Player::Animation::Update()
{
    f->Update();
#define ANI_SPD 15

    if (f->gframe() % ANI_SPD == 0)
    {


    }




#undef ANIME_SPD
}

void Player::Animation::Draw_Update()
{
    f->Wait();
}

void Player::Animation::Update_changeAnime(anime_s clip, int key)//keyは向き -1が左側
{
    state = clip;
    isReverse = key;
}

void Player::Animation::Update_changeAnime(anime_s clip)//keyは向き -1が左側
{
    state = clip;
}


int Player::Animation::setClip()
{
    return Clip;
}



/****************************************************************************************/



/*ジャンプ管理*/
void Player::jump_up()
{

}


/*重力効果*/
void Player::gravity()//ジャンプしてるかどうかと当たり判定を比較
{
    if (Map::Collision::under_col(pos->refgPos_x(), pos->refgPos_y()) == false)
    {

    }


}

/*座標の取得と設定*/
void Player::Position::sPos_x(int &xx)//加算
{
    x += xx;
}

void Player::Position::sPos_y(int &yy)//加算
{
    y += -yy;
}

void Player::Position::sPos_x(int xx)
{
    x += xx;

}

void Player::Position::sPos_y(int yy)
{
    y += -yy;

}

int Player::Position::gPos_x()
{
    return x;
}

int Player::Position::gPos_y()
{
    return y;
}

int& Player::Position::refgPos_x()
{
    return x;
}
int& Player::Position::refgPos_y()
{
    return y;
}
#ifndef ___PLAYER_H
#define ___PLAYER_H
#include <iostream>
#include <fstream>
using namespace std;
//#include "Chr.h"
#include "Map.h"
#include "Fps.h"

#define JUMP_RANGE 30
class Player
{
private:

    class Position
    {
        int x;
        int y;
    public:
        Position() :x(0), y(0)
        {

        }


        /*座標の取得と設定 Y軸は反転処理が入っている。上がプラスに*/
        void sPos_x(int xx);
        void sPos_y(int yy);

        void sPos_x(int &xx);
        void sPos_y(int &yy);

        int gPos_x();
        int gPos_y();

        int& refgPos_x();
        int& refgPos_y();


    };


    enum class anime_s//アニメクリップ列挙体
    {
        ewait,
        ewalk,
        ejump,
        egame_over,

    };

    class Animation
    {
    private:
        Fps *f = new Fps();
        anime_s state;
        //unsigned int isReverse;
        int isReverse;//向き管理
        int Clip;//選択中のアニメ番号


    public:

        Animation(anime_s ani)
            :state(ani),isReverse(1),Clip(0)//クリップの初期を設定
        {

        }

        void Update();//アニメ切り替えキー入力監視

        void Update_changeAnime(anime_s clip,int key);//keyは向き -1が左側
        void Update_changeAnime(anime_s clip);//keyは向き -1が左側

        int setClip();



        void Draw_Update();



    };



    int g_handle[8];//画像格納ハンドル


    void input_key();//キー入力
    void gravity();//重力落下
    void jump_up();//ジャンプ上昇


    Position *pos = new Position();//座標クラス
    Animation *AnimeClip = new Animation(anime_s::ewait);//アニメーション管理クラス





    int Nanime = 0;
    int anime_f = 0;



    int key = 1;//向き管理

    //int Animation();

public:
    Fps frame;

    Player(const char* str,int xx,int yy);


    void Update();
    void Draw_Update();

};

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

+1

とらえず整数値で切り替えることにしました。
急な問題ではなおようなので締め切ります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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