■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

返信する
Yukimura
記事: 26
登録日時: 2023年3月31日(金) 17:27

■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by Yukimura »

*質問に誤りがあったため、質問を修正いたしました

プラグイン「MV3D」で昔の3Dダンジョンゲーム(女神転生、ウィザードリー)のようなゲーム制作を目指しています。

「←→↑↓」の方向キーを押した際、カメラの向きだけを変えたいため
方向キーを押しても、「主人公の歩行グラが移動せず向きだけを変える」方法を探しています。
ご助言、よろしくお願いいたします。

ー------------------------------------

個人的に調べたところ
下記のページよりダウンロードしたプラグインでできそうでしたが

https://amagamina.jp/blog/change-dir-only/
ChangeDirOnly.js(天神いな様)

viewtopic.php?t=6559
NYA_PlayerRotationForbid.js(にゃたま様)


特定のキーを押しながら方向キーを押さないと実行されないため
特定のキーを押さずに、←→↑↓の方向キーだけで
「主人公の歩行グラが移動せず向きだけを変える」事ができる方法が見つかればと思っています。
ecf5DTTzl6h6lJj02
記事: 715
登録日時: 2018年12月23日(日) 13:55

Re: ■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by ecf5DTTzl6h6lJj02 »

こんにちは。
Yukimura さんが書きました:*質問に誤りがあったため、質問を修正いたしました

プラグイン「MV3D」で昔の3Dダンジョンゲーム(女神転生、ウィザードリー)のようなゲーム制作を目指しています。

「←→↑↓」の方向キーを押した際、カメラの向きだけを変えたいため
方向キーを押しても、「主人公の歩行グラが移動せず向きだけを変える」方法を探しています。
ご助言、よろしくお願いいたします。

ー------------------------------------

個人的に調べたところ
下記のページよりダウンロードしたプラグインでできそうでしたが

https://amagamina.jp/blog/change-dir-only/
ChangeDirOnly.js(天神いな様)

viewtopic.php?t=6559
NYA_PlayerRotationForbid.js(にゃたま様)


特定のキーを押しながら方向キーを押さないと実行されないため
特定のキーを押さずに、←→↑↓の方向キーだけで
「主人公の歩行グラが移動せず向きだけを変える」事ができる方法が見つかればと思っています。
サンプルプロジェクトのファーストパーソンモードと同じ状態のときは、
←で左、 →で右にカメラを プラグインパラメータの 『Turn Increment』 で設定した角度回転し、
↑で前進 、↓で後退
q で 左に、E で右に移動(カニ歩き)
というキー設定になるはずです。
特別な設定をしなくても ← → は主人公が移動しないで 向きだけ変えるという動作になるはずで、
これで十分な気がするのですが、何か問題があるのでしょうか?
Yukimura
記事: 26
登録日時: 2023年3月31日(金) 17:27

Re: ■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by Yukimura »

ご返信、ご助言ありがとうございます。
MV3Dに関する設定の話になるので質問では省いたのですが、改めて書かせていただきます。

まず、昔の女神転生やウィザードリーなど、3Dダンジョンゲームの雰囲気を出したいため
主人公の歩行グラフィックは設定せず(テスト用のみ設定する場合があります)
主観カメラ映像のよう見えるようにしています。

それは本来ならば、dist0で行うのですが
dist0ですと、壁や宝箱等のオブジェに対して、それらが画面一杯になるまで近づいてしまい
酔いやすさを感じるため、distを1~3(1~3のどれにするかはまだ未決定ですが)で調整しています。
(そのほか、通路を3マスにし、中央以外は歩行できなくすることで壁との距離を取っています)

distを0よりも大きくしますと、カメラ位置が特定の位置に固定されてしまうようで
カメラが主人公の後ろに来てくれない場合があります。

そのため、並列処理で「条件分岐:Input.isTriggered('up')(↑ボタンが押された瞬間)」など
「←→↑↓」ボタンを押したときに分岐でカメラの位置や向きが変わるよう設定しました。

