Dxライブラリを使用した擬似3D縦スクールの方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ayapan

Dxライブラリを使用した擬似3D縦スクールの方法

#1

投稿記事 by ayapan » 9年前

初めまして、ゲーム製作にあたり疑問な点があったので質問させてください。
一枚の画像を奥行きのあるように擬似的に3D表示したいのですが
その方法を調べてみても仕組みがいまいち理解できません。

このサイトに私が行いたいことが載っておりますが
肝心の方法が書いてなかったのでここで質問させていただきます。
http://homepage3.nifty.com/ae85fcmxs/02-info-ab4-3.html

この動作はラスタースクロールの応用という形でよいのでしょうか?
それとも別の方法をとっているのですか。

お教えください。
よろしくお願いします。

アバター
usao
記事: 1889
登録日時: 11年前

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#2

投稿記事 by usao » 9年前

オフトピック
ぱっと見,単に射影変換しているだけに見える

ayapan

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#3

投稿記事 by ayapan » 9年前

usao様

回答ありがとうございます。
射影変換をDXライブラリで行う場合、
関数として存在するのでしょうか。

よろしくおねがいします。

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

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#4

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

射影変換を自分で計算する気がないなら、3Dにしてしまったほうが早いですよ。

擬似3Dに関しては
「龍神録プログラミングの館」
http://dixq.net/rp/
ここのサイトのコンテンツですが、57~59章3D背景を作ってみようを参考にされてはどうでしょう。

【補足】
> この動作はラスタースクロールの応用という形でよいのでしょうか?

ラスタースクロールは、昔のSFCやメガドライブなら有効な方法ですが現代的にはかえって面倒です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe()

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#5

投稿記事 by ISLe() » 9年前

DrawModiGraphを使うと斜めに変形した四角形に描画できます。

変形したい部分を全部オフスクリーンにふつうに描画して、オフスクリーンを変形して描画するのが簡単です。
継ぎ目の問題も出ないので。

ayapan

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#6

投稿記事 by ayapan » 9年前

ISLe()様

回答ありがとうございます。
教えていただいた関数をつかい表示させることが出来ました。
しかし、これをループさせるためにはどうすればよいのでしょうか。

よろしくお願いします。

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

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#7

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

ISLe()さんの言うとおりに実装が出来たのなら、毎フレームオフスクリーンレンダリングでスクロールする画面をレンダリングするだけです。
つまり、オフスクリーンに通常の2Dのスクロール描画を行えばよいのです。ループをするのも、マップチップを使うのも自由自在です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ayapan

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#8

投稿記事 by ayapan » 9年前

softya(ソフト屋) 様

回答ありがとうございます。
オフスクリーンレンタリングという難しい用語を調べても
分からなかったため再度質問してしまいました。
わかりやすく説明していただくことは可能でしょうか。
大変申し訳ございませんが、よろしくおねがいします。

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

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#9

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

オフスクリーン・レンダリングがわからないんですね?
そう書いて頂くと話は早いんです。
>しかし、これをループさせるためにはどうすればよいのでしょうか。
これでは、そう読み取れません。

オフスクリーンレンダリング(直接表示されない画面への描画)はMakeScreenを利用します。
http://homepage2.nifty.com/natupaji/DxL ... html#R3N25
サンプルでは、MakeScreen( 20, 20, FALSE ) で小さい画面に書いてますが、これを必要なサイズ640x480などにしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ayapan

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#10

投稿記事 by ayapan » 9年前

softya(ソフト屋) 様

丁寧に回答していただきありがとうございます。
お教えいただいたリンク先を参考に考えましたが
私はいまいち理解することができませんでした。

上下キーで入力を与えると
ただ画像が移動するだけで上のほうは縮小されたままです。
オフスクリーンレンタルなどで解決できるのでしょうが
これ以上解決の糸口が見つかりません。
移動させるごとに拡大と縮小を行いたいです。

失礼ですが画面サイズ960*540の場合で
スクロールを行いたい場合どのような処理を行えば良いでしょうか。

お教えください。
よろしくお願いします。

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

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#11

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

DrawModiGraphの方を動かしたらダメですよ。
オフスクリーン側の画像を動かすんです。
// 作成した画像を描画対象にする
SetDrawScreen( handle ) ;
の後で描画する画像の方です。

