|
|
2017/11/22(Wed) 21:26:43|NO.81890
一人称視点ゲームが作りたいですので作ろうとしたのです。
でもどうしても視点カメラ(d3setcam)のターゲット座標の操作がわからないのです。
どうすればいいのでしょうか!?教えてください!おなしゃす!
※始めたばかりなので、出来ればわかりやすくおなしゃす・・・・
※OSはUbuntuです、Wineで無理やり動かしているのでシンプルに教えていただくと
ものすごく嬉しいのです。
試行錯誤して挫折した文↓
*main
if start=1:stop
title "無題":cls 4
color 100,100,100:boxf 0,0,640,23
button "ファイル",*file
pos 65,0:button "編集",*edit
pos 130,0:button "設定",*set
pos 195,0:button "ヘルプ",*help
pos 575,0:button "テストプレイ",*play
;status
pos 257,-3:font msgothic,12,1:color 255,255,255
mes "プレイヤー位置:"+px+","+py+","+pz
pos 257,10
mes "プレイヤー視点:"+psx+","+psy+","+psz
*file
*edit
repeat
color 0,0,0:boxf 0,20,640,480
pos 0,30:color 100,100,100
mes "マウス座標:":mes mousex:mes mousey
mes "PC座標:":mes pcx:mes pcy:mes pcz
;横方向
pcx=1000
;縦方向
pcz=480-mousey+pcz1
pcz=210-mousey
#include "d3m.hsp"
color 255,255,255:d3box 100,100,100,0,0,0
;cammove
wait 5
d3setcam px,py,pz,pcx,100,pcz
loop
*set
*help
|
|
2017/11/23(Thu) 16:49:01|NO.81895
API叩いちゃってるし、Wine環境で動くかわからないけど
Windowsでは動いたコード。
bgscrにすればAPI叩かなくていいかも。
もっと簡潔に書ける人がいれば、修正しちゃってください。
#include "d3m.hsp"
#uselib "user32.dll"
#cfunc GetSystemMetrics "GetSystemMetrics" int
#const SM_CYCAPTION $00000004 // タイトルバーの高さ
#const MV 0.5 // 移動速度
// スクリーンサイズ
sx = 960
sy = 540
// 画面中心座標
scx = sx / 2
scy = sy / 2
// ウィンドウの枠算出
frmx = ((ginfo_wx2 - ginfo_wx1) - ginfo_winx) / 2
frmy = (((ginfo_wy2 - ginfo_wy1) - GetSystemMetrics(SM_CYCAPTION)) - ginfo_winy) / 2
frmy += GetSystemMetrics(SM_CYCAPTION)
// 設置する箱の位置情報(てきとー)
bx = 240, 160, 80, 40, -60, -90, -120, -200
by = 200, -80, 40, -120, 120, -80, 20, -160
bs = 10 // 箱のサイズ
// スクリーン設定
screen 0, sx, sy, 0
title "[WASD]移動 [MOUSE]視点 [ESC]終了"
mouse ginfo_wx1 + frmx + scx, ginfo_wy1 + frmy + scy
// カメラの初期設定
ch = 0.0 // カメラ水平角度
cv = 0.0 // カメラ垂直向き
cx = 0.0 // カメラ位置
cy = 0.0
cz = 10.0
clx = 0.0 // カメラターゲット位置
cly = 0.0
clz = 0.0
gosub *updatecam
*main
// 動作処理
// ESC
getkey k, 27:if k > 0:end
cm = 0 // カメラ移動フラグ
// 前進後退は同時押しさせない
// W
getkey k, 87
if k > 0 {
cm += 8
}
else {
// S
getkey k, 83
if k > 0 {
cm += 1
}
}
// 左移動右移動は同時押しさせない
// A
getkey k, 65
if k > 0 {
cm += 2
}
else {
// D
getkey k, 68
if k > 0 {
cm += 4
}
}
//mouse scx, scy
//カメラの状態を更新
gosub *updatecam
// 描画処理
redraw 0
// 画面クリア
color 255, 255, 255 : boxf
// 床描画
color 0, 192, 0
repeat 32
d3line 256, 256 - (cnt * 16), 0, -256, 256 - (cnt * 16), 0
d3line 256 - (cnt * 16), 256, 0, 256 - (cnt * 16), -256, 0
loop
// 箱描画
color 0, 0, 255
repeat 8
d3box bx(cnt), by(cnt), 0, bx(cnt) + bs, by(cnt) + bs, bs
loop
// サイト描画
color 255, 0, 0
line scx - 8, scy, scx + 8, scy
line scx, scy - 8, scx, scy + 8
// フレームレート表示
color 0, 0, 0
pos 0, 0:mes "fps:" + d3getfps()
redraw 1
await (1000 / 60) // fps60位のウェイト
goto *main
// カメラ更新
*updatecam
// カメラ位置の更新
if (cm > 0) {
// 移動してる場合だけ更新
fdir = ch
switch (cm)
case 8 // 前
fmv = MV
swbreak
case 1 // 後
fmv = -MV
swbreak
case 2 // 左
fmv = MV
fdir = ch - 1.5707
swbreak
case 4 // 右
fmv = -MV
fdir = ch - 1.5707
swbreak
case 10 // 右前
fmv = MV
fdir = ch - 0.7853
swbreak
case 12 // 左前
fmv = -MV
fdir = ch - 2.356
swbreak
case 3: // 右後
fmv = MV
fdir = ch - 2.356
swbreak
case 5: // 左後
fmv = -MV
fdir = ch - 0.7853
swbreak
swend
fx = sin(fdir)
fy = cos(fdir)
fz = 1.0
// 正規化
len = sqrt((fx * fx) + (fy * fy) + (fz * fz))
if (len != 0.0) {
fx /= len
fy /= len
fz /= len
}
// カメラ移動
fx *= fmv
cx += fx
fy *= fmv
cy += fy
}
// カメラ視点の更新
// LookAtカメラしかないみたいなので、ターゲット位置を算出する
fx = double(mousex - scx)
fy = double(mousey - scy)
if (ginfo_act != -1):mouse ginfo_wx1 + frmx + scx, ginfo_wy1 + frmy + scy
ch += fx / 500.0
cv -= fy / 100.0
// リミッター
if ch < -6.2832:ch += 6.2832
if ch > 6.2832:ch -= 6.2832
if cv < -10.0:cv = -10.0
if cv > 10.0:cv = 10.0
// 水平方向のベクトルを算出する
fx = sin(ch)
fy = cos(ch)
fz = 1.0
// 正規化
len = sqrt((fx * fx) + (fy * fy) + (fz * fz))
if len != 0.0 {
fx /= len
fy /= len
fz /= len
}
clx = cx + (fx * 10)
cly = cy + (fy * 10)
clz = cz + cv
// カメラ更新
d3setcam cx, cy, cz, clx, cly, clz, 1.0
return
| |
|
2017/11/23(Thu) 17:09:01|NO.81896
あーカメラ視点の正規化計算いらないや。
単純に
fx = sin(ch)
fy = cos(ch)
clx = cx + fx
cly = cy + fy
clz = cz + cv
だけでよいと思われる。
|
|
2017/11/24(Fri) 18:22:14|NO.81899
ありがとうございます!助かりました!
|
|