例えば「←」を押したときは「mv3d yaw +90 0.5」(カメラの向きを90度回転)などで
カメラの位置や向きを移動させています。
(q 、E よりも、方向キーの方が直感的に操作できるため、こちらでも操作できるようにしておきたく思います)

そうするとどうも、「←→↑↓」ボタンを押したとき、主人公も一緒に1歩移動してしまい
カメラが方向転換するだけのはずが、進んでしまうというトラブルが起きている状態です。

そこで、「←→↑↓」ボタンを押しても向きだけが変わり、主人公の位置は変わらない方法を探しています。

長くなってしまい、申し訳ありません。
ecf5DTTzl6h6lJj02
記事: 715
登録日時: 2018年12月23日(日) 13:55

Re: ■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by ecf5DTTzl6h6lJj02 »

こんばんは。
Yukimura さんが書きました: 本来ならば、dist0で行うのですが
dist0ですと、壁や宝箱等のオブジェに対して、それらが画面一杯になるまで近づいてしまい
酔いやすさを感じるため、distを1~3(1~3のどれにするかはまだ未決定ですが)で調整しています。
(そのほか、通路を3マスにし、中央以外は歩行できなくすることで壁との距離を取っています)
dist を 0 以外に設定する場合でも、
プラグインパラメータの 『Allow Turning』を 『Turn With A+D and left+right』に設定していれば、
dist が 0 の場合と同様に操作できるようになります。
この設定をしたうえで、dist を 0.5 か 1 に設定すれば、希望に近い表示と操作にできるのではないかと思います。
dist は 1 より大きくするとプレイヤーとカメラの間にイベントや壁が入ってしまうので、1 以下に設定しておいたほうがいいかもしれません。
Yukimura
記事: 26
登録日時: 2023年3月31日(金) 17:27

Re: ■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by Yukimura »

ecf5DTTzl6h6lJj02 さんが書きました:こんばんは。
Yukimura さんが書きました: 本来ならば、dist0で行うのですが
dist0ですと、壁や宝箱等のオブジェに対して、それらが画面一杯になるまで近づいてしまい
酔いやすさを感じるため、distを1~3(1~3のどれにするかはまだ未決定ですが)で調整しています。
(そのほか、通路を3マスにし、中央以外は歩行できなくすることで壁との距離を取っています)
dist を 0 以外に設定する場合でも、
プラグインパラメータの 『Allow Turning』を 『Turn With A+D and left+right』に設定していれば、
dist が 0 の場合と同様に操作できるようになります。
この設定をしたうえで、dist を 0.5 か 1 に設定すれば、希望に近い表示と操作にできるのではないかと思います。
dist は 1 より大きくするとプレイヤーとカメラの間にイベントや壁が入ってしまうので、1 以下に設定しておいたほうがいいかもしれません。

ご助言、ありがとうございます。

プラグインパラメータの 「Allow Turning」を 「Turn With A+D and left+right」に変え
ボタンを押した瞬間の「条件分岐」を
「移動ルート → プレイヤー:左に90度回転 or 右に90度回転」にする事で
一歩進まずに、向きだけを変えることができるようになりました。

しかし、「↓」を押したときは
向きを変えるだけでなく後ろへ一歩進んでしまいます。
「↓」を押したときの。ボタンを押した瞬間の「条件分岐」は
「プラグインコマンド:mv3d yaw +-180 0.5」にしています。
ecf5DTTzl6h6lJj02
記事: 715
登録日時: 2018年12月23日(日) 13:55

Re: ■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by ecf5DTTzl6h6lJj02 »

Yukimura さんが書きました: 「↓」を押したときの。ボタンを押した瞬間の「条件分岐」は
「プラグインコマンド:mv3d yaw +-180 0.5」にしています。
上のスレッドでも書いたように、↓ を押したときは、後退する仕様ですので、後ろに下がってしまいます。
↓ を押したときに、後ろに振り向く仕様にするのであれば、プラグインを改造したほうがよさそうです。

