レビュー#1 suica32

制作 D.N.A.Softwares様
http://aims.dna-softwares.com/?page_id=14






          遊んでみて


自分から弾に当たりにいってよく死ぬのだが
私の最高は 383万1520点だぜ☆


            概要


スコアアタックSTGだぜ☆

生き残って長く遊ぶことが大事だぜ☆

途中でレベルが上がると 有無を言わさずショットの種類が変わるのだが、射程が短いショットをつかまされたときは大変だぜ☆!
自機はライフ性で、ライフ1になると玉が敵に張り付く。攻撃力が一気に上がるのでエクステンド(1up)を期待しよう。


      ソースコードレビュー

           シーン遷移





          イニシャライザー

①弾(bullets) ②バトル効果(effect) ③敵萃香(enemy) ④自機霊夢(player)
⑤ゲームコモン(game_common) ⑥シューティング・シーン(game) ⑦ゲームタイトル(title) ⑧効果音(se)
⑨フォント(font)

これら9つには、イニシャライザーが付いているぜ☆


イニシャライザーというのは、「Now Loading...」の時にやる処理のことだぜ☆
それぞれ、どんなことをやっているか 中を覗いてみよう☆




①弾(bullets)

    s/chr/bullets.lua
      function bullets_init()

    この中では、弾の画像を読み込み、1つ1つの画像に当たり判定を付けているぜ☆
    

gfx/ebullets.png
    
    横16、縦16個の画像が並んでいるぜ☆
    
    x=12、y=12、横縦8x8 ピクセルの位置に当たり判定を付けているぜ☆
    1つだけ、0から数えて227番目の座布団だけは 当たり判定が 32x32 になるように設定されているぜ☆

↓読み飛ばしていいぜ☆
function bullets_init()

	G.bullets={ base = loadGraphic("gfx/ebullets.png") };
	local x,y;
	local idx =0;
	for y=0,15,1 do
		for x=0,15,1 do
			G.bullets[idx]=cutGraphic(G.bullets.base,x*32,y*32,32,32);
			if(idx == 227) then 
				addGraphicHit(G.bullets[idx],0,0,32,32)
			else
				addGraphicHit(G.bullets[idx],12,12,8,8);
			end
			idx=idx+1;
		end
	end
--	addGraphicHit(G.bullets[227],0,0,32,32); -- 座布団だけでっかくなる
end

table.insert(INITIALIZER_LIST,bullets_init);
s/chr/bullets.lua




②バトル効果(effect)

    s/chr/effect.lua
      function effect_init()

    この中では、次の3つのことをしているぜ☆

    ①エフェクト1の画像を読み込み、8枚だけ切り抜いて連続アニメとして登録。


gfx/efx1.png

    ②衝撃波の画像を読み込んでいるぜ☆
    ③ボス萃香のカットイン画像を読み込んでいるぜ☆

↓読み飛ばしていいぜ☆
function effect_init()
	G.efx = {}
	G.efx.blast = { base = loadGraphic("gfx/efx1.png") };
	local i;
	for i=1,8,1 do
		G.efx.blast[i] = cutGraphic( G.efx.blast.base, 64*math.mod(i-1,4), 64*math.floor((i-1)/4), 64, 64 );
	end
	setGraphicAnimeSequence(G.efx.blast,3);
	
	G.efx.shock = loadGraphic("gfx/shockwave.png");
	G.efx.cutin = loadGraphic("gfx/cutin.png");
end

table.insert(INITIALIZER_LIST,effect_init); -- boot時初期化を実施
s/chr/effect.lua




③敵萃香(enemy)

    s/chr/enemy.lua
      function enemy_init()

    この中では、次の6つのことをしているぜ☆

    ①ザコ萃香のアニメのループ間隔を 5 に設定しているぜ☆
    ②ザコ萃香の画像を読み込んでいるぜ☆


gfx/oni_sprite.png

        ③その画像の中から、「萃香ふっとび」の部分を1コマ切り抜き、アニメ間隔を覚えさせているぜ☆
        ④その画像の中から、「萃香歩き上」の部分を4コマ切り抜き、アニメ間隔を覚えさせているぜ☆
        ⑤その画像の中から、「萃香歩き下」の部分を4コマ切り抜き、アニメ間隔を覚えさせているぜ☆
        ⑥その画像の中から、「萃香歩き横」の部分を4コマ切り抜き、アニメ間隔を覚えさせているぜ☆

    ゲーム中では没になっている動きもあるな☆

