|
|
|
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
衝突判定とかジャンプは割愛しました
|
|
2017/6/26(Mon) 20:16:35|NO.80408
>主人公が画面の端まで行ったときに、スクロールさせるにはどうすればよいですか。
スーパーマリオブラザーズのような感じであれば
カメラ座標を使えばいいと思います。
描画するオブジェクトの座標からカメラ座標を引けばいいだけなので^^;
|
|
2017/6/26(Mon) 23:53:07|NO.80420
自分もさいきんやって、教えられるほどじゃないですが
流れだけ、マスでやってますがx.yの数値を基準にしてマス目もそこから割ったり、ただマス目でわるから
1あまったらキャラ的には次のますにいるからプラス1したりとか
全体と画面の差額で0になるまでスクロールするようにしたり
ややこしいです、ジャンプとか後回しにしたほうがいいですよ
連動するような風にしたほうが後々楽だし
後、マスの切り替わりおかしいなと思ってたら<=使ってなかったとかあるし
mesで数値を確認しながらやるとか一つ一つ原因を潰していくといいですよ
|
|
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
度々すいません
教えるほどでわないですが
またまた考えかただけですが
キャラが特定の位置にいくまで
いってからキャラの移動は止まり背景をスクロール
また特定の位置まできたら背景は止まりキャラだけスクロールする
最初の移動した距離を背景のスクロールにぴったり止めるために引けばいいていってたんだと思います
スクロールした距離とキャラが進んだ距離は全体マップの距離てことです
自分もそうですが人に言われてもわけわからないので最初から書いたらあっさりできることもあるので
リフレッシュしてみるのもいいかもですね
|
|