マップチップにおけるテクスチャ貼り付け。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

マップチップにおけるテクスチャ貼り付け。

#1

投稿記事 by TOMY » 10年前

現在マップチップエディタを作成しているのですが、チップ画面描画時のテクスチャ貼り付けで深刻に詰まってしまったため質問させていただきます。
ですがその前に、プロジェクト自体だいぶソースコードが混んできて、一部分だけ取り出して理解してもらうというのがかなり難しいくなっているので、
一度zipでここに貼り付け、一度ソースを解読してもらった後、それぞれの機能や求めていること、追加したいことなどを説明させていただきます。
ご了承下さい。また説明がド下手糞なのでわかりづらいと思われる点にもご注意下さい。

まずこのエディタに求めたい機能ですが。
1左上原点モード(RPG方式)と左下原点モード(縦シュー方式)の2つの切り替えができる。(初期設定のみ完成)
 (左下原点モードのデータは反転して出力される。読み込み時も同じく反転して読み込み。)
2背景、敵位置、特殊処理(イベント開始位置)、マップ数(MapNo)などのレイヤー切り替えができる。
3出力時はそれぞれのレイヤー毎にマップチップファイルを出力。
4出力形式は2種類。読み込み形式は1種類ある(マップチップ情報だけの出力と、エディタ情報込みの出力、読み込み【要するに続きから】)

まだまだありますが今はここまで。
そして質問の箇所ですが、添付ファイルのEditor.cpp内のDrawMapChip部分になります。
チップポリゴン毎の座標とスクロール量、及びサイズを考慮してそのチップポリゴンと連動したマップチップデータの配列番号の算出がうまく出来ません。
計算の問題かと思ってい入るのですが、正しい結論が全く出ないために、こうして質問させていただくことにしました。
以下は自分の考えた数式です。(あくまで数式をプログラムっぽく書いただけです。)

コード:

	int ArrayX,ArrayY;
	ArrayX = (ChipPos.x + ScrollVol.x) / CHIPSIZE_X;
	ArrayY = (ChipPos.y + ScrollVol.y) / CHIPSIZE_Y;

	//下記のようにしてそのチップポリゴン毎のチップ情報を取り出す。
	ChipPolygon = ChipData[ArrayY][ArrayX];
	//この後に取り出した情報を2次元に変換する作業がありますがそこのところはできているので割愛。
詰まっている箇所がテスクチャ貼り付けだけではない為、長丁場になると思われますがどうかお付き合い下さいますようお願い申し上げます。
添付ファイル
WinAPIDirectX_簡易マップチップエディタ_スペルミス修正版.zip
(7.15 MiB) ダウンロード数: 139 回
最後に編集したユーザー TOMY on 2014年4月09日(水) 17:34 [ 編集 2 回目 ]
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#2

投稿記事 by Tatu » 10年前

ArrayYを求めるのにx座標を使っているように見えますが写し間違いでしょうか?

16:40追記
Rebirth(再生)ってReverse(反転)の間違いではないでしょうか。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#3

投稿記事 by TOMY » 10年前

ArrayYを求める箇所に関しましては写し間違いでした。
Rebirthもスペルミスです。ご指摘ありがとうございます。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#4

投稿記事 by Tatu » 10年前

ウィンドウの(0,0)が上から何番目、左から何番目のマスに重なっているか表示できますか?
それがチップ描画用ポリゴン[0][0]の対応するマスになると思うのですがどうでしょうか。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#5

投稿記事 by TOMY » 10年前

Tatu さんが書きました:ウィンドウの(0,0)が上から何番目、左から何番目のマスに重なっているか表示できますか?
それがチップ描画用ポリゴン[0][0]の対応するマスになると思うのですがどうでしょうか。
ウィンドウ座標[0,0]がどの配列番号に対応しているか表示するプログラムを追加しました。
すみません左下原点モード時の計算が間違っていたために修正したものに差し替えておきました。
添付ファイル
WinAPIDirectX_簡易マップチップエディタ.zip
(7.28 MiB) ダウンロード数: 137 回
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#6

