レビュー#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