【マップ&Ev】複数の処理を同時にこなすには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
moba
記事: 82
登録日時: 8年前

【マップ&Ev】複数の処理を同時にこなすには

#1

投稿記事 by moba » 8年前

WOLFRPGエディターからVC++/Dxlibに乗り換えようとしている者です。
今分からないのは、どうやって複数の処理を同時にこなすかです。
例えば、

・FPS制御、キャラチップの足踏みやマップの描画等を毎フレーム処理しながら
・文章の表示、8フレーム後に画面にエフェクトをかける、など"メイン"のイベントも実行している

このように、"メイン"で実行しているイベントが1フレームで終了しない場合に、
どうやってその他の処理を並列で処理すればいいか分かりません。

仮説を立てたのですが、もし、イベントコマンドの「ウェイト」が入る度に、
イベントの処理位置を覚えておいて、次のフレームでまた戻ってくるなら説明がつきます。
ですがソースを直接書き込むプログラミング部分ではそうもいかないと思います。

よろしければ、複数の処理を同時にこなす方法を教えていただけませんか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 【マップ&Ev】複数の処理を同時にこなすには

#2

投稿記事 by softya(ソフト屋) » 8年前

そうですね。キャラの移動やアニメや攻撃などのエフェクト、文章もですが、状態を変数に覚えておいて毎フレームその状態を参照しながら次の状態に変化させていきます。
例えば文章なら、どの文字列の何文字目をどの位置に出していると言う情報を覚える変数(構造体)と、ウェイト時間分のカウンタがあればご希望の機能は実現できると思います。
同時に見えますが、1フレーム何ですべての処理をこなせば事実上の同時処理です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 【マップ&Ev】複数の処理を同時にこなすには

#3

投稿記事 by Dixq (管理人) » 8年前

サンプルプログラムを作ってみました。

コード:

#include "DxLib.h"

class Player1 {
	int x, counter;
public:
	Player1() { x = 0, counter = 0; }
	void update() {
		if (counter % 60 == 0) {
			x += 60;
		}
		counter++;
	}
	void draw() {
		DrawCircle(x, 100, 10, GetColor(255, 255, 255), TRUE);
	}
};

class Player2 {
	int x, counter;
public:
	Player2() { x = 0, counter = 0; }
	void update() {
		x++;
		counter++;
	}
	void draw() {
		DrawCircle(x, 200, 10, GetColor(255, 255, 255), TRUE);
	}
};



int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	Player1 p1;
	Player2 p2;

	WaitKey();

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		p1.update();
		p2.update();

		p1.draw();
		p2.draw();
	}

	DxLib_End();
	return 0;
}
実行結果

[youtube][/youtube]

このようにカウンタを使えばマルチ処理が可能です。

moba
記事: 82
登録日時: 8年前

Re: 【マップ&Ev】複数の処理を同時にこなすには

#4

投稿記事 by moba » 8年前

お二人ともマジ天使ありがとうございます。講座サイトのみならずお世話になります。
まだ分からないので、次の例ならどうするか教えていただけませんか。(これはウディタのコマンド文です。見かけの動きのニュアンスが伝わるといいのですが)

■文章:ある朝、精霊のお告げを聞いた勇者は…
■文章:勇者「そうだ、魔王倒すっべ!」
■動作指定:主人公 / 右 / 右 / 右 / 右 / 右
■動作完了までウェイト
■ウェイト:8 フレーム
■文章:村の復興のため、出稼ぎに出たのでした…

イベントに向かって決定ボタンを押した時に、例えば上のような演出をしたいです。
1つだけの文章の表示なら「文章表示中フラグ」をいじればいいかと思いますが、
1行ずつ順番に処理していく場合、1フレームで全ての状態を操作? するわけにもいかないと思います。
もちろんキャラの足踏みやFPSの制御も動いています。

上記のような演出を行うにはどうすればいいでしょうか。
この例が分かれば応用が利くかと思うのですが。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 【マップ&Ev】複数の処理を同時にこなすには

#5

投稿記事 by ISLe » 8年前

つい先日Visual Studio 2015のUpdate 1が正式リリースされました。
そのリリースノートでアピールされていたC++のコルーチンを使ったコード書いてみました。
#現時点でこの機能は試験的な(experimental)実装です。
► スポイラーを表示

moba
記事: 82
登録日時: 8年前

Re: 【マップ&Ev】複数の処理を同時にこなすには

#6

投稿記事 by moba » 8年前

> ISLeさん
すみません、どういう文脈で書いてくださったのか分かりません…
そして必須のOSについて書いていなくてごめんなさい。Vistaなので実行できませんでした。
---
ソフト屋さんの日記を読んでいる内に、
イベントの処理をソースコードに直接書くのではなくて、外部ファイルにスクリプト(?)を書く方法を思いつきました。
これなら、1行ずつ順に処理(のための引数)を読み取って、処理が終わるたびに次の行(処理or状態)に移れると気付きました。

