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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0626
MT2Dアクションゲームのスクロールについて7未解決


MT

リンク

2017/6/26(Mon) 16:31:17|NO.80399

今、2Dアクションのゲームを作っているのですが、
主人公が画面の端まで行ったときに、スクロールさせるにはどうすればよいですか。
ちょっと意味が分かりにくいかもしれませんがご了承ください。

下にあるのがスクリプトです。

*mapmap
mapsizey = 23 ; マップ
mapsizex = 32 ; スクリーンロック
apsizexx = mapsizex*10 ; マップ全体の横の長さ

dim map,mapsizexx,mapsizey ; ステージ1のブロックの配置を管理(配列変数)

notesel map
map=" 0 \n"
map+"0 0 \n"
map+"0 0 \n"
map+"0 0 0 0 0 \n"
map+"0 0000 0 \n"
map+"0 0 \n"
map+"00 0 \n"
map+"0 00 \n"
map+"00000000 0000 000 0 0 0 00 \n"
map+"000000000 00 000 0 0 0 0 00 \n"
map+"000000000 00 000 0 0 0 0 00 \n"
map+"000000000 00 000 0 0 0 0 00 00 \n"

screen 0,640,320
;
;
;
x=0; 自分x値
y=0; 自分y値

*main
repeat
color:boxf; 背景塗りつぶし
;
noteget gyou,(y+32)/32; 自分の上のマスを取得
masu=strmid(gyou,(x+16)/32,1); ↑のつづき
title "自分の座標="+(x+16)/32+"/"+y/32+" 「"+masu+"」"
;
stick key,15
gosub,*mapwrite
gosub,*jiki
;
redraw 1:await 25:redraw 0
loop
;
;
;
*jiki
color 255,255,255
boxf x,y,x+32,y+32; 自分表示
;
if key&1:{;横移動
noteget gyou,y/32; 自分の左隣のますを取得
masu=strmid(gyou,(x+16-1)/32,1); ↑のつづき
if masu=" ":x-3
}
if key&4:{;横移動
noteget gyou,y/32; 自分の右隣のますを取得
masu=strmid(gyou,(x+16+1)/32,1); ↑のつづき
if masu=" ":x+3
}
;
;
if rakka<9:rakka+1;落下速度
noteget gyou,(y+32)/32; 自分のしたのマスを取得
masu=strmid(gyou,(x+16)/32,1); ↑のつづき
if masu="0":yuka=1:y=y/32*32:rakka=0:else:yuka=0; もしマスが床なら落下しないよう設定
if yuka=0:y+rakka;実際の落下
;
if key&16:if yuka=1:jump=20
if jump>0:{
noteget gyou,(y-32)/32; 自分の上のマスを取得
masu=strmid(gyou,(x+16)/32,1); ↑のつづき
if masu!" ":y=y/32*32:jump=1
jump-1
y-jump
}
;
if x<0:x=0
if y<0:y=0
if x>640:x=640
;
;
;埋まってしまった場合の救済
noteget gyou,y/32; 自分のマスを取得
masu=strmid(gyou,(x+16)/32,1); ↑のつづき
if masu="0":{
if (x+16)/32*32>x+16:x-1
if (x+16)/32*32<x+16:x+1
}
;
;
;
if y>400:dialog "穴に落ちてやられた。":gosub ,*mapmap
;
;
return
*mapwrite
repeat 10;高さの回数ループ

noteget gyou,cnt
takasa=cnt

repeat 20;幅の回数ループ
masu=strmid(gyou,cnt,1)
color 255,255,0
if masu="0":color 128,128,0
if masu=" ":color
boxf cnt*32,takasa*32,cnt*32+32,takasa*32+32
loop
loop
return



この記事に返信する


まー

リンク

2017/6/26(Mon) 17:45:43|NO.80400

ゼルダの伝説をサイドビューにした感じっすかね?



まー

リンク

2017/6/26(Mon) 17:56:05|NO.80401


#define size 32 #define mapx 40 #define mapy 10 notesel map map="" map+="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0," map+="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0," map+="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0," map+="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0," map+="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0," map+="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0," map+="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0," map+="0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0," map+="0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0," map+="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1," buffer 2,mapx*size,mapy*size i=0:i2=0 repeat mapy:cnt2=cnt repeat mapx getstr a,map,i,',':i+=strsize if int(a)=0:color 200,230,255 //空 if int(a)=1:color 64 //地面 boxf cnt*size,cnt2*size , cnt*size+size,cnt2*size+size loop loop screen 0,640,320 x=0 ; 自分x値 y=(mapy-2)*size ; 自分y値 stage=0 sx=0 ;スクロール用 *main pos 0,0:gcopy 2,stage*640,0,640,320 stick key,5 if key&1:x-2 if key&4:x+2 if x>640-size:stage++:x=0 :if stage>1:x=640-size:else:gosub *scroll //画面右に到着したかチェック if x<0 :stage--:x=640-size:if stage<0:x=0 :else:gosub *scroll //画面左に到着したかチェック stage=limit(stage,0,1) color ,,255:boxf x,y,x+size,y+size title "STAGE "+(stage+1) redraw:redraw 0 await 10 goto *main *scroll repeat pos 0,0:gcopy 2,sx,0,640,320 if stage=0:sx-=10 if stage=1:sx+=10 if sx>640||sx<0:break redraw:redraw 0 await 10 loop return

