ページ 11

DXライブラリ三大処理について。

Posted: 2017年9月02日(土) 22:23
by TMZ
DXライブラリでゲームを作っています。
①Enterキーを押すと
②文章が表示される。
③画面が一定時間揺れる。
④揺れ終わると文章が表示される。
上記のような処理をしたい場合、下記のように記述すると
御法度?である ScreenFlip()などの三大処理を入れるしかないのでしょうか?
あるいは、そもそもの設計に問題があるのでしょうか?

コード:

func() {
  if ( Input::press( ENTER ) ) {
    showText( "画面が揺れます。" ) ;
    shakeScreen() ;
    showText( "終了です。" ) ;
  }
}
void shakeScreen() {
  int count = 0 ;
  while ( ProcessMessage() == 0 && count < 10 ) {
    ClearDrawScreen() ;
    shake() // 画面表示の座標を変えるなどの関数
    ScreenFlip() ;
    count ++ ;
  }
}

Re: DXライブラリ三大処理について。

Posted: 2017年9月02日(土) 22:41
by Dixq (管理人)
三大処理が複数個所にあるとしたら、それはほぼ間違いなく設計に問題があります。
funcがどこから呼ばれているのか分かりませんが、根底となるルーパーから呼ばれているならその中で新たに三大処理をいれるべきではないです。
毎フレームルーパーに処理を返しましょう。
Enterキーが押された瞬間揺れフラグを立てる等して現在揺れていることを識別可能にします。
またカウンターを用意し、カウンターが特定の値になったらフラグを落とします。
一例としてサンプルコードはこんな感じでしょうか。

コード:

#include "DxLib.h"

bool isShaking = false;
int counter = 0;

void shake(){
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
    isShaking = true;//何らかのタイミングでフラグを立てる
    while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){
        if(isShaking){
            shake();
            counter++;
            if(counter>10){
                isShaking = false;
            }
        }
    }
    DxLib_End(); // DXライブラリ終了処理
    return 0;
}

Re: DXライブラリ三大処理について。

Posted: 2017年9月03日(日) 10:28
by TMZ
返信有り難うございます。
ご教示頂いた設計にします。

ちなみに、
三大処理を複数箇所に書かざるをえない状況とは
どのようなものなのでしょうか?

Re: DXライブラリ三大処理について。

Posted: 2017年9月03日(日) 12:17
by Dixq (管理人)
基本的に無いと思っていいですが、館で紹介しているように
http://dixq.net/rp2/06.html
致命的エラーが起きてこれ以上続行中不可能なときただ死ぬのを待つだけの処理等には使っても構わないかと思います。

Re: DXライブラリ三大処理について。

Posted: 2017年9月03日(日) 14:54
by TMZ
返信ありがとうございます。
何があっても絶対に使うことはない、と考えておいて間違いはなさそうですね。

大変参考になりました!
どうも有り難うございました!