↓読み飛ばしていいぜ☆
function enemy_init()
	SUICA_MOTION_INTERVAL = 5 -- アニメのループ間隔

	G.obj_enemy = loadGraphic("gfx/oni_sprite.png",0,130,70)
	G.suika_out = cutGraphic(G.obj, 160, 0, 32, 42)	-- 萃香ふっとび
	
	G.suika_walkup = {}	-- 萃香歩き上
	G.suika_walkup[1] = cutGraphic(G.obj,  0, 84, 32, 42)
	G.suika_walkup[2] = cutGraphic(G.obj, 32, 84, 32, 42)
	G.suika_walkup[3] = cutGraphic(G.obj, 64, 84, 32, 42)
	G.suika_walkup[4] = cutGraphic(G.obj, 96, 84, 32, 42)
		setGraphicAnimeLoop(G.suika_walkup,SUICA_MOTION_INTERVAL,1)
		setGraphicHit(G.suika_walkup[1], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkup[2], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkup[3], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkup[4], 0,  0, 32, 42)
	
	G.suika_walkdown = {}	-- 萃香歩き下
	G.suika_walkdown[1] = cutGraphic(G.obj,  0, 42, 32, 42)
	G.suika_walkdown[2] = cutGraphic(G.obj, 32, 42, 32, 42)
	G.suika_walkdown[3] = cutGraphic(G.obj, 64, 42, 32, 42)
	G.suika_walkdown[4] = cutGraphic(G.obj, 96, 42, 32, 42)
		setGraphicAnimeLoop(G.suika_walkdown,SUICA_MOTION_INTERVAL,1)
		setGraphicHit(G.suika_walkdown[1], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkdown[2], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkdown[3], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkdown[4], 0,  0, 32, 42)
	
	G.suika_walkside = {}	-- 萃香歩き横
	G.suika_walkside[1] = cutGraphic(G.obj, 128, 42, 32, 42)
	G.suika_walkside[2] = cutGraphic(G.obj, 160, 42, 32, 42)
	G.suika_walkside[3] = cutGraphic(G.obj, 192, 42, 32, 42)
	G.suika_walkside[4] = cutGraphic(G.obj, 224, 42, 32, 42)
		setGraphicAnimeLoop(G.suika_walkside,SUICA_MOTION_INTERVAL,1)
		setGraphicHit(G.suika_walkside[1], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkside[2], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkside[3], 0,  0, 32, 42)
		setGraphicHit(G.suika_walkside[4], 0,  0, 32, 42)
end
table.insert(INITIALIZER_LIST,enemy_init); -- boot時初期化を実施
s/chr/enemy.lua




④自機霊夢(player)

    s/chr/player.lua
      function player_init()

    この中では、次の5つのことをしているぜ☆

    ①自機霊夢の画像を読み込んでいるぜ☆


gfx/oni_sprite.png

        ②その画像の中から、「霊夢」の部分を1コマ切り抜き、当たり判定を付けているぜ☆
        ③その画像の中から、「霊夢歩き」の部分を4コマ切り抜き、当たり判定を付けているぜ☆
         また、アニメ間隔も設定しているぜ☆

        ④その画像の中から、「豆」の部分を4コマ切り抜き、当たり判定を付けているぜ☆
         上の画像だと「6」の左上にある☆

        ⑤その画像の中から、「あたりエフェクト」の部分を1コマ切り抜いているぜ☆
         上の画像だと「6」の右上あたりにある☆
         これには当たり判定は付けていない。

↓読み飛ばしていいぜ☆
----------------------------------------
-- init … 関数を定義し、INITIALIZER_LISTにtable.insertすると起動時に実行される
----------------------------------------
function player_init()
	-- テストキャラロード
	G.obj = loadGraphic("gfx/oni_sprite.png",0,130,70)

	-- 画像切り出し
	G.reimu = cutGraphic(G.obj, 0, 0, 32, 42)	-- 霊夢
		setGraphicHit(G.reimu, 0, 0, 32, 42)
	
	local HITAREA = 3
	G.reimu_walk = {}	-- 霊夢歩き
	G.reimu_walk[1] = cutGraphic(G.obj,  32, 0, 32, 42)
	G.reimu_walk[2] = cutGraphic(G.obj,  64, 0, 32, 42)
	G.reimu_walk[3] = cutGraphic(G.obj,  96, 0, 32, 42)
	G.reimu_walk[4] = cutGraphic(G.obj, 128, 0, 32, 42)
		setGraphicAnimeLoop(G.reimu_walk,5,1)
		setGraphicHit(G.reimu_walk[1], 16-HITAREA,21-HITAREA,HITAREA*2,HITAREA*2)
		setGraphicHit(G.reimu_walk[2], 16-HITAREA,21-HITAREA,HITAREA*2,HITAREA*2)
		setGraphicHit(G.reimu_walk[3], 16-HITAREA,21-HITAREA,HITAREA*2,HITAREA*2)
		setGraphicHit(G.reimu_walk[4], 16-HITAREA,21-HITAREA,HITAREA*2,HITAREA*2)

	G.beans = {}	-- 豆
	G.beans = cutGraphic(G.obj, 192, 0, 16, 16)
		setGraphicHit(G.beans, 0, 0, 16, 16)
	
	G.hit = {}	-- あたりエフェクト
	G.hit = cutGraphic(G.obj, 208, 0, 24, 24)

end

table.insert(INITIALIZER_LIST,player_init); -- boot時初期化を実施
s/chr/player.lua