投稿記事 by Tatu » 10年前

チップポリゴンを[0][0],[0][1],[1][0],[1][1]だけ描画するように変更した場合

起動直後の状態
SS1.png
その後、右にずらした状態
SS2.png
どうやら右側にスクロールすることでポリゴンがある程度左に行くと右側にワープするような作りの模様。

何の変更もしていない場合0123012301230123000123…のような並びになりますがこれは想定通りなのでしょうか?

テクスチャをどうやって変更するのかがわかりません。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#7

投稿記事 by TOMY » 10年前

Tatuさんの仰る通り、チップポリゴンはある程度画面外へスクロールすると反対方向にワープする仕様です。
更に詳しく言いますと、キー入力によって[スクロールしている]かつ、チップの座標が[画面外から二チップ分]移動すると移動方向と反対方向にワープします。
これによってスクロールしているように見せています。

初期の012301230123・・・と言うのは説明を忘れてしまいましたがデバッグ用に予め、入れておいた数値で、
[0][0]からX方向に0123と表示されるようになっております。
初期値の代入はうまくいくのですが、スクロールすることによって、チップが画面内に描画される時の配列番号の計算がうまく行きません。
そのためスクロール時は配列番号の再計算などはしていません。
(配布ファイルにはそこの部分の計算が注釈分として残っています。)
テクスチャはTexDataフォルダ内に入っており、画像を用意した後に同フォルダ内のtxtファイル内を

使用したいテクスチャファイル名
テクスチャサイズX、テクスチャサイズY
テクスチャ分割数X,テクスチャ分割数Y
透過色指定(A,R,G,B)

と記載することで変更します。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#8

投稿記事 by Tatu » 10年前

ふと疑問に思ったのですがDキー(右側)を押すとScrollVolXは減るのですよね?
そして、ポリゴンの位置はウィンドウの描画位置に対応しているから極端な値はとれないはず。

もし、そうだとすればコメントにある計算式で考えると右に行けばいくほど
左側のチップのデータを見ようとしているということになりそうな気がするのですがどうでしょうか。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#9

投稿記事 by TOMY » 10年前

そうだ。Tatuさんのご指摘のとおりだ。

コード:

    int ArrayX,ArrayY;
    ArrayX = abs(ChipPos.x + ScrollVol.x) / CHIPSIZE_X;
    ArrayY = abs(ChipPos.y + ScrollVol.y) / CHIPSIZE_Y;
 
    //下記のようにしてそのチップポリゴン毎のチップ情報を取り出す。
    ChipPolygon = ChipData[ArrayY][ArrayX];
    //この後に取り出した情報を2次元に変換する作業がありますがそこのところはできているので割愛。
が正しい式でした。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#10

投稿記事 by Tatu » 10年前

コード:

    ArrayX = (ChipPos.x - ScrollVol.x) / CHIPSIZE_X;
    ArrayY = (ChipPos.y - ScrollVol.y) / CHIPSIZE_Y;
のような気がします。

ChipPosは描画用ポリゴンの座標なので
ScrollVol.xが固定ならばChipPos.xが大きいほど右側のマスを選ぶことになるはずです。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#11

投稿記事 by TOMY » 10年前

すみません言葉足らずでした。
ScrollVol は 固定ではありません。
ScrollVol は 総スクロール量を指します。

例えば200ピクセルX方向にスクロールしたら
ScrollVol.xは200になります。

配布したプロジェクトではEditor.h内の
m_TotalScrollVolに値する変数です。
それとは別に1フレームのスクロール量を格納する、
m_ScrollSpeedという変数があります。
この変数に値があるかぎり勝手に画面がスクロールします。

上記2つの関係としては下記のとおりです。
①キー入力される。
②メソッドを通してm_ScrollSpeedに1フレームの移動量が格納
③m_TotalScrollvolにm_ScrollSpeedの値が加算される。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#12

投稿記事 by Tatu » 10年前

