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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0605
Okura☆横スクロールRPG3未解決


Okura☆

リンク

2016/6/5(Sun) 17:06:27|NO.75725


scx = double(double(double(ginfo_dispy)-double(ginfo_dispy)/3.)*(5./3.)) scy = ginfo_dispy-ginfo_dispy/3. scxb = 600 scyb = 450 scid = 1 fps = 1000/30 fon="MSゴシック" buffer 0 screen scid,scx,scy,,ginfo_dispx/2-scx/2,(ginfo_dispy/2-scy/2)-25 buffer 3 ;マップテクスチャァン color 120,120,120 :boxf 0,0,30,30 color 255,100,100 :boxf 30,0,60,30 color 0,255,0:boxf 0,30,30,90 dim mapd,21,16 repeat 19 mapd(cnt,10)=1 loop mapd(4,9)=1 mx = 120. my = 0. bspeedy = 2. mxsize =30. mysize =60. mxp = 0. myp = bspeedy jumpp=0. uy=30. ftime=0.05 jumptime=0. repeat redraw 0 buffer 2,scxb,scyb ;入力 getkey zj,90 getkey right,39 getkey left,37 if left=0:if right=0{ if mxp!0:if mxp>0:mxp-=0.25 if mxp!0:if mxp<0:mxp+=0.25 } if left = 1 :mxp=-2. if right = 1 :mxp=2. if zj=0:jumptime=0 if zj=1:if jumptime<5:jumpp=12.:jumptime+ ;作画 ;myp=bspeedy x = 0. repeat 21 y = 0. repeat 16 if mapd(int(x),int(y))=0{ pos x*(double(scxb)/20.),y*(double(scyb)/15.) gmode 0,30,30 gcopy 3,0,0,30,30 } if mapd(int(x),int(y))=1{ pos x*(double(scxb)/20.),y*(double(scyb)/15.) gmode 0,30,30 gcopy 3,30,0,30,30 ftime+=0.01 if mx>x*(double(scxb)/20.)+1:if mx<x*(double(scxb)/20.)+31:if my+mysize+1>y*(double(scyb)/15.):if my+mysize+1<y*(double(scyb)/15.)+uy:ftime=0.{ my-=int((my+mysize)-int(y*(double(scyb)/15.))) };左下下 if mx+mxsize-1>x*(double(scxb)/20.)+1:if mx+mxsize-1<x*(double(scxb)/20.)+31:if my+mysize+1>y*(double(scyb)/15.):if my+mysize+1<y*(double(scyb)/15.)+uy:ftime=0.{ my-=int((my+mysize)-int(y*(double(scyb)/15.))) };右下下 if mx-1>x*(double(scxb)/20.)-1:if mx-1<x*(double(scxb)/20.)+29:if my>y*(double(scyb)/15.):if my<y*(double(scyb)/15.)+uy:ftime=0.{ mx+=int(int(x*(double(scxb)/20.)+29)-(mx-1))+1 };左上左 if mx-1>x*(double(scxb)/20.)-1:if mx-1<x*(double(scxb)/20.)+29:if my+(mysize/2)>y*(double(scyb)/15.):if my+(mysize/2)<y*(double(scyb)/15.)+uy:ftime=0.{ mx+=int(int(x*(double(scxb)/20.)+29)-(mx-1))+1 };左中左 if mx-1>x*(double(scxb)/20.)-1:if mx-1<x*(double(scxb)/20.)+29:if my+mysize-1>y*(double(scyb)/15.):if my+mysize-1<y*(double(scyb)/15.)+uy:ftime=0.{ mx+=int(int(x*(double(scxb)/20.)+29)-(mx-1))+1 };左下左 } y+ loop x+ loop ;ME pos mx,my gmode 0 gcopy 3,0,30,mxsize,mysize if myp>uy:myp=uy ;ある程度のスピードが出ると制限 mx+=mxp my+=myp myp=ftime*1.08 jumpp*=0.7 my-=jumpp ;判定 /* y = 0. repeat 15 color 0,0,0 line 0.,y*(double(scyb)/15.),double(scxb),y*(double(scyb)/15.) y+ loop y = 0. repeat 30 color 0,0,0 line y*(double(scxb)/30.),0,y*(double(scxb)/30.),scyb y+ loop */ pos 10,10 color 0,0,0 mes mx mes my mes mxp mes myp mes int((mx-1)-int(x*(double(scxb)/20.))) mes jumpp mes ftime color 255,255,255 pset mx-1,my+mysize-1 gosub*copy_screen redraw 1 await fps loop *copy_screen gsel scid scxbefore = scx scybefore = scy scx = ginfo_winx scy = ginfo_winy if scxbefore!scx : width scx,double(scx)*(3./5.):return if scybefore!scy : width double(scy)*(5./3.),scy:return pos 0,0 gmode 0,scxb,scyb gzoom scx,scy,2,,,scxb,scyb,1 return



この記事に返信する


Okura☆

リンク

2016/6/5(Sun) 17:09:40|NO.75726

このスククリプトを実行してみてください。

まだ現在、↓と←だけしか、あたり判定をつけてないんですが、
なぜか、

自分

から

▀自分

ここの時に、左に壁に当たりに行くと、
上に上がってしまいます。。。
何がわるいのでしょうか。。。

プログラマーの皆さま、教えてください!



暇人

リンク

2016/6/5(Sun) 19:25:48|NO.75731

処理を考えれば当然の動作
斜め移動できる場合良くある罠

斜めに移動させてから縦横の順に判定移動してるんだろうけど
先に縦の判定してるので上に移動して
横判定の時には当たらない

簡単な解決方法として斜め移動する場合でも
判定する方向にのみ移動させて判定をするようにする

左下に移動するなら
縦に移動してから縦の判定
その移動した状態から横に移動させて横の判定
ってやれば良い

でもNO.75725の方法では困難
マップ作成と判定は別にする
マップデータ位置をスクリーン座標にするんじゃなく
スクリーン座標をマップデータ位置にして判定をする方が楽


但しこの方法は簡単な分弱点もある ■ A ■○ ■■ ○が自分でジャンプしてAに移動しようとしても 先に縦に移動させたときに空いてる所を越えてしまい入れない事が起きる なので判定サイズやジャンプに工夫が必要になる



KA

リンク

2016/6/5(Sun) 19:34:13|NO.75732

 bspeedy = 2.
なんて、変則的な書き方は別として
 (double(scxb)/20.)
とか何回も出てくるので、もう少しスマートに書けるでしょう。

そうすれば原因も分かるはずです。



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