HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1230
てんRPGの4人歩行の重なりについて6解決


てん

リンク

2016/12/30(Fri) 10:21:25|NO.77761

いわゆるドラクエ型の4人歩行を再現する際は、
キャラクターの重なりはどのように表現するのが
スムーズでしょうか?

単純に4人目から1人目の順に描画した場合、
当然1人目が一番上にくると思います。
それだと、奥から手前に向かって歩いているときは正常に描画されますが
手前から奥に向かって歩く場合は、


4↓ ↑1
3↓ ↑2
2↓ ↑3
1↓ ↑4



この記事に返信する


GENKI

リンク

2016/12/30(Fri) 14:52:35|NO.77763

> スムーズでしょうか?

「過去の実装を真似する」が手っ取り早く馴染みのある表現を実現できる方法です。
あまり馴染みのない表現だと違和感が抜けないこともあるので理由がなければ真似たほうがいいこともあります。

プログラム的には常に同じ順番で描画するほうがスムーズというか簡単にプロラミングできます。

プレイヤー視点ではどうなんでしょうね。
操作対象のキャラクターが常に一番手前に描画されて見えていたほうが操作しやすいかもしれませんし、奥行きを考慮した描画順のほうがリアリティがあって自然に見えるかもしれません。
どっちもありだと思います。「スムーズ」の解釈次第です。
過去のメーカー各社はどう判断したのか、というのも一つの判断基準だと思います。


> 手前から奥に向かって歩く場合は、

Uターン中の描画順番は…??とかそういう問題でしょうか。
平面を真上から見ているのではなく、平面を斜め上から見ていると考えればいいと思います。
画面上側が奥で下側が手前。それぞれ表示しているy座標に応じた奥行き座標を持っている。
描画時は奥行きをそれぞれ比較して、深い方から順に描画する。
左右移動時は奥行きに差がないので、同値だった場合の判断基準をもう1つ追加する必要があります。同じ深度なら若番の方が手前とか、右に移動するときだけは逆に若番が奥側になるとか。ですね。



てん

リンク

2016/12/30(Fri) 22:22:01|NO.77770

GENKIさま
ご回答ありがとうございます。

この質問を描いている途中で気が変わって、書き込みしないつもりだったのに
いつの間にか書き込んでいた(ウィンドウは閉じた筈…)
尻切れトンボな質問ですみませんm(__)m

素直に奥→手前に描画したらよさそうですね 
同座標の場合の優先度も必要か、、
自然に見せるのって結構大変ですね。
ありがとうございました。



窓月らら

リンク

2017/1/3(Tue) 05:32:35|NO.77816

超簡単です。Y座標順をそのまま描画順に置き換えるだけです。
sortvalを使います。

サンプル置いてあるので参考までにどうぞ。
http://miecat.com/?soft/hsp_tips11.htm



てん

リンク

2017/1/3(Tue) 10:56:23|NO.77821

窓月ららさま
ご回答ありがとうございます。

ご提示いただいたスクリプト拝見いたしました。
ソート→入替→表示が良く判りました、
ありがとうございます。

一点ご教示くださいませ、
30〜31行の部分は何故yを直接放り込んではいけないのでしょうか、
確かにsortval y,0だけだと、表示がおかしくなります、が
理由がわかりません。。(配列変数は領域が不定とかでしょうか?)
ご教示頂けますと幸いですm(__)m


memcpy tmp,y,TMPMEM // tmpにyを丸々コピー
sortval tmp // 小さい順でソート

×
sortval y,0



窓月らら

リンク

2017/1/3(Tue) 11:51:59|NO.77823

>30〜31行の部分は何故yを直接放り込んではいけないのでしょうか、

sortval y,0 とすると、yの内容が直接ソートされます。
この場合、xもソートし直さないといけなくなってしまい、非常に効率が悪くなります。

今回の処理の目的は「描画の順番だけ取得できればいい」のと、
配列の番号まで変化してしまうと、例えば
配列の0番は勇者、1番は魔法使い 等と管理していた場合面倒な事になってしまいます。
なので、memcpy tmp,y,TMPMEM でtmpにyの配列を丸々コピーしてから
sortget i,cnt で順番だけ取得するようにしてます。

;#const TMPMEM MAXCHR*4 // ソート用メモリサイズ(int) #const TMPMEM MAXCHR*8 // ソート用メモリサイズ(double)
なおここは、変数1個(配列番号1個)につき整数の場合は4バイト
実数の場合は8バイト確保する必要があるのでこのようになってます。
(サンプルでは速度調整の都合で実数を使ってますが、整数で問題ありません。)



てん

リンク

2017/1/3(Tue) 15:22:14|NO.77824

>描画の順番だけ取得できればいい

ああ、なるほど。

yの中身を直接変えると、要素の紐づけが面倒なので、、
yのコピーを使ってiを取得してから、本当のy(i)や顔色(i)を描画すると。。

納得(?)です。
わかりやすい説明、ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.