「スクロールしたときもマスのデータに応じて正しいマップチップを描画するようになりました」
というようなことが書いていないのでまだ解決してないようですね。

計算式については問題ないのでしょうか?
気になっているのはChipPosの部分が合っているのかということですが。

原点の重なっているマスを表示するときに
(-m_TotalScrollVol.x)/CHIP_SIZE_X;
と書かずに
abs(m_TotalScrollVol.x)/CHIP_SIZE_X;
とした理由は何でしょうか。

画面外に消えたポリゴンが反対側に飛ぶ処理はわかりやすくならないでしょうか?
DRAW_CHIP_X_MAX*CHIP_SIZE_Xだけ動かすというようにはできませんか?

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#13

投稿記事 by TOMY » 10年前

Tatu さんが書きました: 原点の重なっているマスを表示するときに
(-m_TotalScrollVol.x)/CHIP_SIZE_X;
と書かずに
abs(m_TotalScrollVol.x)/CHIP_SIZE_X;
とした理由は何でしょうか。
この部分に関しましてはただ安直で、配列番号に-の値が入ることはありえないために、absで整数化したという単純な理由です。
Tatu さんが書きました: 画面外に消えたポリゴンが反対側に飛ぶ処理はわかりやすくならないでしょうか?
DRAW_CHIP_X_MAX*CHIP_SIZE_Xだけ動かすというようにはできませんか?
この部分に関しましては、はっきり無理です。
誤差の計算なども含める必要性からかなり分かりやすくしてもあのような計算になります。
そもそもあの部分を完成させるのに2~3週間はかかってますからね・・・(何度も何度もトライアンドエラーしてようやく動いた。)
ですがやっている事自体は理解できればなんとかなると思います。
条件自体は全部 
チップの座標が画面外(画面端からCHIPSIZE / 2) + (もしくは-) 誤差(マップチップ表示領域 % CHIPSIZE) かつ、 チップが移動中(m_ScrollSpeedで判定)
で成り立っていますので。
また計算が出来上がったとしても、更新(配列番号の再計算)がまだ解けてないので解決にはまだならないでしょう。
今ずっと考えて色々弄って入るのですが結局おかしい結果になるので。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#14

投稿記事 by TOMY » 10年前

一応途中経過ですが、tatuさんのご指摘通りに式を直したプロジェクトをあげます。
まだ、実行結果の検証途中なのであっているかどうかはわかりませんが・・・
一応キー入力によってm_ScrollSpeedに値が入るとチップポリゴン全体がマップチップ配列の配列番号を再計算するような式を追加しました。
結果が正しいかはまだ検証中です。
箇所はEditor.cppのDrawMapChipメソッドの

コード:

			//UV指定----------------------------------------------------------------------------------------------------
			if((m_ScrollSpeed.x != 0) || (m_ScrollSpeed.y != 0)){
				//ChipごとのUV指定処理
				//1.チップ毎に対応したm_Chip配列の中の数値を求める
				chipdata_x = (m_ChipPolygon[y][x].GetPos().x - m_TotalScrollVol.x) / CHIP_SIZE_X;
				if(m_ReverseFlg){
					chipdata_y = (m_ChipPolygon[y][x].GetPos().y - m_TotalScrollVol.y) / CHIP_SIZE_Y;
				}else{
					chipdata_y = (WIN_HEIGHT - m_ChipPolygon[y][x].GetPos().y - m_TotalScrollVol.y) / CHIP_SIZE_Y;
				}
				//2.求め出た数値は1次元なので2次元に変換
				nx = m_ChipData.m_Chip[chipdata_y][chipdata_x] % m_MaxChipUV_X;
				ny = m_ChipData.m_Chip[chipdata_y][chipdata_x] / m_MaxChipUV_Y;
				//3.セット
				m_ChipPolygon[y][x].SetUV(m_MaxChipUV_X, m_MaxChipUV_Y,nx,ny);
			}
の部分になります。
添付ファイル
WinAPIDirectX_簡易マップチップエディタ_途中経過.zip
(7.23 MiB) ダウンロード数: 136 回
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#15