⑤ゲームコモン(game_common)

    s/game_common.lua
      function common_graphic_setup()

    この中では、次の3つのことをしているぜ☆

    ①汎用画像「black」を読み込んでいるぜ☆ 座標の原点を、画像の左上隅に変えているぜ☆
     1ドットの黒い点だぜ☆
    
    ②汎用画像「white」を読み込んでいるぜ☆ 座標の原点を、画像の左上隅に変えているぜ☆
     1ドットの白い点だぜ☆
    
    ③汎用画像「clear」を読み込んでいるぜ☆ 座標の原点を、画像の左上隅に変えているぜ☆
     2x2ドットの点なのだが、何なんだぜ☆?
    


↓読み飛ばしていいぜ☆
-- 共通エフェクトのローディングをgame_commonで行う
function common_graphic_setup()
	--
	-- 各種エフェクトの読み込み
	--
	
	G["common"] = {};
	G["common"].black = loadGraphic("gfx/black.png");
		setGraphicCenter(G["common"].black, 0, 0);
	G["common"].white = loadGraphic("gfx/white.png");
		setGraphicCenter(G["common"].white, 0, 0);
	G["common"].clear = loadGraphic("gfx/clear.png");
		setGraphicCenter(G["common"].clear, 0, 0);
end

table.insert(INITIALIZER_LIST,common_graphic_setup);
s/game_common.lua




⑥シューティング・シーン(game)

    s/scene/game.lua
      function game_init()

    この中では、次の3つのことをしているぜ☆

    ①3枚の背景画像を読み込んでいるぜ☆ 昼、夕方、夜っていう感じだな☆
    ②残機数用のハート画像を読み込んでいるぜ☆ 座標の原点を、画像の左上隅に変えているぜ☆
    ③「GAMEOVER」というテロップ画像を読み込んでいるぜ☆

↓読み飛ばしていいぜ☆
--------------------------------------------------------------------------------
-- 事前初期化を実施する … ロゴロード時に自動実行
--------------------------------------------------------------------------------
function game_init()
	G.game={}
	G.game.bg= {
		loadGraphic("gfx/bg.jpg");
		loadGraphic("gfx/bg2.jpg");
		loadGraphic("gfx/bg3.jpg")
	};
	G.game.heart=loadGraphic("gfx/heart.png");
	G.game.gameover = loadGraphic("gfx/telop/gameover.png");
	setGraphicCenter(G.game.heart,0,0);
end

table.insert(INITIALIZER_LIST,game_init);
s/scene/game.lua




⑦ゲームタイトル(title)

    s/scene/title.lua
      function title_init()

    この中では、次の1つのことをしているぜ☆

    ①ゲームタイトル画面の画像を読み込んでいるぜ☆

↓読み飛ばしていいぜ☆
function title_init()
	G.title = {};
	G.title.bg = loadGraphic("gfx/title_bg.png");
end

table.insert(INITIALIZER_LIST,title_init);
s/scene/title.lua




⑧効果音(se)

    s/se.lua
      function se_init()

    この中では、次の1つのことをしているぜ☆

    ①効果音を 9 ファイル読み込んでいるぜ☆

↓読み飛ばしていいぜ☆
function se_init()
	S = {
		pshot	= loadSound("se/pshot.wav");
		pspell	= loadSound("se/pspell.wav");
		pdead	= loadSound("se/pdead.wav");
		shothit	= loadSound("se/shothit.wav");
		laser	= loadSound("se/laser.wav");
		zakodead= loadSound("se/zakodead.wav");
		bossdead= loadSound("se/bossdead.wav");
		bossshow= loadSound("se/bossshow.wav");
		extend	= loadSound("se/extend.wav")
		};
end

table.insert(INITIALIZER_LIST,se_init);
s/scene/title.lua




⑨フォント(font)

    s/stringactor.lua
      function font_init()

    この中では、次の1つのことをしているぜ☆

    ①フォント画像を読み込んでいるぜ☆


gfx/fonth16.png

    ②文字が縦横に 16x16 個並んでおり、1つ1つを切り抜いて 座標の原点を画像の左上隅に変えているぜ☆
    ③先頭を 0 と数える配列に 16行x16列の文字を1つ1つ入れているぜ☆

    なお、この「⑨フォント」だけは イニシャライザーではない☆
    イニシャライザーと同じ見た目に揃えているが、単に boot.lua の boot_OnStart関数で直接呼び出されている。

    「Now Loading...」という文字を表示するのは、「Now Loading...」中にはできないからな☆

↓読み飛ばしていいぜ☆
function font_init()
	G.font={ base = loadGraphic("gfx/fonth16.png") };
	local x,y;
	local idx =0;
	for y=0,15,1 do
		for x=0,15,1 do
			G.font[idx]=cutGraphic(G.font.base,x*8,y*16,8,16);
			setGraphicCenter(G.font[idx],0,0);
			idx=idx+1;
		end
	end
end
s/stringactor.lua