こんな感じの作ったんですけどどーっすか?
もし間違ってたらすんません



まー

リンク

2017/6/26(Mon) 17:57:04|NO.80402

衝突判定とかジャンプは割愛しました



kino

リンク

2017/6/26(Mon) 20:16:35|NO.80408

>主人公が画面の端まで行ったときに、スクロールさせるにはどうすればよいですか。
スーパーマリオブラザーズのような感じであれば
カメラ座標を使えばいいと思います。
描画するオブジェクトの座標からカメラ座標を引けばいいだけなので^^;



しあ

リンク

2017/6/26(Mon) 23:53:07|NO.80420

自分もさいきんやって、教えられるほどじゃないですが
流れだけ、マスでやってますがx.yの数値を基準にしてマス目もそこから割ったり、ただマス目でわるから
1あまったらキャラ的には次のますにいるからプラス1したりとか
全体と画面の差額で0になるまでスクロールするようにしたり
ややこしいです、ジャンプとか後回しにしたほうがいいですよ
連動するような風にしたほうが後々楽だし
後、マスの切り替わりおかしいなと思ってたら<=使ってなかったとかあるし
mesで数値を確認しながらやるとか一つ一つ原因を潰していくといいですよ



kino

リンク

2017/6/27(Tue) 18:10:10|NO.80423

簡単に書くとこんな感じでしょうか

; マップ作成 dim map,100,10 repeat 100 dat=cnt/2\4 if dat=0 : dat=2 dat2=cnt\4 if dat2=0 : dat2=2 map(cnt,dat2)=1 map(cnt,9-dat)=1 map(cnt,0)=1 map(cnt,9)=1 loop repeat 10 map(0,cnt)=1 map(99,cnt)=1 loop ;メインループ my_x=100:my_y=100:mysize=30:boxsize=40 repeat add_x=0 stick key,5 if key&4 : add_x=4 if key&1 : add_x=-4 if key&16 : if key_flag=0 : add_y=-14 : key_flag=1 add_y++ ; 重力処理 my_y+=add_y gosub *collision_detection;x軸計算後に衝突判定をする if collision_flag>0 { if add_y>=0 { my_y=rect_ey*boxsize-mysize-1:add_y=0:key_flag=0 ;落下中ならブロックの上に修正 } else { my_y=rect_sy*boxsize+boxsize:add_y=0 ;ジャンプ中ならブロックの下に修正 } } my_x+=add_x gosub *collision_detection;y軸計算後に衝突判定をする if collision_flag>0 { if add_x>=0 { my_x=rect_ex*boxsize-mysize-1 ;右に移動中ならブロックの左に修正 } else { my_x=rect_sx*boxsize+boxsize ;左に移動中ならブロックの右に修正 } } if my_x>(400+scro_x_fix) : scro_x=my_x-400 ; スクロール処理 if scro_x_fix < scro_x : scro_x_fix = scro_x ; 戻りのスクロールは固定 ; 背景描画 redraw 0 color 0,0,0 boxf color 255,255,255 repeat 10 y=cnt repeat 100 x=cnt if map(x,y)=1 { boxf x*boxsize-scro_x,y*boxsize,x*boxsize+boxsize-2-scro_x,y*boxsize+boxsize-2 ;背景描画時にスクロールの値を引く } loop loop ;自キャラ描画 color 255,0,0 boxf my_x-scro_x,my_y,my_x+mysize-scro_x,my_y+mysize ;自キャラ描画時にスクロールの値を引く redraw 1 await 17 loop *collision_detection;衝突判定 rect_sx=my_x/boxsize rect_ex=(my_x+mysize)/boxsize rect_sy=my_y/boxsize rect_ey=(my_y+mysize)/boxsize collision_flag=map(rect_sx,rect_sy)+map(rect_ex,rect_sy)+map(rect_sx,rect_ey)+map(rect_ex,rect_ey) return



しあ

リンク

2017/6/28(Wed) 00:48:40|NO.80427

度々すいません
教えるほどでわないですが
またまた考えかただけですが
キャラが特定の位置にいくまで
いってからキャラの移動は止まり背景をスクロール
また特定の位置まできたら背景は止まりキャラだけスクロールする
最初の移動した距離を背景のスクロールにぴったり止めるために引けばいいていってたんだと思います
スクロールした距離とキャラが進んだ距離は全体マップの距離てことです
自分もそうですが人に言われてもわけわからないので最初から書いたらあっさりできることもあるので
リフレッシュしてみるのもいいかもですね



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