<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/ME2.2.1" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>経堂 ～Nigoro 発掘品陳列室～</title>
	<link>http://kyoudou.nigoro.jp</link>
	<description>Nigoro開発陣のためになる技術ブログ</description>
	<pubDate>Wed, 25 Feb 2009 08:29:42 +0900</pubDate>
	<generator>http://wordpress.org/?v=ME2.2.1</generator>
	<language>ja</language>
			<item>
		<title>一旦休止のおしらせ</title>
		<link>http://kyoudou.nigoro.jp/?p=98</link>
		<comments>http://kyoudou.nigoro.jp/?p=98#comments</comments>
		<pubDate>Wed, 18 Feb 2009 11:31:54 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[雑記]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=98</guid>
		<description><![CDATA[大変だよおっかさん。
なんか冗談っぽい始まりですが、冗談じゃなくなりました。
何が冗談じゃないかと言うとケツに火がついたんです、マジヤバです。
NIGOROの裏では日々なにやら蠢いているのですが、とうとうワシも捕まって手が回らない状態になってしまいましたんです。
それが一体全体何なのかは今は言えない教えちゃいけないって話なので書けないのですが、そっちに手が掛かりきりになるので見ていてくれた方には申し訳ないのですが、一旦休止させてくださいませ。
いやね、ここでのへんてこな文章でも、適当に書いたらしかられちゃう訳で、色々テストしたり校正を経て世に出ていたんですよ。文体とはちがって結構時間が掛かるんですな、いやな世の中だ。
でも雑誌等の休刊と違って時間が取れる様になったら直ぐに再開に出来るところがネットのいい所。手が空きしだい再開しますので、どうぞよろしくお願いします。
]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=98</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その10〜</title>
		<link>http://kyoudou.nigoro.jp/?p=91</link>
		<comments>http://kyoudou.nigoro.jp/?p=91#comments</comments>
		<pubDate>Tue, 18 Nov 2008 09:06:08 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Action Script]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=91</guid>
		<description><![CDATA[うっす。
さて、文章を書く際に、いつ読んで貰えるのかわからない物って挨拶が書きづらいですよね。
こんばんわって書いて朝に読まれちゃったら目もあてられない。
そんな時便利なのが「うっす」。いつの間にかNIGOROではうっすを使うことが増えてしまったduplexです。
さてはて、関係無い話を書いても仕方が無いので今回のお題ですが、前回作ってみて何かが違うと思った所はありませんでしたか？
って弾がまっすぐしか飛ばないと言うのは無しよ。
 わからない人は最初の頃に公開したBouceShotの企画書を見てみましょう。
よーく見てください、画面内に弾が２発と制限が指定されてますね。
というわけで今回は弾数の制御をやります。
 弾が画面内に２発という事は、現在の弾数をどこかで管理してやらなくては行けません。
まぁそれは今回やるとして、管理してる場合それ以上の発射要求をユーザーから求められた場合はどこかに弾はもう出せないと言う処理を入れなくてはいかんのです。

 その場合、ぱっと思いつくやり方は何がある考えて見ましょう。

自機（Shipクラス）で弾を出す処理を飛ばす。
弾（Myshotクラス）の方で限界を超えてた場合は自動で消える。
第３の勢力に弾を消滅させる。

等が思いつきます。ほかのやり方とか考えてみると良いかもしれませんが、とりあえず今回思いついたのはこれだけ。
こういう風に手法がいくつも出てくるのは当然なんですが、それじゃ一体どの方法でやればいいのか？
そんな時は利点と欠点をさらさらと出してみて考えます、ワシは。
１の場合
利点

 無駄な処理（いらない弾タスクの生成）が無い。
 処理の流れがわかり易い
 Myshotクラスに何も変更を入れる必要が無い。

欠点

 弾数管理のタスクとのやり取りが必要になる

２の場合
利点

 Shipクラスに何も変更を入れる必要が無い。

欠点

 いらない処理（最初のフレームで弾数をチェックして限界を超えてたら消える）が出る
 弾数管理のタスクとのやり取りが必要になる

３の場合
利点

 弾数制御の処理がクラス内で行われるので、弾数が可変になっても変更を入れやすい。

欠点

 そもそも、このタスクだけを見ても何をやってるのかわからない。
 Myshotクラスを管理する必要が出てくる。

ざっとこんな感じです。
まだまだ利点や欠点はあると思いますが、あまり深く考えても仕方ないので先に進みます。
これを見ると１が利点が多くて作りやすそうです。
ただここで注意したいのが、弾数管理をShip内でやっちゃおうとする事。
これは良くやっちゃうんですが、大抵の場合こういうのは後で「これ変更よろしく」とか来ちゃいます。
てか来ます。
それとプレイヤーキャラクターのプログラムは長くなりがちで、後半てか終盤あたりに変更が入ると泣きを見る事が必死なんです。
そんなわけで、弾を管理する場所は別に作成し、後半で変更が入ったとしてもその別の場所をいじるようにする方が得策ってもんです。
実例でも書かないとわかり辛い所ではありますが、長くなるから却下。
まぁ小さく部品毎に分けた方が「泣かないで済む」と憶えてください。
よく言うオブジェクト指向なんでしょうが、理屈なんてどうでも良いんです、要は自分が楽するためです。
後は、誰が弾管理タスクに弾の増減を通知するかと言う問題があります。
Shipクラスだと弾が発射された事は分かりますが弾が消えた事は分かりません。
Myshotクラスであれば、発射された時と消える時が分かります。
他のクラスは何もわかりません。となればもう考える必要も無く、弾の増減の通知はMyshotクラスで行うのがベストだと思われます。
さらっとおさらいで、ここで決まった事を箇条書きにしてみます。

弾数管理タスクを作る。
弾の発射制限はShipクラスで行う。
弾数管理タスクへの増減の通知はMyshotクラスで行う。

それでは弾数管理タスクを作ります。


import nigoro.lib.duplex.Task.*;

class source.task.Maxshot implements Task2{
private var max_now:Number; //現在の最大弾数
private var now_shot:Number; //現在画面上に出ている弾数

public function Maxshot(max:Number)
{
max_now = max; //このタスク生成時の最大弾数を決める
now_shot = 0; //現在の弾数初期化
}

//タスクシステムに登録した際に呼び出される。
public function init(no:Number, tc:TaskCenter2):Void{
tc.regstData(&#8221;maxtask&#8221;,&#8221;no&#8221;,no); //データベースに自分の番号を入れる
}

//タスクシステムからの常時の呼び出しはここ。返り値がtrueだとそのままだが、falseを返すとタスクの削除と
なる
public function run(tc:TaskCenter2):Boolean{
return true;
}

//タスクを削除する際に必ず呼ばれる。なんか処理したい事を入れておけ
public function finalize(tc:TaskCenter2):Void{
tc.elaseData(&#8221;maxtask&#8221;);
}

//このタスクとやり取りしたい場合これを使え
public function talkTask(mess:Array, tc:TaskCenter2):Array{

switch(mess[0])
{
case 0: //弾が発射された時に呼び出す
now_shot++;
break;
case 1: //弾が消える時に呼び出す
now_shot&#8211;;
break;
case 2: //新しく弾を発射出来るかのboolean値を返す
mess[0] = (now_shot &#60; max_now);
break;
}

return mess;
}

//非常に特殊処理、通常は使わない
public function frun(tc:TaskCenter2):Boolean{
return true;
}
}


クラス名はMaxshotとしました、この辺にワシのボギャブラの無さを感じますが、気にしちゃいけない。
よくサミエルさんに「師匠～そのつづり間違ってますよ～」と言われるワシです。
簡単な英単語の組み合わせしか出来ないのです。
それと今回から行番号を付けてみました。
今回からは嫌がらせではありません、別の「大人の事情」です。
今までと同じ様な所は説明しません、あい変わらすワシの作ったタスクシステムを使ったタスクです。
８行目のコンストラクタを見てください。
引数が指定してあり、その引数で最大数を決めるように作ってみました。この場合このクラスを生成する場所で指定する必要があります。
１６行目に今まで使った事が無かった命令が出ています。
この命令はTaskCenter2 [...]]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=91</wfw:commentRss>
		</item>
		<item>
		<title>CS3素材分離作戦　その後</title>
		<link>http://kyoudou.nigoro.jp/?p=92</link>
		<comments>http://kyoudou.nigoro.jp/?p=92#comments</comments>
		<pubDate>Tue, 11 Nov 2008 22:19:51 +0900</pubDate>
		<dc:creator>Samieru</dc:creator>
		
		<category><![CDATA[Action Script]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=92</guid>
		<description><![CDATA[どうも、俺ちゃんです。
トウキョウゲームショウ、行ってきました。ビジネス的には非常に有意義な二日間でしたが、ゲームショウ自体はしんどかったです。疲れますねぇーあれは。でも、なんか打ち合わせしてる時に通りすがりの人が「あれ？NIGOROって書いてある」って言うてたり、どうやらご存知の方もいらっしゃったようです。ありがとうございます。
とりあえず、英語で電話するのはしんどいっすねー。こりゃかなりのリハビリが必要やなと思った今日この頃、皆様如何お過ごしでしょうか。
バウンスショットのネタがバリバリと進んでいる状況ですが、まぁちょいと閑話休題と言うか、俺ちゃんラインの案件が後はクライアントさんの繋ぎこみ完了待ちだけなので今回の案件で実装してみた素材分離作戦の結果報告を兼ねたお話をしようかな、と思います。
いやー、一筋縄では行かなかったですよ。
さて、結構間が開いてるので、素材分離作戦の２とか読み返して頂かないと何の話かさっぱりな気もしますが、要は「Flashって音をmp3に変換したりグラフィクスをJpegに変換したりでコンパイル遅いぜー。ちょっとパラメータ変更してテストしようと思ったらコンパイル５分とかやれやれだぜー」って言う状況をなんとか回避しようって話です。
前回俺ちゃんの出した方法は、「素材は素材用swfで別にして、それのドキュメントクラスに素材呼び出しAPIみたいなんくっつけて、そいつを使ってメインプログラム側に素材読み込むってのはどうだ！？」って事ですね。
とりあえず、先に素材側のドキュメントクラスはこんなんなりました。
//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
package
{
import flash.utils.getDefinitionByName;
import flash.display.MovieClip;
import flash.media.Sound;
import flash.display.BitmapData;
import flash.text.Font;
public class NigoroFactoryClass extends MovieClip implements INigoroFactory
{
private var material_cash_array:Object;
public function NigoroFactoryClass(){
material_cash_array = new Object();
}
public function getMovieClip(mc_name:String):MovieClip{
var cls:Class = getClass(mc_name);
var ret_mc:MovieClip = MovieClip(new cls());
return ret_mc;
}
public function getBitmapFile(mc_name:String):BitmapData{
var cls:Class = getClass(mc_name);
var ret_bmp:BitmapData = BitmapData(new cls(0,0));
return ret_bmp;
}
public function getSoundFile(mc_name:String):Sound{
var cls:Class = getClass(mc_name);
var ret_snd:Sound = Sound(new cls());
return ret_snd;
}
public function getFontFile(mc_name:String):Font{
var cls:Class = getClass(mc_name);
var ret_fnt:Font [...]]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=92</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その9〜</title>
		<link>http://kyoudou.nigoro.jp/?p=84</link>
		<comments>http://kyoudou.nigoro.jp/?p=84#comments</comments>
		<pubDate>Fri, 07 Nov 2008 09:12:37 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Action Script]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=84</guid>
		<description><![CDATA[
 	
第9回『弾が出ます』
第7回『動く物を作ろう』で自機が動くとこまでやりました。
でも動くだけ。やっぱりシューティングゲームだったら弾が出なきゃいけないよね。
そんなわけで弾を撃ちましょう。弾を撃つ、男のロマンだねぇ。
しかし前回の記事は長くて疲れませんでしたか？
なーに心配しなくて結構、絶対疲れてるはずだから今回は短くまとめようと思います。
ね、短いって良いよね。短いって最高ぉぃひゃっほぉい！
さて今回に必要な事を考えてみましょう。
１）弾の絵
２）マウスクリック判定の追加。
３）弾のプログラム

当然弾の絵はムービークリップにしちゃいます。
弾の絵は当然として、マウスクリックの判定の追加、これは弾を撃つにはマウスクリックが必要なのはゲームとして当然です。
ですが、そのプログラムは何処に書けば良いのか？
今あるのはBounce・Play・Shipの３つのクラス。
あなたならどのプログラムで判定させますか？
当然ですが、弾の発射位置は自機の座標からとなります。
ということは最低でも自機の座標が分からないと美味しくありません。
となると、BounceやPlayで処理しようと思えばShipが持つムービークリップの座標を何らかの形で取得しなければいけなくなります。
てーことはだ、当たり前かもしれませんがShip内にマウスの判定処理を追加するのが一番楽って事です。
ですが勘違いをしてはいけません。
今回のShip内にマウス処理を追加するのは楽だからやるのであって、しっかりと作ろうと思えばマウスを管理する所を作り、そこで処理させたほうがDebugは楽になる場合もあります。
まぁあれです、ワシは楽なほうを選ぶ！
最後は弾のプログラムです。
とにかく今回は弾がでりゃええやって事で真上に直線的に飛ぶように作ります。
これもまた一つのタスクとして作成しちゃいます。
せっかく作ったタスクシステムはがんがん活用しましょう。
弾のタスクとして作るクラスは、Myshotと言うクラス名にしました。
&#160;

import nigoro.lib.duplex.Task.*;
class source.task.Myshot implements Task2{
	private var mc:MovieClip;
	public function Myshot(mmc:MovieClip,x:Number,y:Number)
	{
		mc = mmc.attachMovie(&#8221;p_shot&#8221;,&#8221;p_shot&#8221;+mmc.getNextHighestDepth(),mmc.getNextHighestDepth());
		mc._x = x;
		mc._y = y;
	}
//タスクシステムに登録した際に呼び出される。
	public function init(no:Number, tc:TaskCenter2):Void{
	}
 //タスクシステムからの常時の呼び出しはここ。返り値がtrueだとそのままだが、falseを返すとタスクの削除となる
	public function frun(tc:TaskCenter2):Boolean{
		return true;
	}
 //タスクシステムからの常時の呼び出しはここ。返り値がtrueだとそのままだが、falseを返すとタスクの削除となる
	public function run(tc:TaskCenter2):Boolean{
 mc._y -= 8;//弾のY座標を上に移動させる
 //もし弾の座標が０未満になれば画面外へ行ったとみなしタスクを削除する
		if(mc._y &#60; 0) return false;
 return true;
	}
 //タスクを削除する際に必ず呼ばれる。なんか処理したい事を入れておけ
	public function finalize(tc:TaskCenter2):Void{
		mc.removeMovieClip();
	}
 //このタスクとやり取りしたい場合これを使え
	public function talkTask(mess:Array, tc:TaskCenter2):Array{
		return mess;
	}
}

 弾の絵ですが、そのムービークリップのリンゲージに p_shotという名前を付けてください。後は非常に単純なつくりです。毎フレーム呼ばれるrunメソッド内でＹ座標を８ピクセルづつ上に動かし、０未満になったら消えるというだけのプログラムです。ただ企画書では壁に跳ね返ったり、角度があったりとこんな単純な処理で終わるものではありません。ですが、初めはマウスボタンを押したら弾が出る、この単純な事を出来る様に集中するべきです。初めからあれやこれやと妄想しちゃうと作れずじまいなんて事になっちゃうでしょ？。結局こういう細かい作業レベルまで分解しないとやりづらいんですよ。
&#160;
そんなわけで次に前回作ったShip.asを改造しちゃいましょう。
&#160;

import nigoro.lib.duplex.Task.*;
import source.task.*;
&#160;
import Mouse.*;
&#160;
class source.task.Ship implements Task2{
	private var dmc:MovieClip;
&#160;
	private var mc:MovieClip;
	private var st:Number;
&#160;
	private var mouse_f:Boolean;　//　マウスが押されたらtrueを入れる
&#160;
	public function Ship(mmc:MovieClip)
	{
		dmc = [...]]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=84</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その8〜</title>
		<link>http://kyoudou.nigoro.jp/?p=74</link>
		<comments>http://kyoudou.nigoro.jp/?p=74#comments</comments>
		<pubDate>Fri, 03 Oct 2008 10:10:28 +0900</pubDate>
		<dc:creator>0sae</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ココだけの話]]></category>

		<category><![CDATA[グラフィック]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=74</guid>
		<description><![CDATA[第8回『グラフィックデザインを考えるのです』
こんばんちわ。はじめまして。「めくり番長」でキャラデザインやらしてもらった、ぽっと出新人0saeです。”おさえ”にあらず。”まさえ”ですよろしくたのんますです。
今回は「ゲーム？作ったことないよ？」てなレベルの私でもゲーム作れるぜ　ってな素敵ゲーム「バウンスショット」のグラフィックを企画書を元に画面を仕上げたり、ステージを作ったりするっのを解説しようって言う、そんな話です。
正直右も左もわかんない状態でやってるので私のやり方が正解なのかどうか不安なんですが・・・。
きっとこの記事を読んでくださってる方々からすれば一番近しいLvのスタッフなので、きっとなんか役にはたつと・・・いいなあ。
というわけで本題。
バウンスショットの企画書に沿って、ゲームの元Flaデータをいじり倒すわけですが、 それにしても、方針を決めないとデザインもまとまりませんね。
そこで仮データのゲームをプレイしてみたり、他の似た感じのゲーム（ギャ●ガとかギャ●クシアンとか・・・）画面を眺めてみたり。
ここらへんはもう趣味だったり思い付きだったりするので野性の勘に任せてやっております。
 で。考えた挙句企画書内の丸い形の敵っぽくないというか敵意が微塵も感じられないあのぷよぷよテイストが忘れられず、そのまま仕上げることに。
結果かわいい感じのデザインにしようかなと言う事になったわけですが、ここでＮＩＧＯＲＯ全体のゲームを見てみると、あんまりＮＩＧＯＲＯっぽくない・・・？とかいう話も無くもないのであまりにも可愛すぎずデザインするようバランスを保つように注意。
で、まず何から始めたかというと、Photo Shopでのスタート画面作り。
この画面作りの作業は、実際Fla内で使う素材作りと、イメージボード的な役割で使用します。
もちろんAdobe Illustratorを使用してもOKなんですが、意外とベジェを使うよりビットマップを使ったほうが
SWFが軽くなるって話でしたので、PhotoShopで作成することに。
しかしゲームイメージを練るなら本来ゲーム内の画面から作るのが妥当だとは思うんですが、今回のゲームでは中身のグラフィックをいじれる箇所が
・背景
・自機
・敵
・爆発
・連鎖爆発
・自弾
・敵弾
・残機
・表示フォント
と、数が少なかったため、次にイメージを固定させやすそうというか、グラフィック凝らなきゃなーと思ったスタート画面から始めました。
POPでコミカルで宇宙っぽくて跳ね返る的な・・・ってな感じでできたのがこんなん。


なんとなくそれっぽくねっすか。
んでもって背景の星はFla内で斜め上に向かってゆっくりスライドするアニメーションに。
自機はカーソルが動く方向に傾きつつ移動すると言う動きをするので、ある程度横幅があるほうが傾いた感が出て操作感が良さ気だったので、多少横広なデザインに。お尻のジェット噴射的なものは2フレームのアニメーションでちらつかせてなんかそれっぽくアニメーションさせます。
本当はビットマップで作る予定だったのですが、傾き処理の際にドットがぼけたりするのを防ぐため、泣く泣くベジェでオブジェクトを作成しております。
敵は敵であって敵でないというかもう可愛い路線で強くなさそうな間抜けな感じのデザインへ。
・・・あんまり変わってねえですな。
でも可愛さが増して、間抜けな感じになってませんでしょうか。しかもこいつらプルプル動くんです。そりゃもうゼリーの如くですよ。
硬さの欠片もないという、敵らしからぬところを押し出してみました。
で、全体画面がこんな感じ。


残機グラフィック、ステージの横幅、ピンク敵の当たり判定などの指定は、外部ファイルから設定するようになってたりするのでざっと材料作った後に微調整する必要がありますが、大体はグラフィック入れ替えるだけでワシの出来ることは8割がた済んでる感じですかね。
と、こんな感じでデザインを作ってくと言うお話でした。
外部ファイルに関しましては下記を参照ください。
第6回『外部ファイルを読み込ませてみよう』
関連ページ

第1回『ゲーム製作の流れ、一から見せます』
第2回『企画内容を吟味しよう』
第3回『仕様を詰めておこう』
第4回『では、仕様書をまとめましょうか』
第5回『ゲーム制作のためのツールを作る。・・・・いやじゃ！』
第6回『外部ファイルを読み込ませてみよう』
第7回『動く物を作ろう』

ここまで出てきた資料

バウンスショット企画書
OpenCalc用敵データ(enemy_data(OpenCalc).zip 8KByte)
CSV版敵データ(enemy_data(CSV).zip 1KByte)

]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=74</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その7〜</title>
		<link>http://kyoudou.nigoro.jp/?p=81</link>
		<comments>http://kyoudou.nigoro.jp/?p=81#comments</comments>
		<pubDate>Wed, 01 Oct 2008 11:44:22 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Action Script]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=81</guid>
		<description><![CDATA[第7回『動く物を作ろう』
前回外部ファイルの読み込みを少々説明しましたが、今回はまるっきり飛ばして自機を作成しようと思います。
ほら、なんであれ自分で作ったものが動く時が一番楽しいじゃないですか。
実は中の人から、読んでる人が楽しくなるように書けと言われたのです。
ちぃ、ワシと一緒に地獄へダイブ計画が台無しです。
さて、自機を作るのであれば、まず何が必要か考えて見ましょう。
１）絵
以上です。
え、簡単すぎる？
だったら他に何が必要か言ってみろ、こら。
とまぁ読者に喧嘩を売るなんて、普通はやらないですよね。
でも良いんです、ここは普通じゃないから。
絵は外部で作ってもFlashのツールで作ってもかまいませんが、とにかくその絵をMC化する事が必要です。
Flashの基本的な使い方はここでは書かないので、ＭＣの作り方が分からない人はマニュアル等を良く見て基本的な事は出来るようになっておいて下さい。
ところでグラフィックにはFlashなどでおなじみのシェイプや、ペイントツール等でおなじみのビットマップ等があります。
基本的にはシェイプで描かれた絵よりビットマップで描かれた絵の方が高速に描画されて、ゲームの処理を軽くする事が出来ます。
ただ、シェイプで描かれた画像は回転、拡大等を行っても画像崩れが起こりにくくデザイナさん達は、基本的に此方を重要視されてるみたいです。
だがあえて書かなければなりません。
グネグネdot萌えと。
ねじれるドット、画面を覆いつくさんばかりのドット、A-JAXやらメタルホークやら、はては、OUTRUNにAfterBunner、巨大化するドットは綺麗な線では補えない、
何も言えぬ迫力が在るのです。それは目の錯覚、ごまかしで生まれた視覚効果として決してして無くしてはならないと、そうワシは思います。
ちなみに、最近はドットではなくPixel（ピクセル）と言う方が一般的なんだとか。
話を戻しますが、基本的にシェイプで描かれた絵の方が処理が重いと描きましたが、必ずそうともいえない様子です。
これは多分個々の環境にもよると思いますが、NIGORO作のFLASHゲームにある、ひっこしぽろぽろでは、ワシのPCに限って逆転現象が起きました。
つまりビットマップよりシェイプの方が軽かったってわけです。
ところが、ワシ以外のPCではやはりビットマップが軽かったらしく公開板はビットマップでＭＣを作成しました。
皆さんもこの方法が最速だと過信せずに、テストは出来る限り多くのPCでやった方が良いかもしれません。
さて、自機のＭＣが出来たら基準点を中心に持ってきましょう、というより基準点に自機の中心を持っていきましょう。
整列を使えば間単に出来るはずです。
ここからプログラムの時間です、以前のワシの経堂の記事「開発の中心にタスクあり」で公開したFlashのライブラリを使います。
duplexが使ってるライブラリのソース
さてさて。早速作り始めるのですが、まずは自機を動かすにはどんなプログラムが必要になるか考えてみましょう。
考えた人だけ下へ進んでください、考えてない人は熱が出て倒れるまで考えてください。
こういう何が必要なのかを考えるとき、ワシはよく逆算方式で考えます。
要はこれを作りたいからこれが必要だな、というやつ。それで考えると。
１）自機を動かすプログラム
２）１）を動かすプログラム
３）２）を動かすプログラム
自機を動かすプログラムが必要なのはすぐに分かると思います。
でも２）３）とは何でしょうか？。
もう少し考えを進めると、他に動くものとして敵がいるはずです。
それと共に、自機と敵が好き勝手動いたとしても当然ゲームになりません。ゲームには一連の流れを制御する所と、各々の処理の調停を行う場所が必要になります。
３）とはゲームの一連の流れを制御する所です。タイトル － ゲーム － ゲームオーバーと言う流れを制御するものが必要です。
２）とはゲーム中のタスクを処理する所です。自機、敵、弾などの動きを監視し、衝突判定、スコア計算等を行います。
タスクがわからない？そういう人は「開発の中心にタスクあり」から出直してこい。
プログラムとは、見えない部分に多くの処理があります。
こういった所は普通の人には分かってもらえないんですが、仕方ないのです。だって見えないんだから。
だからIT土方なんて産まれるんですが、芸術家も大抵は死んでから評価されるんで、人間みな平等です。
これでプログラムの大まかな流れは決まったと思います。
Flash上で外部スクリプトを呼び出す方法は既に書いてます。
あくまでワシ流のやり方ですが、それに沿った作りにするので分からない人はこの、「ゲームを作ってみよう」シリーズを読んでみてください。
次にプログラムソースをどこに置くか？という問題が発生します。
これはあくまでワシのやり方ですが参考になればどうぞ。
Duplex流ディレクトリ構成

これらがActionScriptと言うフォルダに入っています。
Flaファイルゲーム別のフォルダで一番上になります。
そこにソース用フォルダを作り、必要に応じて階層を作って行くやり方です。
なんでもそうですが、クラスパスの設定は重要でそれが正しくないと動きません。
以前上げたライブラリにキチンとクラスパスを通し、今後作っていくクラスファイル（.asファイル）もきちんとパスを通さなければ動かないので注意です。
では３）から作って行きましょう。
 import nigoro.lib.duplex.Task.*;
import nigoro.lib.duplex.DB.*;
import source.task.*;
class source.Bounce{
private var ftc:TaskCenter2;//Nigoroライブラリのタスクシステム
private var btc:TaskCenter2;
private var db:MiniDB2;//NigoroライブラリのミニDB
private var st:Number;
private var dmc:MovieClip;
private var dbmc:MovieClip;
function Bounce(mc:MovieClip)
{
st = 0;
dmc = mc;
dbmc = dmc.createEmptyMovieClip(&#8221;db_g&#8221;, dmc.getNextHighestDepth());
db = new MiniDB2();
ftc = new TaskCenter2(500,db);
btc = new TaskCenter2(10,db);
}
public function mainLoop()
{
btc.playTask();
switch(st)
{
case 0://タイトル初期化
st = 10;
break;
case 10://ゲームの初期化
ftc.setTask(new Play(dbmc,this));
st = 10000;
break;
case 10000://wait
break;
}
ftc.playTask();
}
}
これは以前説明した方法でmainLoop()を呼び出すという条件下で動いています。
分からない人はバックナンバーを読め、読んで分からなきゃ、多分ワシの下手な文章のせいなので諦めずに頑張れ。
ここで作った Bounceと言うスクリプトは基本的にメインのクラスとなります。
ここでタイトル表示やゲームシステムへの移行等を管理するわけです。
今回は最初なので、この短さですが、後でどんどんと増えて長くなって行きます。
では説明ですが、import文、これも以前説明をしているので詳細は省きます。
import nigoro.lib.duplex.Task.*;
import nigoro.lib.duplex.DB.*;
この２つはワシのライブラリを使えるようにするためのおまじないです。
ただし、importをしたとしても、そもそもクラスパスが通ってないと意味がありません。
確実に設定をしましょう。これは上で書いたワシのソースの置き方に沿った置き方をしている場合、クラスパスをActionscriptに通していれば動いてくれます。
import source.task.*;
こいつは、同じようにクラスパスがちゃんと設定されている事が条件です。
これはワシのやり方であれば、個別のゲームフォルダにクラスパスが通っていれば動きます。
ではコンストラクタの中身を説明します。
1 : st [...]]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=81</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その6〜</title>
		<link>http://kyoudou.nigoro.jp/?p=73</link>
		<comments>http://kyoudou.nigoro.jp/?p=73#comments</comments>
		<pubDate>Thu, 25 Sep 2008 09:39:36 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Action Script]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=73</guid>
		<description><![CDATA[第6回『外部ファイルを読み込ませてみよう』
今回はバウンスショットの核となる外部ファイルの読み込みを書こうと思います。
さて、外部ファイルといっても無制限に読み込める分けでもありません。
FlashにはFlashの作法って物があります。
ってなわけですがその全てを知る必要は無いですし、そもそも知らん。でも、これを知っておけば役に立つって物を紹介しつつ使います。

第5回『ゲーム制作のためのツールを作る。・・・・いやじゃ！』でCSVファイルを使うことにしたと書きましたが、そもそも、このCSVってなんでしょ？
CSVは Comma Separated Values の略でして、要は、カンマ( , )で区切られたデータファイルのことです。たとえば
２，３４５，６，１２３，５，３４５６，７、”ぼくドラざえもん”，１１９２
こんな感じでカンマ( , )で区切られたデータをひとつの単位として扱います。こういうもののデータ作成は簡単でして、MicroSoft Excel や OpenCalc 等で容易に作ることが出来ます。
ちなみにワシが使ってるのは OpenCalc。これはOpen Officeというフリーの統合オフィスソフト内の１アプリで、まぁExcelと似たような物だと思ってもらえれば結構です。
前回ちろっと書きましたね。
さて、本題に戻ってこのcsvファイル、どうやってFlash上に読み込むかと言うのが今回の趣旨でして、そのために使うのが
LoadVars
というクラスになります。このクラスがどんな物なのかを詳しくしりたければHELPを見てください、
ですがまぁ詳しく知るのはこのクラスを好きになってからで良いと思います。
ではテストプログラムを作りましょう。
先ず読み込むためのcsvファイルが必要です。本当はOpenCalcを使ってちゃんとしたデータを書きたい所ですが、最初は根本の基礎を知るのが大切ですよね。そんなわけでテキストエディッタ（Windowsであれば標準でメモ帳ってソフトが付いてきてます）を開いて、
1,2,3,4,5
と書き込んだ後に、data.csvと言うファイル名で保存すればcsvファイルの作成は終了です。簡単だね。
ではFlash側のスクリプト、今回はテストなので外部クラスは作らずに直接アクションフレームに書き込みます。
1:    var textCsv:LoadVars = new LoadVars;
2:    textCsv.onData = function(data){
3:    　　　　var itemList:Array = data.split(&#8221;,&#8221;);
4:    　　　　trace(itemList[3]);
5:    }
6:    textCsv.load(&#8221;data.csv&#8221;);
書き込みましたか？、コピペじゃ駄目よ。
このアクションスクリプトを書いたflaは先ほど作ったdata.csvと同じフォルダにおいてください。
それと当然ですがプログラムの最初にある「1:」等は行番号を意味してますので、そこまで書いて動かないとか言わないように。
ついでに、なぜ行番号を付けたかと書くと、説明しやすくするためと、コピペが出来ないように。
何といっても自分で書かないと、いや、ここでは打ち込まないとと書くべきですか。
なにはともあれ頭に叩き込むには手を動かすのが一番です。
さてパブリッシュしてみましょう、出力ウィンドウに４と出たら成功です。
失敗してる人は何かが間違ってるので、最初からよく読みなおして、自分が作ったものと、ここに書いてあるものを見比べましょう。
では説明と行きます。
１行目でtextCsvというLoadVarsクラスを生成しています。LoadVarsクラスとはどういう物かと書くと、・・・と思ったんですが一言じゃ表せないんでHELPを引用してみます。
LoadVars クラスを使用すると、データのロードが成功したかどうかを確認することや、ダウンロードの進行状況を監視できます。
loadVariables() 関数の代わりに LoadVars クラスを使用して、Flash アプリケーションとサーバーの間で変数を転送できます。
とまぁ、色々仕事してくれます、その上
具体的には、LoadVars クラスはオブジェクト内のすべての変数を指定の URL に送ったり、指定された URL にあるすべての変数をオブジェクトにロードしたりできます。
また、すべての変数ではなく特定の変数を送信することもできるので、アプリケーションの効率が向上します。
LoadVars.onLoad ハンドラを使用すると、(データがロードされる前ではなく) データがロードされるときにアプリケーションが実行されるようにすることができます。
こんな感じなんで、一言じゃ書けないんですな。でも誤解を恐れずに書けば外部データを読み込む時に使うでも嘘じゃ無いです。
さてそのLoadVarsを使って読み込むのが６行目。これは見て分かるとおりLoadVarsクラスのloadを使って先ほど作ったcsvファイルを読み込むとしています。
今度は行数を戻って2行目、ここは何かと書くと、６行目で指定したデータの読み込みが終了したら呼ばれる所になります。
しかし、読み込み命令より先にこんな命令を書いて大丈夫なんかいと心配になりませんか？。
ワシはなりました。
ですが、よくみればこいつはfunctionであって、その場で実行される物じゃ無く、呼ばれて初めて実行される物ってのがわかります。つまり６行目の命令が動き出して、終了すると２行目を呼び出すってわけです。
またこの書き順には意味がありまして、もしload命令を２行目より先に書いてた場合、時と場合によっては２行目の命令が生成される前にLoadが終了してしまう事があり、2行目が呼び出されない可能性があるそうなんです。
まどろっこしいですな。とは言え見過ごしやすい場所なんで注意です。
さて２行目～５行目にかけては、当然ロード終了後の話です。
まず２行目のfunction(data）に注目。
これはload命令が終了した時に呼ばれると何度も書いてますが、そのload命令が取得したものを、このdataってやつに入れ込んでくれてます。
当然取得したものは、data.csv、もっと書けば1,2,3,4,5と書かれた「文字データ」です。
当然ですが、数字も文字として取得するので注意です。
次に３行目、data.split(&#8221;,&#8221;)。splitってやつは文字データを指定のデータで区切って分けてくれる便利な命令です。
３行目では区切りったデータをArrayに返してます。
今回はカンマ「,」を指定しているので、１と２と３と４と５と言う５つの文字データを作り、順番に配列に入れています。
この区切りに使ったデータの（”、”）は区切ったデータには入りません。
要は1,と2,と3,と4,と５みたいなデータでは無いって事です。
４行目はもう分かりますな、単純に取り込んだデータをカンマで区切って、その４番目（０から数えるので）のデータを表示しろとしているだけです。
当然先にも書いたように４がでるわけです。
これで外部データの取り込みの基礎は終わりです。
とりあえず、data.csv側のデータを色々変えてみてどうなるか試してみると良いと思います。
重要なのは Flashは簡単にテキストファイルを読み込める の一点です。
知ってしまえば簡単ですな。
関連ページ

第1回『ゲーム製作の流れ、一から見せます』
第2回『企画内容を吟味しよう』
第3回『仕様を詰めておこう』
第4回『では、仕様書をまとめましょうか』
第5回『ゲーム制作のためのツールを作る。・・・・いやじゃ！』

ここまで出てきた資料

バウンスショット企画書
OpenCalc用敵データ(enemy_data(OpenCalc).zip 8KByte)
CSV版敵データ(enemy_data(CSV).zip 1KByte)

]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=73</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その5〜</title>
		<link>http://kyoudou.nigoro.jp/?p=83</link>
		<comments>http://kyoudou.nigoro.jp/?p=83#comments</comments>
		<pubDate>Sun, 21 Sep 2008 02:34:47 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Action Script]]></category>

		<category><![CDATA[Flashテクニック]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=83</guid>
		<description><![CDATA[第5回『ゲーム制作のためのツールを作る。・・・・いやじゃ！』
なーんでツールを作るのが嫌いかと書きますと、ズバリ、ツールを作り始めるとそっちに満足して本体を作りたくなくなるから。
モチベーションの問題ですな。そんな奴が記事を書くなって？
そんな事いっちゃ駄目よ。
なにせ記事を書けるだけの手が空いてるのが、今はワシだけなのだから。世界七不思議の一つ、大人の事情ってやつっす。
さて、ツールを作るのは嫌、でもデータを打ち込むのも嫌、とワガママ言い放題では話が進みません。だったらやる事は一つ、既存のツールを使ってデータを打ち込める様に考えちゃおうって算段。そう、世はプログラム戦国時代、創世記の「何をやるにも自分で作る」という時代は終わっているのです。
普段は、とにかくワシ流のやり方（データフォーマット）で作らせてくれ！とワガママを言いますが、都合がいい時だけ既存のツールを使おうよ！ですよ。
そんな二枚舌でも無問題、こんな感じでやらないとＩＴ砂漠では生きて行けないのです。楽をするためならプライドなんか捨てっちまえ。
さて、バウンスショットではステージのデータやら敵の種類やらを別ファイルにて作成することに決めたのは前回の通り。
これは前の記事で少し触れましたが、CSVと呼ばれるデータ形式だったら、わし以外でも簡単に作れるだろうとの思いでCSVを採用することにしました。
CSVはOpen Office に入っている OpenCalc * というExcelもどきで作ります。もちろん、Excelでも作れますよ。
（＊もどきなんて書いてますが素晴らしい性能ですよ、フリーソフトと思えません。ぜひとも銀行とのやり取りにも、OpenCalcのデータでやり取り出来る様に対応して欲しいものです。しかも保存用にマクロを使うだけでExcelを使わなきゃならんとか嫌なんじゃい！）
外部に出すデータは何が必要なのかは第4回『では、仕様書をまとめましょうか』で書いています。忘れた人は戻って読んでこい。
ここでは実データの一つを公開しようと思います。

OpenCalc用敵データ(enemy_data(OpenCalc).zip 8KByte)
CSV版敵データ(enemy_data(CSV).zip 1KByte)

上のリンクで落とせるファイルはOpenCalc用のファイルで、こいつが敵データのcsvとなります。
OpenCalcはOpenofficeというフリーの統合オフィスソフト内の１アプリケーションです。持っていて損は無いので持っていない人はさっくりダウンロードしましょう。
ではenemu_data.odsは開けましたか？。これが今回のゲーム、バウンスショットに出てくる敵データとなります。
いろいろ書かれていますが、すべて使うかどうかは今は未定です。
しかしデータを外部に持つことにどんな意味があるのか、他人にデータを打ち込んでもらえるだけなのか？
いいえそんな事はありません、こう云ったデータを外部に持たせる事で、データを打ち込む人がプログラムのコンパイルを行わずにすみます。
コンパイルの時間ってのは思いの他かかる物で、速いマシーンならまだしも一昔前のやつだったりすると数十秒から数分かかる事があります。
何だ、たったその位なのかと思ってはいけません、何故なら僅か１行弄ってはコンパイル、１文字弄ってはコンパイル、下手をすりゃプログラムを書く時間よりもコンパイル時間の方が長い事すらあるのです。だからデータ類は外部でやるに越したことはありません。
そんな中、ならむらさんにデータを打ち込むのはどんなやり方が良いですかね？
と、尋ねたところ、「今までの様にソースファイルの配列に直接書くのが一番やりやすい」とお答えをいただきました。
畜生、ワシの野望、これまたロスト！
でもコートの中じゃ泣かない、だって・・・・今回はデータマンに0saeさんもいるんだから。いやっほぅっ、これで無駄にならずに済みそうだ。
それにしても女性でもデータマンって言うんですかね？、それともデータレディー？。まぁコ○ミマンレディーなんて居るくらいだから、データマンレディーと呼べば言いのでしょう、きっと。
最後になりますが、今回の記事で一番重要な「OpenCalcで作成したデータをcsvにする時の注意点」を書こうと思います。
先ず、このodsデータを名前を付けて保存してみましょう。
欲しいデータはcsvファイルなので、ファイルの種類はテキスト CSV(csv) を選びます。
設定によってはなにやらウィンドウが出てきますが、そこではOKを押して進んでください。
テキストのエクスポートダイアログが出るはずです。
ここで変更する場所は二箇所、先ずは文字列（ｃ）ですが、こいつをUnicode（UTF-8)に変更する事。
そしてもう一つがテキストの区切り記号を初めは「”」ダブルクォーテーションに指定されているはずなので、こいつを消してください。deletキーで普通に消せます。選択しても何も使わないという選択肢は無いので注意です。
これでOKを押せば晴れてアクションスクリプトから呼び出せる形式になるわけです。

要は保存する時は上のようになってれば良いんです。文字で書くと長々となるのに絵だと一発ですみますな。
次回はこうして出来上がったcsvファイルをどうやってスクリプトから読み込むのかをやりたいと思います。
まぁ果報は寝て待てってね。
関連ページ

第1回『ゲーム製作の流れ、一から見せます』
第2回『企画内容を吟味しよう』
第3回『仕様を詰めておこう』
第4回『では、仕様書をまとめましょうか』

ここまで出てきた資料

バウンスショット企画書
OpenCalc用敵データ(enemy_data(OpenCalc).zip 8KByte)
CSV版敵データ(enemy_data(CSV).zip 1KByte)

]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=83</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その4〜</title>
		<link>http://kyoudou.nigoro.jp/?p=60</link>
		<comments>http://kyoudou.nigoro.jp/?p=60#comments</comments>
		<pubDate>Fri, 01 Aug 2008 14:20:15 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Action Script]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=60</guid>
		<description><![CDATA[第4回『では、仕様書をまとめましょうか』
今まで書いてたのは仕様を決める流れで、仕様ではありません。ワシがいつも脳内で完結させてる仕様書ってのを書き出して見ます。

Flashサイズ　

６４０　＊　４８０　Pixel
30FPS

画面構成レイヤー

３層
最下層　下地の真っ黒部分
中間層　敵キャラおよび自機、弾、爆発の配置部分
最上位層　壁、スコア表示

＊敵などが中間層なのは、上から出てくるときに、勝手に最上位層がマスクしてくれるから。壁の作成

Flashの塗りつぶしににて作成
Pixel単位での増減あり、左右の厚みは同じにするため、データ指定箇所は１つ

MovieClip作成

不特定、別ファイルにて作成

敵キャラ配置方法

別ファイルにて作成
数、および段数制限は無し。
壁などとの兼ね合いはデータ作成時に作成者が取る

敵キャラ移動方法

別ファイルにて作成
横移動スピード、および縦移動スピード

敵キャラ爆発方法

別ファイルにて作成
爆発基準
爆発グラフィック
巻き込み数

敵キャラスコア値

別ファイルにて作成

敵キャラ防御方法

別ファイルにて作成

敵キャラヒット判定

別ファイルにて作成

ステージ構成データ

別ファイルにて作成
敵キャラ配置データその他

自機キャラ移動方法

Flashゲーム講座＆アクションスクリプトサンプル集で覚えたマウス移動のやりかた。

＊ありがとうございます、いつも勉強させてもらってます。
onClipEvent (enterFrame) {var d = 0.15;_x += (_root._xmouse - _x) * d;}
こういうの。敵キャラの段落が下がる条件

左右どちらかに、敵の端キャラがたどりついた時がる数値は別ファイル作成。

スコア表示位置と桁

別ファイル作成

残機表示位置と数

別ファイルにて作成。初期残機数が、表示できる残機数最大とする。

＊仕様上、スコアによるエクステンドは今のところ無しグラフィック指定

別ファイルにて指定。

とまぁこんな感じになります。本当であれば、ここで数値がずらりと並ぶんですが、今回のバウンスショットではほとんど数値が出てきてません。
ってのも今回別ファイルを使ってデータを打ち込むって事をやることにしたからです。今までNIGOROでは直接プログラム内に打ち込むことでデータを配置してきたのですが、そろそろ限界を感じはじめました。
結局のところ遅かれ早かれ、外部データとのやりとりは必ず発生すると思って間違いありません。
そんなわけで経堂用なのに、なんだか規模がでかくなりはじめてますが、このくらいは乗り越えられると思います。
なんせワシで判るレベルですから。
関連ページ

第１回『ゲーム製作の流れ、一から見せます』
第2回『企画内容を吟味しよう』
第3回『仕様を詰めておこう』

ここまで出てきた資料

バウンスショット企画書

]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=60</wfw:commentRss>
		</item>
		<item>
		<title>ゲームを作ってみよう 〜その3〜</title>
		<link>http://kyoudou.nigoro.jp/?p=59</link>
		<comments>http://kyoudou.nigoro.jp/?p=59#comments</comments>
		<pubDate>Mon, 28 Jul 2008 10:31:59 +0900</pubDate>
		<dc:creator>duplex</dc:creator>
		
		<category><![CDATA[バウンスショット]]></category>

		<category><![CDATA[ゲーム制作ネタ]]></category>

		<category><![CDATA[Action Script]]></category>

		<guid isPermaLink="false">http://kyoudou.nigoro.jp/?p=59</guid>
		<description><![CDATA[第3回『仕様を詰めておこう』
まだまだ深みに入る敵。て、仕様を決めるにあたって気になるのが、敵の配置がランダムって所。ランダムで置くのは簡単ですが、ぶっちゃけ面白くありません。敵の配列が骸骨型とか、文字になったりしてたほうが面白いと思う人だと思ってます。
ならむらさんが。
当然ワシはそんな面倒な事は嫌いなんですが、ここではならむらさんが黒いもんでも白といえば白となる世界、だったらステージはランダムではなくて自分で配置できるようにするのが得策と言うものでしょうか。
実のところこの変更にはかならず議論が沸くところです。何しろランダムならだれの手間もいらない、配置だと自分らでそのデータを作り上げなくてはならないのでコストが発生します。どんなに面白くなるからと言ってもその理屈じゃ通りません、そんなわけでこういった所は必ず企画者と話し合いを持ちましょう。今回のバウンスですが、話した結果、色々と考えて配置型で行くことになりました。さて、企画から仕様をまだまだ作っていくわけですが、今のところ、壁の肉厚の可変、敵キャラは巻き込みは十字タイプのみで種類を作れるようにと、どんどん勝手に変化させてきました。良いんです、これでも企画書通りの物は作れますから。次は、画面のレイアウトにうつります。普段どんなものを作るにしてもワシはレイアウトを決めません。というか決めても後で変更を余儀なくされるし、そもそもそういうのはデザイナー側の仕事で、ワシに出来る訳でも無いんです。
というわけでここでも選択肢がでるかと思いきやでません。ならむらさんと相談するまでもなく、デザイナー側で好き勝手出来るようにする事の１択しかないわけです。この時にきっちり相談して決めても今までの経験上、後でちょっとこの位置は動かそうよという変更はたびたび起こってました。これはプレイの都合上、邪魔に思えた物はワシのほうで別の位置へと変えたりする時があるので、仕方ない所です。となれば、最初からデザイナー側で変更できるようにするのが美味しいってわけですな。そして、最後が自機、これは企画書から変更しなきゃならない所は見えません。匂ってもきません。
一箇所だけ気になるといえば、玉が垂直に壁に当たると跳ねずに消えるというところ。ざわざこういう風に書いてると言うことは、垂直時には消えてほしいって事だと思います。ただ、垂直にあたるとしても、自機の回転の仕様上、天井に位置する壁にだけとなります。となると、自機がぴったりと止まってる時に発射したたまだけって事になるんです。正直そんな時間はゲーム中にいくらあるのか判りません。内部的にはコンマの世界で角度が変わってます。そんなわけで、左右角2.5度づつまでなら垂直とみなして消えるようにしました。一応横壁に当たった際の弾の角度変更は、良くあるパターン（当たった角度を反映して曲がる）で構築することにします。これは相談してないんですが正直それ以外のランダムでまがるとか、１８０度反転とかあってもしょうがないとワシが判断しました。このゲームにアイテムが登場すればそれも必要だと思うんですが、アイテムなんか絶対追加しませんよ。そういう所は確固たる信念を貫きましょう。しなきゃ死んじゃうよ！。さて最後に、仕様を決める物がフォント。
デフォルトの文字を使えばそれで良いんですが今までの経緯を考えて、ならむらさんがデフォルトフォントを使うって事が考えられません。ワシだったら何も気にせず文字表示APIを使っちゃうところですが、こういう所はがっちり拘ってくるお人です。そんなわけで、どうするかと考えました。
本当は相談すれば一番良いのですが、ひっこしポロポロから使ってるライブラリ化した文字表示プログラムがNIGORＯというか、ワシの方にはあります。てなわけで、さっくりそれを使う事にしました。
日本語表示は出来ないけど、まぁ大丈夫でしょう。
関連ページ

第１回『ゲーム製作の流れ、一から見せます』
第2回『企画内容を吟味しよう』

ここまで出てきた資料

バウンスショット企画書

]]></description>
		<wfw:commentRss>http://kyoudou.nigoro.jp/?feed=rss2&amp;p=59</wfw:commentRss>
		</item>
	</channel>
</rss>