これで何でもできるようになるかは分かりませんが、他に思いつかないのでとりあえずこれで行ってみます。
皆さまありがとうございました。

アバター
びす
記事: 31
登録日時: 12年前

Re: 【マップ&Ev】複数の処理を同時にこなすには

#7

投稿記事 by びす » 8年前

moba さんが書きました:1行ずつ順番に処理していく場合、1フレームで全ての状態を操作? するわけにもいかないと思います。
ウディタは触ったことがありませんが、ほぼ間違いなく、内部的には

実行中イベントの処理
マップの描画処理
FPSの制御処理

といった、mobaさんの挙げた一連の処理を毎フレーム実行しています
たとえば実行中イベントが「ウェイト」の場合の実行中イベントの処理

[tab=30]ウェイト時間、処理を停止する
[tab=30]実行中イベントを次のイベント(「ウェイト」の次の行)に変更する

ではなく

[tab=30]ウェイト時間をマイナス1する
[tab=30]ウェイト時間が0だったら、実行中イベントを次のイベント(「ウェイト」の次の行)に変更する

という具合に、毎フレーム実行して問題のない形で処理を作ります
これは、もし前者のように処理した場合、ウェイト中は「マップの描画」や「FPSの制御」が行われなくなってしまうためです

19:38編集 みやすくなったかもしれない
最後に編集したユーザー びす on 2015年12月03日(木) 19:38 [ 編集 3 回目 ]

moba
記事: 82
登録日時: 8年前

Re: 【マップ&Ev】複数の処理を同時にこなすには

#8

投稿記事 by moba » 8年前

ぴすさんありがとうございます。
直接(追記:イベントの演出を)ソースコードに書き込んだ場合、「次の行に変更」する方法が思いつかずに困っていました。

毎フレーム回っているもので処理できるように、状態変数?をいじって、毎フレーム状態を見て処理するんですね。
ウディタでは、イベントの座標を直接書き込むとグラフィックが自動でついてきたのですが、あれのことだと分かりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 【マップ&Ev】複数の処理を同時にこなすには

#9

投稿記事 by softya(ソフト屋) » 8年前

RPGのイベント自体をC++で書くことは余りありません。スクリプトなどがよくつかわれます。デバック効率やメンテンナンス性が悪いですから。
プログラムで書くのは使い回しが効く物のみです。どっちで書くほうが楽かという話と考えてもらったほうが良いしょう。
RPGの場合、シナリオ、制御スクリプト、演出スクリプトあるいはツール生成データなどなど必要に応じて増えていくものです。
敵データとかもファイル化しないとバランス調整が死にます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

moba
記事: 82
登録日時: 8年前

Re: 【マップ&Ev】複数の処理を同時にこなすには[解決]

#10

投稿記事 by moba » 8年前

では、スクリプトでやってみます!
ソフト屋さんありがとうございます。今後も役に立つ考え方も教えていただいて助かりました。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 【マップ&Ev】複数の処理を同時にこなすには

#11

投稿記事 by ISLe » 8年前

moba さんが書きました:> ISLeさん
すみません、どういう文脈で書いてくださったのか分かりません…
そして必須のOSについて書いていなくてごめんなさい。Vistaなので実行できませんでした。
moba さんが書きました:仮説を立てたのですが、もし、イベントコマンドの「ウェイト」が入る度に、
イベントの処理位置を覚えておいて、次のフレームでまた戻ってくるなら説明がつきます。
ですがソースを直接書き込むプログラミング部分ではそうもいかないと思います。
この仮説をそのままかつネイティブに実装できる方法を紹介しました。

いままでの常識は常識でなくなります。

最新であるVisual Studio 2015 Update 1で(/awaitオプションを付け)ないとコンパイルできません。
現時点では試験的なものですが、標準規格として採用を検討されているのでそう遠くない将来ふつうに使えるようになるでしょう。

Visual Studio 2015 Update 1のシステム要件にWindows Vistaは含まれているので、
Visual Studio 2015 Update 1をインストールすれば、Windows Vistaでコンパイルできるし実行することもできるはずです。

moba
記事: 82
登録日時: 8年前

Re: 【マップ&Ev】複数の処理を同時にこなすには

#12

投稿記事 by moba » 8年前

>ISLeさん
それは絶対無理だと思っていました(笑) 教えてくださってありがとうございます。
良い方法かどうか僕には判断できないので見送らせていただきますが、いつか使うかもしれませんね。

閉鎖

“C言語何でも質問掲示板” へ戻る