投稿記事 by TOMY » 10年前

追記ですが、現在検証分で左下原点モード時に計算がうまくいかない(Xスクロールで計算ミス)が、あったため、現在修正中です。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#16

投稿記事 by Tatu » 10年前

チップ配置をどうやったら実装できるのか考えてみました。
左下原点モードについては触れていません。
MapChipEditor(Tatu編集).zip
(78.84 KiB) ダウンロード数: 139 回
変更点
ポリゴンをワープさせずに位置関係を維持したままポリゴン更新を行うようにした。
チップ配置処理を実装
クリック時のモード変更処理をコメントアウトし、チップ配置処理で置き換えた。

以下はその時のメモです。
► スポイラーを表示
最新版については見るのはあとになりそうです。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#17

投稿記事 by TOMY » 10年前

まだシッカリと目を通しては居ませんが、チップ関連の前処理をするUpdate関数を追加して、Drawメソッドがスッキリした感じですね。
チップポリゴンが限界以上まで移動した時、画面反対方向、2チップ分先の方にワープしているように見えますが、前の自分のプログラムのようなワープ時の
長ったらしい処理がありませんね・・・一体どんな計算フローなんだろう・・・というかこんなスマートな文でポリゴンの処理できたのか・・・
ちょっと文章だけでいいので一度詳しく教えていただきたいです。
あとワープに関しまして、確かに他の人達の意見を聞いてみたいです。
自分自身、現実でプログラムについて話し合える相手が居ないので、ほぼ一人で悶絶した挙句突っ走ったプログラムになってしまいました。
とりあえずこのトピックに真剣になってくださっている方がTatuさんしか居なさそうなので、一度チャットで聞いてい見たいと思います。

また、一つ一つの問題を治そう治そうとしていった挙句、非常に可読性に乏しい物が出来てしまっているようです。
そのため一度、チップの描画周りの処理をちゃぶ台返ししようかと思います。
ちょっと時間かかりそうですが・・・
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: マップチップにおけるテクスチャ貼り付け。

#18

投稿記事 by Tatu » 10年前

>ワープしているように見える
反対側にワープするような処理はしていません。
そうするとチップ配置処理の時に全ポリゴンとの
当たり判定をしなければならなさそうなのでやめました

ポリゴンを[0][0],[0][1],[1][0],[1][1]だけ描画するようにして実験すると
ポリゴンの様子はわかると思います。

[0][0]は原点の重なっているマスを描画し、
ポリゴンの並びは常に
[0][0],[0][1],[0][2],…
[1][0],[1][1],[1][2],…
[2][0],[2][1],[2][2],…

となるようにしています。



私が追加したEditor::ChipPolygonUpdateAll()について
x座標についてのみ書いています。y座標も考え方は同じなので省略しています。
位置更新
(i)スクロール量がCHIP_SIZE_Xの整数倍である場合
ポリゴン[0][0]の左端はウィンドウの左端に一致する。
このとき、[0][0]用のpolygon_xはCHIP_SIZE_X/2。
ポリゴンの位置指定がポリゴンの中心になっているようなのでこの値になります。
[0][1]の左端は[0][0]の左端からCHIP_SIZE_Xだけずれた位置になり、
さらに右のポリゴンに対しても同様にするので
[0][x]用のpolygon_xはCHIP_SIZE_X/2+x*CHIP_SIZE_X

(ii)スクロール量がCHIP_SIZE_Xの整数倍でない場合
仮にm_TotalScrollVol.xが右にスクロールするほど増えるような変数だった場合
m_TotalScrollVol.xをCHIP_SIZE_Xで割った余りだけ左にずらせばよい。
剰余演算子%が実数型に対しては使えなかった気がするのでずらす量は
scroll_x=-(m_TotalScrollVol.x-((int)(m_TotalScrollVol.x)/CHIP_SIZE_X)*CHIP_SIZE_X)
と計算。左にずらすので先頭にマイナスがつく。
ただし、実際のm_TotalScrollVol.xは右にスクロールするほど減る変数なので
m_TotalScrollVol.xの符号を反転して
scroll_x=m_TotalScrollVol.x+((int)(-m_TotalScrollVol.x)/CHIP_SIZE_X)*CHIP_SIZE_X;

