|
|
2014/7/5(Sat) 19:37:57|NO.62764
横スクロールのアクションゲームについて質問します。
とりあえずチャレンジしようと思ったんですが具体的にどのような
プログラムを組めばいいかわかりません。
とりあえず http://dev.onionsoft.net/seed/info.ax?id=373のようなゲームを作りたいです。
先日とりあえずチャレンジしたんですがマップの作り方で行き詰ってしましました。
どうすればいいか解説お願いします。
|
|
2014/7/7(Mon) 18:41:21|NO.62778
とりあえず、行き詰ったところまでを公開してみては?
今のままでは問題点も分かりません。
|
|
2014/7/7(Mon) 19:06:59|NO.62779
とりあえず http://1drv.ms/1xF8YCBにできている部分をUPしました。
表示されるマップの一番下がなぜか空白になってしまいます。
マップのデータはmapフォルダの001.txtです。
|
|
2014/7/7(Mon) 20:45:21|NO.62780
マップのテキストデータから0,1に変換するときに改行コードを考えていないのが原因じゃないでしょうか
またcellputで画像を置いていますが、横縦のループ回数を決め打ちしているのは何ででしょう…
|
|
2014/7/7(Mon) 21:55:54|NO.62782
>表示されるマップの一番下がなぜか空白になってしまいます。
マップデータが縦14列なんだから当然じゃ?
32*14=448
地面の部分が抜けてる所があるのはNO.62780の理由で
変換した数と描画時に利用する数が違ってしまってる
notegetかsplitで改行を無くして処理した方が楽
後、map配列は二次元配列で管理したほうが分かりやすい
後からマップデータのサイズが変わってもスクリプトの修正が必要無いようにしたサンプル
スクロールにも対応
//ウィンドウ
screen 0 , 640 , 480
title "壁の画像作るのがめんどいのでとりあえずキャラクターで表示"
//ERROR
onerror *error
//ロード中画像
buffer 1
celload "dat\\load.bmp",1,0
//ロード中表示
gsel 0,2
gcopy 1,0,0,640,480
//画像準備
buffer 2
celload "dat\\character.bmp"
csrc=stat
celdiv csrc,32,32
//////////////////////////////////////////////////////
//変数準備
sdim mapd,4000
//マップデータ読み込み
notesel mapd
;noteload "map\\001.txt"
//横38、縦15
mapd={"
11111111111111111111111111111111111111
11000000000000000000000000000000000001
10100000000000000000000000000000000001
10010000000000000000000000000000000001
10001000000000000000000000000000000001
10000100000000000000000000000000000001
10000010000000000000000000000000000001
10000001000000000000000000000000000001
10000000100000000000000000000000000001
10000000010000000000000000000000000001
10000000001000000000000000000000000001
10000000000100000000000000000000000001
10000000000010000000000000000000000001
10000000000001000000000000000000000001
11111111111111111111111111111111111111"}
noteget mdat,0
mapmaxx=strlen(mdat)
mapmaxy=notemax
dim map,mapmaxx+1,mapmaxy+1 //一つ多く確保しとくと色々楽なので・・・
repeat mapmaxy
noteget mdat,cnt
y=cnt
repeat mapmaxx
map(cnt,y)=peek(mdat,cnt)-'0'
loop
loop
maploopx=limit(ginfo_winx/32+1,0,mapmaxx) //スクロールするには1チップ多く必要なので+1
maploopy=limit(ginfo_winy/32+1,0,mapmaxy)
//ロード中非表示
gsel 0,2
cls
title "マップX="+mapmaxx+" Y="+mapmaxy
*main
redraw 0
stick k,$ff
if k&1{mapscrollx+3}
if k&4{mapscrollx-3}
if k&2{mapscrolly+3} //マップデータの縦を画面より大きくすれば縦のスクロールもする
if k&8{mapscrolly-3}
mapscrollx=limit(mapscrollx,-(mapmaxx-maploopx+1)*32,0) //横スクロール範囲制限
mapindexx=abs(mapscrollx/32) //横に何個ずらすか
mscx=mapscrollx\32 //画面左端のチップ描画位置
mapscrolly=limit(mapscrolly,-(mapmaxy-maploopy+1)*32,0) //縦スクロール範囲制限
mapindexy=abs(mapscrolly/32) //縦に何個ずらすか
mscy=mapscrolly\32 //画面上端のチップ描画位置
//マップ書き込み
y=mapindexy
repeat maploopy
pos mscx,mscy+cnt*32 //celputはY座標を固定して横に描画サイズ分ずれるので座標の変更は縦が変わる時だけで良い
repeat maploopx,mapindexx //cntがmapindexxから始まる
celput csrc,map(cnt,y)
loop
y+
loop
await 16
redraw 1
goto *main
stop
/////////////////////////////////////////////////////
*error
dialog "エラーが発生しました",1,"走れJUMP君! ERROR"
end

| |
|
2014/7/7(Mon) 22:47:08|NO.62783
上のプログラムはだいたい理解でかました
当たり判定はどのようにすればいいのでしょうか?
|
|
2014/7/7(Mon) 23:58:07|NO.62784
当たり判定も
dim hantei,38,15
とかで作って
自己座標x,yが移動した時にその先が0以外である場合〜とか
まずマップのナンバーから当たり判定を取得
repeat y
repeat x
if map(x,y) = 0: hantei(x,y) = 0
if map(x,y) = 1: hantei(x,y) = 1
if map(x,y) = 2: hantei(x,y) = 1
if map(x,y) = 3: hantei(x,y) = 0
以降も任意で
loop
loop
移動した先が0で無い場合戻るif hantei(x,y) ! 0: x - a
aは移動した時のベクトル値をそのままマイナスする
とか
移動先が0で無い場合移動できないif 移動キー & hantei(x+a,y+b) ! 0:
とかでそもそも移動そのものを止めるか
|
|
2014/7/8(Tue) 06:54:33|NO.62785
改造してみてプレイヤーを表示させてみようとしたらなぜか表示されません…
//ウィンドウ
screen 0 , 640 , 480
title ""
//ERROR
onerror *error
//ロード中画像
buffer 1
celload "dat\\load.bmp",1,0
//ロード中表示
gsel 0,2
gcopy 1,0,0,640,480
//画像準備
buffer 2
celload "dat\\character.bmp"
csrc=stat
celdiv csrc,32,32
//////////////////////////////////////////////////////
//変数準備
sdim mapd,4000
sdim map,4000
x=1:y=1
//マップデータ読み込み
notesel mapd
;noteload "map\\001.txt"
//横38、縦15
mapd={"
11111111111111111111111111111111111111
10000000000000000000000000000000000001
10000000000000000000000000000000000001
10000000000000000000000000000000000001
10000000000000000000000000000000000001
10000000000000000000000000000000000001
10000000000000000000000000000000000001
10000000000000000000000000000000000001
10000000000000000111110000000000000001
10000000000000000000000000000000000001
10000000000000000000010000000000000001
10000000000000000000000000000000000001
10000000000001111111110000000000000001
10000000000011111111110000000000000001
11111111111111111111111111111111111111"}
noteget mdat,0
mapmaxx=strlen(mdat)
mapmaxy=notemax
dim map,mapmaxx+1,mapmaxy+1 //一つ多く確保しとくと色々楽なので・・・
repeat mapmaxy
noteget mdat,cnt
y=cnt
repeat mapmaxx
map(cnt,y)=peek(mdat,cnt)-'0'
loop
loop
maploopx=limit(ginfo_winx/32+1,0,mapmaxx) //スクロールするには1チップ多く必要なので+1
maploopy=limit(ginfo_winy/32+1,0,mapmaxy)
//ロード中非表示
gsel 0,2
cls
title "マップX="+mapmaxx+" Y="+mapmaxy
*main
gosub *mapmain //マップ
gosub *idou //移動
goto *main
/*------------------------------------------------------------------------------*/
*mapmain
redraw 0
stick k,$ff
if k&1{mapscrollx+3}
if k&4{mapscrollx-3}
if k&2{mapscrolly+3} //マップデータの縦を画面より大きくすれば縦のスクロールもする
if k&8{mapscrolly-3}
mapscrollx=limit(mapscrollx,-(mapmaxx-maploopx+1)*32,0) //横スクロール範囲制限
mapindexx=abs(mapscrollx/32) //横に何個ずらすか
mscx=mapscrollx\32 //画面左端のチップ描画位置
mapscrolly=limit(mapscrolly,-(mapmaxy-maploopy+1)*32,0) //縦スクロール範囲制限
mapindexy=abs(mapscrolly/32) //縦に何個ずらすか
mscy=mapscrolly\32 //画面上端のチップ描画位置
//マップ書き込み
y=mapindexy
repeat maploopy
pos mscx,mscy+cnt*32 //celputはY座標を固定して横に描画サイズ分ずれるので座標の変更は縦が変わる時だけで良い
repeat maploopx,mapindexx //cntがmapindexxから始まる
celput csrc,map(cnt,y)
loop
y+
loop
await 16
redraw 1
return
/*------------------------------------------------------------------------------*/
*idou
//左へ
getkey ki,37
if ki=1 and map(x-1,y) ! 0 : ppx-1
//右へ
getkey ki,39
if ki=1 and map(x+1,y) ! 0 : ppx+1
gsel 0,1
celput csrc,3
return
/*------------------------------------------------------------------------------*/
/////////////////////////////////////////////////////
*error
dialog "エラーが発生しました",1,""
end

| |
|
2014/7/8(Tue) 17:56:18|NO.62788
新しく http://1drv.ms/1xF8YCBに更新したものをUPしました。
もう少し動きはよくできないでしょうか?
32ドットずつの移動のやり方しか分からないです。
それと画面の上や下、左、右など端に近づいたら画面をスクロールさせるには
どうしたらいいですか?
|
|
2014/7/9(Wed) 00:38:47|NO.62791
NO.62788のは中身同じ?(zipファイル名は違ってたけど・・・)
なのでNO.62788がどこまで出来てるのかわからないけど
画面端を越えてそちらにスクロールできるならスクロールするサンプル
//ウィンドウ
screen 0 , 640 , 480
title "壁の画像作るのがめんどいのでとりあえずキャラクターで表示"
//ERROR
onerror *error
//ロード中画像
buffer 1
celload "dat\\load.bmp",1,0
//ロード中表示
gsel 0,2
gcopy 1,0,0,640,480
//画像準備
buffer 2
celload "dat\\character.bmp"
csrc=stat
celdiv csrc,32,32
celload "dat\\character.bmp" //描画基点をキャラ中心にしたいので自分キャラ用にロード
myid=stat
celdiv myid,32,32,16,16
//////////////////////////////////////////////////////
//変数準備
sdim mapd,4000
//マップデータ読み込み
notesel mapd
;noteload "map\\001.txt"
//横20*2、縦15*3 (必ず1画面分の倍数にする必要がある)
mapd={"
1111111111111111111111111111111111111111
1100000000000000000000000000000000000001
1010000000000000000000000000000000000001
1001000000000000000000000000000000000001
1000100000000000000000000000000000000001
1000010000000000000000000000000000000001
1000001000000000000000000000000000000001
1000000100000000000000000000000000000001
1000000010000000000000000000000000000001
1010000000000000000000010000000000000001
1001000000000000000000001000000000000001
1000100000000000000000000100000000000001
1000010000000000000000000010000000000001
1000000000100000000000000000000000000001
1000000001000000000000000000000000000001
1000000001000000000000000000000000000001
1000000000100000000000000000000000000001
1000000000010000000000000000000000000001
1000000000010000000000000000000000000001
1000000000010000000000000000000000000001
1100000000000000000000000000000000000001
1010000000000000000000000000000000000001
1100000000000000000000000000000000000001
1010000000000000000000010000000000000001
1001000000000000000000001000000000000001
1000100000000000000000000100000000000001
1000010000000000000000000010000000000001
1000000000100000000000000000000000000001
1000000000010000000000000000000000000001
1000000000010000000000000000000000000001
1000000000010000000000000000000000000001
1010000000000000000000000000000000000001
1100000000000000000000000000000000000001
1010000000000000000000010000000000000001
1001000000000000000000001000000000000001
1000100000000000000000000100000000000001
1000010000000000000000000010000000000001
1000001000000000000000000001000000000001
1000000100000000000001000000000000000001
1000000010000000000000100000000000000001
1000000001000000000000010000000000000001
1000000001000000000000000000000000000001
1000000000100000000000000000000000000001
1000000000010000000000000000000000000001
1111111111111111111111111111111111111111"}
noteget mdat,0
mapmaxx=strlen(mdat)
mapmaxy=notemax
dim map,mapmaxx+1,mapmaxy+1 //一つ多く確保しとくと色々楽なので・・・
repeat mapmaxy
noteget mdat,cnt
y=cnt
repeat mapmaxx
map(cnt,y)=peek(mdat,cnt)-'0'
loop
loop
maploopx=(ginfo_winx/32)
scrmaxx=-(mapmaxx-maploopx)*32
maploopy=(ginfo_winy/32)
scrmaxy=-(mapmaxy-maploopy)*32
//ロード中非表示
gsel 0,2
cls
title "マップX="+mapmaxx+" Y="+mapmaxy
mpx=320
mpy=240
*main
redraw 0
stick k,$ff
if k&1{//左に移動
mpx-3
if mpx<0 {//画面左端を越えた
if mapscrollx < 0 {//左にスクロールできる
mapscrollx+ginfo_winx //一画面分スクロール
mpx+ginfo_winx //キャラ座標を一画面分右に移動して右端に移動
}else{//もう左にはスクロールできない
mpx=0
}
}
}
if k&4{
mpx+3
if mpx>ginfo_winx {
if mapscrollx > scrmaxx{
mapscrollx-ginfo_winx
mpx-ginfo_winx
}else{
mpx=ginfo_winx
}
}
}
if k&2{
mpy-3
if mpy<0 {
if mapscrolly ! 0 {
mapscrolly+ginfo_winy
mpy+ginfo_winy
}else{
mpy=0
}
}
}
if k&8{
mpy+3
if mpy>ginfo_winy {
if mapscrolly ! scrmaxy{
mapscrolly-ginfo_winy
mpy-ginfo_winy
}else{
mpy=ginfo_winy
}
}
}
mapindexx=abs(mapscrollx/32) //横に何個ずらすか
mapindexy=abs(mapscrolly/32) //縦に何個ずらすか
//マップ書き込み
y=mapindexy
repeat maploopy
pos 0,cnt*32 //celputはY座標を固定して横に描画サイズ分ずれるので座標の変更は縦が変わる時だけで良い
repeat maploopx,mapindexx //cntがmapindexxから始まる
celput csrc,map(cnt,y)
loop
y+
loop
pos mpx,mpy
celput myid,1+(gettime(7)/200)\2
//キャラ座標をチップサイズで割ればmap(,)のインデックスになる(スクロール分を足せばスクロール後のインデックスになる)
//逆にインデックスにチップサイズを掛ければスクリーン座標になる(スクロール分を足してるとマップ空間の座標になる)
if map(mpx/32+mapindexx,mpy/32+mapindexy) {color 100,100,100:pos mpx-16,mpy-32:mes "接触 \nX("+(mpx/32+mapindexx)+")\nY("+(mpy/32+mapindexy)+")"}
await 16
redraw 1
goto *main
stop
/////////////////////////////////////////////////////
*error
dialog "エラーが発生しました",1,"走れJUMP君! ERROR"
end

| |
|
2014/7/9(Wed) 18:58:19|NO.62792
ありがとうございます。
これでアクションゲームの作り方がわかりました。
また何かあったらお願いします。
|
|