ここから本文です

actionscriptの2次配列

halation_winterさん

2012/10/201:49:30

actionscriptの2次配列

2次元配列を利用してMAPを作ろうと考えています。
エラーで「関数は値を返しません。」と出てしまします。
どうすればいいのでしょうか。


ライブラリにblockというbitmapを登録してあります。

=========

public function Main()
{
var kabe:MovieClip;
kabe = drawBackground ( new block(0,0));
addChild(kabe);
var fields:Array = new Array();
fields[[・・・・]、[・・・・]]//2次元配列

}

function drawBackground(bmpdata:BitmapData):MovieClip
{
var px:int=0; var py:int=0;
for (var x:int = 0; x < fields.length; x++)
{
py = 0;
for (var y:int = 0; y < fields.length; y++)
{
if (fields[x][y] == 0)//0なら壁を表示する
{
var AAA:Bitmap = new Bitmap( bmpdata );
var blk:MovieClip = new MovieClip();
blk.x = px;
blk.y = py;
blk.addChild(AAA);
return blk;
}
py += 15;
}
px += 15;
}
}

閲覧数:
304
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

グレード

カテゴリマスター

glowfiltanさん

2012/10/219:02:43

> エラーで「関数は値を返しません。」と出て…

それ以外にも変なところだらけですが。。。


おそらく
根本的には全部を考えなおす必要があるのではないかと思いますが,
とりあえずこの回答では「動くようにすることだけ」を考えます。



とりあえずはご質問の題名でもある
「2次配列」の件から行きます。

> fields[[・・・・]、[・・・・]]//2次元配列

まずこの書き方がダメです。

色々な書き方はできますが
なるべくその書き方に似た感じの書き方をするなら
次のようになります(値も入れた例)。

fields=[[4,3,2],[1,0,-1]];//2次元配列

変数 fields に 配列 [] を代入するわけです。
したがって 代入演算子 = が要ります。
そしてこの場合
その 配列 [] の中身が [4,3,2],[1,0,-1] となる例となります。



それと
その配列 fields は2つの function から共通に参照するわけですから
function Main の中で var 宣言してはいけません。
(function Main の中でしか使えなくなってしまいます。)



また
kabe = drawBackground ( new block(0,0));
これで関数 drawBackground を実行した後に
2次元配列を用意してもそのデータの値は取れませんよ。
kabe = drawBackground ( new block(0,0));
の実行よりも前に2次元配列を用意しておく必要があります。



> エラーで「関数は値を返しません。」と出て…

これは
function drawBackground(bmpdata:BitmapData):MovieClip
この部分で
「戻り値として MovieClip を返すよ!」と宣言しているにもかかわらず
条件に当てはまらなかった場合は戻り値を何も返さないからです。



まだダメな部分はありますが
「とりあえず動くことのみ」を考えると
スクリプトは次のように修正することになります。


//---「Main.as」全文-------------------
package {
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;


public class Main extends MovieClip {

var fields:Array;

public function Main() {
fields=[[4,3,2],[1,0,-1]];//2次元配列
var kabe;
kabe = drawBackground(new block(0,0));
if (kabe) {
addChild(kabe);
}
}

function drawBackground(bmpdata:BitmapData) {
var px:int = 0;
var py:int = 0;
for (var x:int = 0; x < fields.length; x++) {
py = 0;
for (var y:int = 0; y < fields[x].length; y++) {
//0なら壁を表示する
if (fields[x][y] == 0) {
var AAA:Bitmap = new Bitmap(bmpdata);
var blk:MovieClip = new MovieClip();
blk.x = px;
blk.y = py;
blk.addChild(AAA);
return blk;
}
py += 15;
}
px+=15;
}
return false;
}

}

}
//----------------------------




「とりあえず動くことのみ」を考えただけです。

今の状態では
何でも良いからとにかく function drawBackground を実行させていますが
本当は先に2次元配列の要素が0であるかどうかを調べて
もし0であったら壁を表示する関数(戻り値として MovieClip を返す関数)を実行させた方が良いです。

そうしていないから
function drawBackground の戻り値も宣言できませんし
さらに
戻り値が false でなかった場合に
addChild(kabe) を実行するという変な誤魔化しが必要になってしまいます。


それと今の状態では
2次元配列のどこか1箇所に0があれば
その MovieClip が生成されて
function drawBackground は終了します。

それで良いのでしょうか?
つまり
2次元配列の複数の箇所に0があったとしても
捜査で最初に当たった0に対する MovieClip が生成されるだけです。

それで良いのでしたらそれでもかまいませんが
雰囲気的になんとなく
0の個数だけそれに応じた MovieClip を生成したいのではないかと勝手に推測します。

仮にもしそうなのでしたら
最初にも書きました通り
最初から全部考え直しになると思います。

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する