[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
『前回(2012.12.21.の日記参照)のあらすじ』
詳しい人が見たら失笑ものだと思う迷路の作り方をさらしてみたら、配列を使った具体的な迷路の作り方をコメント欄で説明してくれた親切な人がいたが、私の知識がなさ過ぎてすぐには理解できなかったよ。残念。
本文よりコメント欄の方が為になるブログってどうなんだろう?
そして、タイピング練習の為に毎日日記を書くという当初の目的どこ行った自分。
日記なのに月1になってるぞ自分。
以下、長くなったので続きに格納
前回、マップデータを2次元配列で作り、各マップパーツの表示・非表示をその配列から求めるという感じの作り方を教わったのですが、そもそも配列って何?という状態だったので、とりあえず配列を勉強してきました。
結果、未だ教えてもらった内容をちゃんとは理解できていません。(勉強しなおしてこい自分)
いや、配列まではおぼろげに何となく解ったような、そうじゃないような感じなのですが、関数がよく解らなく…
以下は、初心者が四苦八苦している記録なので、内容の正確さはいい加減です。間違っている可能性が多分にあるので同じ初心者の人は気をつけてください。
(何となく解ったようなそうじゃないような配列)
・変数→文字列なり数値なりを1種類だけ入れられる箱。
・配列→部屋の数だけ文字列なり数値なりを入れられる部屋数の多い箱。
正確には違うみたいですが、作る分にはこれでいい気がしました。
配列名=[値0,値1,値2];
『[]』の中に『,』で区切って作成。左端から0,1,2…という感じで部屋数がつく。
値を使いたい時は配列名に部屋数をつけて指定する。
上記で値1を使いたい時は配列名[1]
2次元配列は値の中にさらに配列が入っているもの。
上記の値1の中にさらに3つの部屋を作る場合、
配列名[1]=[中の値0,中の値1,中の値2];
代入なり参照なりするために中の値2を指定したい場合の書き方は、
配列名[1][2]
配列名の1つ目の値の中の、2つ目の値みたいな感じ。
おぼろげに配列が解ったような気がしてきたので、前回教えてもらった内容を最初から見直しつつ、paraflaに入力してみます。
map=new Arry();
map[0]=[0,0,0,0,0];
map[1]=[0,1,1,1,0];
map[2]=[0,1,0,1,0];
map[3]=[0,1,1,1,0];
map[4]=[0,0,0,0,0];
mapという名前の新しい配列を部屋数を指定せずに作って、その後内容を指定する?って事で良いのだろうか??
上記だと5×5の25部屋の箱。
1番右下の0の位置は『map[4][4]』左上は『map[0][0]』
左上を0にして、横軸がx、縦軸がy。map[y座標][x座標]
方眼紙に書いた地図を、壁を0、通路を1という感じでそのまま入力。上の図だと壁に囲まれた中に四角く通路がある感じ。
どこに入力すればいいのか解らなかったので、変数はとりあえず_root.管理ということで、初期化スクリプト内に一緒に入れておくことにします。
x方向最大値とy方向最大値の指定は、その後それが使われている関数の作り方、使い方、そもそもこれどこに入力するの?という基本的な部分が解らなかったのでとりあえず保留。いいかげん入力規則ぐらい勉強してこい自分と思いつつ保留。
プレイヤーの現在位置の変数x、yと視点の向きsにとりあえず初期位置の座標を入力して初期化スクリプトの入力は終了。マップパーツスプライトの方に移ります。
壁パーツの出現条件を現在地からみた配列mapの数値からチェックするということで、壁の位置を紙に書いてみる事にします。
現在地から見たそれぞれの壁の位置は
上向きの時(s=0)
前中1 y-1
前中2 y-2
前中3 y-3
前中4 y-4
前左1 x-1、y-1
前左2 x-1、y-2
前左3 x-1、y-3
前左4 x-1、y-4
前右1 x+1、y-1
前右2 x+1、y-2
前右3 x+1、y-3
前右4 x+1、y-4
横左1 x-1
横左2 x-1、y-1
横左3 x-1、y-2
横左4 x-1、y-3
横右1 x+1
横右2 x+1、y-1
横右3 x+1、y-2
横右4 x+1、y-3
現在地(x、y)に上表の数値を足して判定位置の座標(xx、yy)にし、その座標の配列mapの数値と比較して壁を表示するのかどうか調べる訳ですが、前回のコメント欄で教えてもらった内容だとこの次に関数(たぶん)が出てきます。
解りません。
・・・。
ネットで検索した結果、それでも理解できていないので、ググれカスの一言で終わらせないでもらえると助かります。
えーと…get_mapdateという名前の関数を作って、その内容がその下の内容なんですよね?たぶん。
ここで初めて出てきたcってなんでしょう?retって何?変数??
・・・。
・・・。
結局解らなかったので、壁スプライトにはこんな式を入れておくことにしました。
『壁前中1』
onClipEvent(enterFrame){
if(_root.s==0){
xx=_root.x;
yy=_root.y-1;
}else if(_root.s==1){
xx=_root.x+1;
yy=_root.y;
}else if(_root.s==2){
xx=_root.x;
yy=_root.y+1;
}else if(_root.s==3){
xx=_root.x-1;
yy=_root.y;
}
if(_root.map[yy][xx]==0){
_visible=true;
}else{
_visible=false;
}
}
押すと現在地の数値が+1されるだけのボタン作ってプレビューしたらいちおう動きました。
ちょこちょこ入力の+-を間違ったりしつつ全パーツに入力。
エラー出なかったのでこのまま次の作業に移ります。
移動矢印は前回と同じ上矢印でしか移動しない形にします。
前回と違って、左右と下の矢印がsの数値を変えるだけで済むので入力がとでも楽です。前回と違って壁側も向けます。そのせいで1歩離れた位置の横壁が見えないと不自然に見える場所か出てきましたが、そんな画像作っていません。そして作りません。気にせず次の作業に移ります。(気にした方が良いです)
今回も移動できない壁の前では上矢印を消すことにします。
こんな感じ。
『上矢印のクリップアクション』
onClipEvent(enterFrame){
if(_root.s==0){
xx=_root.x;
yy=_root.y-1;
}else if(_root.s==1){
xx=_root.x+1;
yy=_root.y;
}else if(_root.s==2){
xx=_root.x;
yy=_root.y+1;
}else if(_root.s==3){
xx=_root.x-1;
yy=_root.y;
}
if(_root.map[yy][xx]==0){
_visible=false;
}else{
_visible=true;
}
}
-
on(release){
if(_root.s==0){
_root.y=_root.y-1;
}else if(_root.s==1){
_root.x=_root.x+1;
}else if(_root.s==2){
_root.y=_root.y+1;
}else if(_root.s==3){
_root.x=_root.x-1;
}
}
プレビューで確認してちゃんと動くようなので、mapの内容を実際の迷路の内容に書き換えます。
前回の作業と比べてとても楽です。(一部作業内容が怪しい事になってますが)
視点が方角の指定だけになって方位磁針を作りやすくなったのでついでに作っておくことにします。
sの数値によって画像の向きを変えるだけ。楽ちん。
これで方角を見失わない。迷路っぽい。ちゃんと迷路っぽい。
オートマッピングも配列で作りましたが、長くなったので話さない事にします。
セーブ時に_root.save.data.配列名=_root.配列名;で配列の中身まるっと記録できるのですね。
セーブが必要な変数をみんな同じ配列で作ったら、セーブボタン作りが楽そうです。
次回更新予定は、予定日未定。虫を捕まえる脱出(しない)ゲームです。
3か月以内に作れればいいなと思います。
- 無題
-
以前書き込んだ方とは違うものです。
解決されているようですが、
私がわかる範囲で解説してみます。
get_mapdata(cx,cy)
→これはcx,cyの入力に対し、マップ外なら0、マップ内ならmap(cx,xy)を返す関数のようです。
cx,cyは関数内の変数ということで、xx,xyと別物だということをわかりやすくするために変えてるのだと思います。(たとえば関数内でcxの値を変えてもxxの値は変わらない)
retは多分returnを表しています。これは関数から関数外に渡す数値で、関数内の条件によって変化します。
ということでマップ範囲内の(xx,yy)が入力であれば、
get_mapdata(xx,yy)
の結果は
map[xx,yy]
となります。
つたない説明ですが何かのヒントになればと。
>以前書き込んだ方
間違いなどあれば訂正いただければ幸いです。
- 無題
-
すみません、最後の
map[xx,yy]
は
map[xx][yy]
です。すみません。
cx,cyはその後実際に関数を使う時の数値の代入位置で、これ自体には意味は無いという事でしょうか?
今の家のゲームだとyy、xxの数値が配列内に存在しないマイナス数値でもそのまま参照されてしまうので、それを防ぐための範囲指定?を関数でしている?
今の家の迷路のマップ外は壁の無い状態ですね。外周全部壁だから外は見えませんが。
結局この関数はどこに入力すればいいのでしょうか?_root.スクリプト?
- 無題
-
上2つについてはその通りです。
3番目ですが、以前の方はこの値を壁の表示をするかどうかの判定に使われているようです。
if( get_mapdata(xx,yy) == 0 ){ //判定位置のマップ情報が壁なら表示
_visible = true;
}else{
_visible = false;
}
これはみずくらげ様の
if(_root.map[yy][xx]==0){
_visible=false;
}else{
_visible=true;
}
}
の部分になりますので、_root.map[yy][xx]をこの後でどこかに入力するならそこに入れればいいかと思います。
解らないのは最初に関数を宣言する場所(function~の入力場所です)
基本が解っていなくてすみません。
- 無題
-
答えてる人とは、別人ですが、、、
function~は、外に書きます。
例えば、、、
onClipEvent (enterFrame) {
x=hogehoge()
}
function hogehote(){
return 1;
}
こんな感じですかね。。。
詳しくは、下記に~。
ttp://isvalid.jp/actionscriptLab/ASlesson/actionsctipt_function.html
説明ページで勉強してきました。
なんとなく解ったような気がします。
後で実際に入力して練習してみます。
- 無題
-
いえいえ、がんばってください!
これからも、まろの活躍を楽しみにしています。
そして、ふと思ったのですが、
配列を知らずに、イラストロジックや、
お風呂脱出のパズルを作ったんですね。
配列で判定しているのだとばかり、
思ってました。
配列なら、2重ループにすれば判定は
用意です。
使わずにつくる技術の方が凄くて、
少し、興味があります。
お風呂パズルはスプライトにパズルピース全画像と透明マスをラベルで区切って配置して、使ったアイテムによって表示ラベルを変更(変数で判定)。判定ボタンを押したときに全12マスの組み合わせが正しかったとき終了という、脱出ゲームで数値パスを画像で作る(脱出ゲームの作り方サイトで紹介されている方法)のと同じ感じで作っています。
判定ボタンのifの中身がとても長いです。条件12個。
うちのサイトのゲームはだいたい同じ方法で作っています。
- 無題
-
配列を使ったサンプルソースをコメントした者です。
つたないサンプルソースを、色々検討頂いて大変ありがとうございます。
見に来るのが遅かったようですみません(笑
ほぼ解決されたようですが、ちょっと補足です。
get_mapdata(cx,cy) はフォロー頂いたようにyy、xxの数値が配列内かどうかのチェックもしています。
配列外を見に行くのは、見つけにくいバグの原因になったりしますので、チェックして絶対に見に行かないようにするクセを付けられるのがいいと思います。
***
何となく動いているようで、もう迷路はばっちりですかね。
大きな迷路を考えたときに、以前のif文ばかりの作り方より作る労力もテストの労力も桁違いに楽だと思います。
次に迷路作るときにまるまる流用できますし。
***
ゲーム新作を楽しみにお待ちしておりますっ
見つけにくいバグ…怖いですね…
次作る時は気を付けることにします。
(今公開している迷路は苦情が来ない限り放置)
迷路作りは、以前の作り方より本当格段に楽になりました。とても感謝しています。
以前の作り方…本当よく自分あれ全部入力したな…ってレベルですよね。
配列覚えてる間にそれを利用したパズルでも作りたいですがなかなか思いつかないです。
活用できないと身についたことにならないですよね…
新作ゲーム作りがんばります。配列使ったパズルとか。