> ただ画像が移動するだけで上のほうは縮小されたままです。
それはDrawModiGraphの正しい動作にしか思えません。

>オフスクリーンレンタル
無闇にややこしくなるので妙な略は避けてくださいね。

【補足】
この場合、一番実現が容易なのがオフスクリーンレンダリングなので使用しないと言う選択肢は考えられません。
他にも色々方法はあるのですが、もっと難易度が上がります。
とりあえず、普通の2Dのスクロールが出来ていることが前提となりますので、その上での応用と考えてください。
短い実験用のソースコードを投稿してもらうと回答がつきやすくなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ayapan

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#12

投稿記事 by ayapan » 9年前

softya(ソフト屋) 様

回答ありがとうございます。
まだ何も書いていないコードを載せます。

コード:

#include "DxLib.h"

// フォントカラー定義
#define WHITE GetColor(255,255,255)
#define GREEN GetColor(  0,255,  0)

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// タイトルの設定
	SetMainWindowText("test");
	// ウィンドウモードに設定
	ChangeWindowMode(TRUE);
	// 画面サイズの決定
	SetGraphMode(960, 540, 32);
	// DXライブラリの初期化
	if (DxLib_Init() == -1) return -1;
	// 描画先を裏画面に設定
	SetDrawScreen(DX_SCREEN_BACK);

	int handle = MakeScreen(960, 540, FALSE);

	int sample3 = LoadGraph("sample3.jpeg");

	int upDown = 0;


	// メインループ
	while (ScreenFlip() == 0 && ProcessMessage() != -1 && ClearDrawScreen() != -1)
	{
		if (CheckHitKey(KEY_INPUT_DOWN) == 1) upDown++;
		else if (CheckHitKey(KEY_INPUT_UP) == 1) upDown--;

		DrawModiGraph(250, 0, 960 - 250, 0, 960, 540, 0, 540, sample3, FALSE);

		DrawFormatString(50, 50, WHITE, "ようこそ、DXライブラリの世界へ");



	}


	// DXライブラリの終了処理
	DxLib_End();
	// プログラムの終了
	return 0;
}
私のイメージとしては
画面一番下は端から端まで画像が表示されており
画面一番上はX座標が250~710の間だけで表示されるように
台形の形になっており上下キーを押下すると同じ画像が
先ほどの形を保ったまま永遠ループするような仕組みを作りたいと思っています。
(つまり、画像を下にスクロールすると画像の下側が上から出てくるように)
softya(ソフト屋) 様にたくさんお教えいただきましたがどこにどのような
処理を入れればいいのかが検討もつきません。

また、オフスクリーンレンタルは私の誤字です。
大変申し訳ございませんでした。

コードを挿入する場所をお教えいただけるでしょうか。
よろしくお願いします。

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

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#13

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

これだと2Dスクロールが実装できていないので、まずそちらを実装してください。
「龍神録プログラミングの館」
http://dixq.net/rp/20.html
これを見たほうがわかりやすいと思います。
それができたら、更にオフスクリーンレンダリングで改造します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ayapan

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#14

投稿記事 by ayapan » 9年前

softya(ソフト屋) 様

回答ありがとうございます。
教えていただきましたURLのチュートリアルを
すべてこなしてもわからなかったら再び質問させていただきます。
初歩的な私にわざわざ付き合っていただきありがとうございます。

それではチュートリアルをこなしてみます。

ISLe()

Re: Dxライブラリを使用した擬似3D縦スクールの方法

#15

投稿記事 by ISLe() » 9年前

DrawModiGraphでオフスクリーンを台形に描画した場合、縦方向の奥行きは考慮されないので、スクロールすると上の方ほど速度が速く動いているように見えてしまうので、ダメでした。
質問にあるリンク先のように細かく変形したとしても、タイル単位では奥行きがないので不自然さを完全に排除することはできません。

奥行きを正しく表示するには、DrawBillboard3Dを使って、3D空間にオフスクリーンを描画する必要がありますね。

オフスクリーンに描画するところまでは共通なので、質問者さんはそのまま作業を続けて良いです。

DrawModiGraphだと奥行きがおかしいというサンプルコード。
► スポイラーを表示

閉鎖

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