[0][x]のポリゴンの位置は
(i)の場合の位置からscroll_xだけずらすので
polygon_x=CHIP_SIZE_X/2 + x * CHIP_SIZE_X + scroll_x;
となる。scroll_xはm_TotalScrollVol.xがCHIP_SIZE_Xの整数倍である時0となるので
(i)の場合にこの式を用いても問題ない。

テクスチャ更新について
[0][0]が対応するマスは原点が重なるマスなので
chip_data_x=-m_TotalScrollVol.x/CHIP_SIZE_X;
[0][x]が対応するマスは[0][0]からx右にあるマスなので
chip_data_x=-m_TotalScrollVol.x/CHIP_SIZE_X+x;

nx,ny,SetUVについてはTOMYさんの書いているものと同じなので省略。



>トピックを見ている人がTatuさんだけ
対応するバージョンのDirectX SDKをダウンロードしないとビルドできないのが原因でしょうね。
デバッグ用の文字もなぜか画面外に描画されるようになっていましたし。

私がこのトピックに回答しているのは前にマップエディタを作成したことがあるからですね。
最後に編集したユーザー Tatu on 2014年4月11日(金) 00:28 [ 編集 1 回目 ]

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

Re: マップチップにおけるテクスチャ貼り付け。

#19

投稿記事 by ISLe » 10年前

すみません、プロジェクトを開いて見ていないので、Tatuさんの変更で既にそのようになっているかもしれませんが。

タイルマップ座標のオフセットを求める: ISLeのビデオゲーム工房
このブログ記事のpositive_remainderメソッドのようなオフセット計算をすれば良いのではないでしょうか。
#ここ(mixC++)の日記にも書いたことがあるのですが。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#20

投稿記事 by TOMY » 10年前

ちょっとTatuさんのプログラムを見てから、自分のプログラムを見なおしたところ、
色々と修正した方がいい&必要機能の見直しと処理のフロー見直しがでてきたので大規模修正しようかと思います。
そのため、次の更新までだいぶ時間が掛かりそうですが、トピックは解決はまだしません。
誠に勝手ですが、もう暫くお付き合い下さい。
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

Re: マップチップにおけるテクスチャ貼り付け。

#21

投稿記事 by TOMY » 10年前

ご無沙汰しています。ようやく(多分)エディタが完成しました。
出来たと言いましても、自分のPC以外では一切動作確認(パソコンがないから出来ない)しておりませんので、人によっては起動しない等の弊害もあると思います。
起動に必要な物は各自で揃えて下さい。また、日記の方でもファイルをあげるので、起動時どんなファイルが要求されたか(dllとか)どんな問題が起きたのかを
(出来ればスクリーンショットと詳細な情報)と共に返信して頂けると製作時の参考になるので助かります。


初投稿から1ヶ月以上も経ってからの完成で申し訳ありません。
もしよろしければ、このエディタを使用して簡易的なマップチッププログラムを作っていただけると助かります。
(ちゃんと自分以外の他の人がこのエディタを使用してゲームを作れるのか知りたいし、自分だけしか使えないエディタは問題あるので)
深刻なものでない限りバグ抜きはしない予定です。いつまでもエディタ制作し続けて肝心のゲーム本編が作れないのも問題なので。
詳細な使い方や仕様はフォルダ内のテキストファイルに書いてあります。

製作時のプロジェクトも上げておきます。後半ほぼトリップ状態で組んでたのでソースがグチャグチャになっていますが・・・

一応解決にチェックをしておきます。
添付ファイル
WinAPIDirectX_簡易マップチップエディタ.zip
(1.71 MiB) ダウンロード数: 132 回
左上左下原点対応マップチップエディタver1.00.zip
(278.98 KiB) ダウンロード数: 130 回
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

閉鎖

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