JavaScriptを編集できるアプリケーションで、 MV3d.js を開き、
(プラグインファイルを編集するときは、バックアップをしっかりとってから行なってください)
  1. 3682行目あたりから始まっている、 updateInputCamera という関数の内容を以下のコードに変更してください。

    コード: 全て選択

    	updateInputCamera(){
    		if(this.isDisabled()||this.loadData('cameraLocked')||!$gamePlayer.canMove()){ return; }
    		const is1stPerson = this.is1stPerson();
    		const allowRotation = this.loadData('allowRotation',mv3d["a" /* default */].KEYBOARD_TURN) || is1stPerson;
    		const allowPitch = this.loadData('allowPitch',mv3d["a" /* default */].KEYBOARD_PITCH);
    		if( allowRotation ){
    			const leftKey=mv3d["a" /* default */].getTurnKey('left'), rightKey=mv3d["a" /* default */].getTurnKey('right'), downKey=mv3d["a" /* default */].getTurnKey('down');
    			if(mv3d["a" /* default */].TURN_INCREMENT>1){
    				const turning = this.blendCameraYaw.currentValue()!==this.blendCameraYaw.targetValue();
    				const yawSpeed = mv3d["a" /* default */].TURN_INCREMENT / mv3d["a" /* default */].YAW_SPEED;
    				if(Input.isTriggered(leftKey)||Input.isPressed(leftKey)&&!turning){
    					this.blendCameraYaw.setValue(this.blendCameraYaw.targetValue()+mv3d["a" /* default */].TURN_INCREMENT,yawSpeed,false);
    					this.playerFaceYaw();
    				}else if(Input.isTriggered(rightKey)||Input.isPressed(rightKey)&&!turning){
    					this.blendCameraYaw.setValue(this.blendCameraYaw.targetValue()-mv3d["a" /* default */].TURN_INCREMENT,yawSpeed,false);
    					this.playerFaceYaw();
    				} else if(Input.isTriggered(downKey)||Input.isPressed(downKey)&&!turning) {
    					this.blendCameraYaw.setValue(this.blendCameraYaw.targetValue()-180,yawSpeed,false);
    					this.playerFaceYaw();					
    				}
    			}else{
    				const increment = mv3d["a" /* default */].YAW_SPEED / 60;
    				if(Input.isPressed(leftKey)&&Input.isPressed(rightKey)&&Input.isPressed('down')){
    					// do nothing
    				}else if(Input.isPressed(leftKey)){
    					this.blendCameraYaw.setValue(this.blendCameraYaw.targetValue()+increment,0.1);
    				}else if(Input.isPressed(rightKey)||Input.pressed(downKey)){
    					this.blendCameraYaw.setValue(this.blendCameraYaw.targetValue()-increment,0.1);
    				}
    			}
    		}
    		if( allowPitch ){
    			const increment = mv3d["a" /* default */].PITCH_SPEED / 60;
    			if(Input.isPressed('pageup')&&Input.isPressed('pagedown')){
    				// do nothing
    			}else if(Input.isPressed('pageup')){
    				this.blendCameraPitch.setValue(Math.min(179,this.blendCameraPitch.targetValue()+increment),0.1);
    			}else if(Input.isPressed('pagedown')){
    				this.blendCameraPitch.setValue(Math.max(1,this.blendCameraPitch.targetValue()-increment),0.1);
    			}
    		}
    
    		if(mv3d["a" /* default */].inputCameraGamepad){
    			if(mv3d["a" /* default */]._gamepadStick.x && allowRotation){
    				const increment = mv3d["a" /* default */].YAW_SPEED / 60 * mv3d["a" /* default */].lookSensitivity;
    				this.blendCameraYaw.setValue(this.blendCameraYaw.targetValue()+mv3d["a" /* default */]._gamepadStick.x*increment,0.1);
    			}
    			if(mv3d["a" /* default */]._gamepadStick.y && allowPitch){
    				const increment = mv3d["a" /* default */].PITCH_SPEED / 60 * mv3d["a" /* default */].lookSensitivity;
    				this.blendCameraPitch.setValue(this.blendCameraPitch.targetValue()+mv3d["a" /* default */]._gamepadStick.y*increment*(mv3d["a" /* default */].invertY*-2+1),0.1);
    			}
    		}
    
    		if(mv3d["a" /* default */].inputCameraMouse){
    			mv3d["a" /* default */]._touchState.isTapped = !TouchInput._screenPressed && mv3d["a" /* default */]._touchState.touchCount>0 && mv3d["a" /* default */]._touchState.touchCount<15 && Math.abs(mv3d["a" /* default */]._touchState.deltaX)<5 && Math.abs(mv3d["a" /* default */]._touchState.deltaY)<5;
    			if(TouchInput._screenPressed){
    				if(mv3d["a" /* default */]._touchState.isTouching){
    					mv3d["a" /* default */]._touchState.deltaX=TouchInput.x-mv3d["a" /* default */]._touchState.lastX;
    					mv3d["a" /* default */]._touchState.deltaY=TouchInput.y-mv3d["a" /* default */]._touchState.lastY;
    					if(mv3d["a" /* default */]._touchState.deltaX && allowRotation){
    						const increment = mv3d["a" /* default */]._touchState.deltaX / Graphics.width * 180;
    						this.blendCameraYaw.setValue(this.blendCameraYaw.targetValue()-increment*mv3d["a" /* default */].lookSensitivity,0.1);
    					}
    					if(mv3d["a" /* default */]._touchState.deltaY && allowPitch){
    						const increment = mv3d["a" /* default */]._touchState.deltaY / Graphics.width * 180;
    						this.blendCameraPitch.setValue(this.blendCameraPitch.targetValue()-increment*mv3d["a" /* default */].lookSensitivity*(mv3d["a" /* default */].invertY*-2+1),0.1);
    					}
    					++mv3d["a" /* default */]._touchState.touchCount;
    				}else{
    					mv3d["a" /* default */]._touchState.isTouching=true;
    				}
    			}else{
    				mv3d["a" /* default */]._touchState.isTouching=false;
    				mv3d["a" /* default */]._touchState.touchCount=0;
    			}
    			mv3d["a" /* default */]._touchState.lastX=TouchInput.x;
    			mv3d["a" /* default */]._touchState.lastY=TouchInput.y;
    		}
    	},
    
  2. 3863行目あたりから始まっている、 getInputDirection 関数の内容を以下のコードに変更してください。

    コード: 全て選択

    mv3d["a" /* default */].getInputDirection=function(){
    	let dir = mv3d["a" /* default */].DIR8MOVE ? Input.dir8 : Input.dir4;
    	if(dir === 2) { dir = 0; }
    	return mv3d["a" /* default */].transformDirection(dir,mv3d["a" /* default */].blendCameraYaw.currentValue());
    }
    
この改造で、動くことなく ← →で、カメラとプレイヤーを左右に、↓でカメラとプレイヤーを後ろに振り向かせることができるはずです。
マップに設定している、並列処理のイベントは必要ないので、機能しないようにして、確認してください。
Yukimura
記事: 26
登録日時: 2023年3月31日(金) 17:27

Re: ■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by Yukimura »

改造前のプラグインを別フォルダに保存したうえで
改造した結果、「←、→、↓」ともに移動する事無く方向だけ転換され
問題無く動かす事ができました。

distの方は、作りながら調整していきたいと思います。

プラグインの改造まで作っていただき、お手間を取らせました。
非常に助かりました。

本当に、どうもありがとうございます。
Yukimura
記事: 26
登録日時: 2023年3月31日(金) 17:27

Re: ■質問内容修正■ 歩行グラを移動せず方向だけ変える方法

投稿記事 by Yukimura »

追記

「←、→、↓」のボタンを押したときの並列処理はやめたのですが
「↑」に関しては、1回ボタンを押すたびに数歩進める必要があるため
並列処理を行っています。
返信する

“MV:質問”に戻る