下に示したコードはプログラムの一部です
・プレイヤーはPlayer、山札はDeckという構造体で表しました
・moveCard()は一枚のカードを移動させる関数です。龍神録さんのサイトを参考にしました。返り値の1は、カードが移動し終わったことを表します
・deal()は一枚のカードを山札からプレイヤーの手元まで移動させる関数です
そこで私がしたいことというのが、一枚のカードを配り終わったら、次のカードを配り始めるという動作を表現するには,逆にいうと1枚を配り終わるまでほかのカードを配らせないようにしたいのですが、どうすればいいでしょうか。
ちなみにdeal関数はそのことが分からないため記述できる部分だけを記述しました。
最初はfor文をつかうのかなと考えてみたのですが、それではfor文を抜けるまで描画
関数が呼ばれないので、結果として瞬間移動したように見えてしまいます
また、このトランプの移動に限らず、「〇〇し終わったら次の〇〇を実行したい」といった表現をしたい場合、逆に言えば「〇〇し終わるまで次の〇〇を実行しない」の場合、一般的にどのようなアルゴリズムで記述すればよいのでしょうか。
//トランプ
typedef struct{
int x;
int y;
int suits;//スーツ
int number;//数
int faceflag;//表かどうか 1:表 0:裏
//int img;
int flag;//存在するかどうかのフラグ
int moveFlag;
}Trump_t;
//プレイヤー
typedef struct{
Trump_t Trump[MAX_HAND];
Name_t Name;
Chip_t Chip;
}Player_t;
//山札
typedef struct{
int targetCard;
Trump_t trump[MAX_TRUMP];
}Deck_t;
int moveCard(int player ,int hand, int t ,int delection){
if(moveCount == 0){
moveCount = 1;
range_x = trump_X[player][hand] - DECK_X;
range_y = trump_Y[player][hand] - DECK_Y;
//捨てる時には速度と加速度の向きを反転
if(delection == 1){
range_x *= -1;
range_y *= -1;
}
v0_x = (float)(2 * range_x) / t;
v0_y = (float)(2 * range_y) / t;
a_x = (float)2 * range_x / (t * t);
a_y = (float)2 * range_y / (t * t);
}
else{
go_x = v0_x * moveCount - 0.5 * a_x * moveCount * moveCount;
go_y = v0_y * moveCount - 0.5 * a_y * moveCount * moveCount;
//移動中であれば
if(moveCount <= t){
if(delection == 0){
Player[player].Trump[hand].x = DECK_X + go_x;
Player[player].Trump[hand].y = DECK_Y + go_y;
}
else{
Player[player].Trump[hand].x = trump_X[player][hand] + go_x;
Player[player].Trump[hand].y = trump_Y[player][hand] + go_y;
}
}
else{
moveCount = 0;
return 1;
}
moveCount++;
}
return 0;
}
int deal(int player, int hand){
Player[player].Trump[hand].suits = Deck.trump[Deck.targetCard].suits;
Player[player].Trump[hand].number = Deck.trump[Deck.targetCard].number;
Player[player].Trump[hand].flag = 1;
Deck.trump[Deck.targetCard].flag = 0;
Deck.targetCard++;
moveCard(player , hand , 100, 0);
return 0;
}