概要
タイトル画面、モックアップ メニューを作成し、移動可能な 2 レイヤーのタイルマップをロードします。 Butano が必要になり、grit、usenti、またはその他のグラフィック プログラムを使用してアセットを変換できます。透明色 (この場合は緑) は、パレットの最初の色である必要があります。プログラム「Tiled」を使用してタイルセットとタイルマップを作成し、エクスポートしたいレイヤー以外をすべて非表示にして各レイヤーをエクスポートしました。次に、それを GIMP で開き、緑をパレットの最初の色にしてから、16 色のインデックス カラーに変更し、色空間情報なしで bmp としてエクスポートしました。また、通常の背景またはタイルマップであることを示す対応する json ファイルを作成する必要がありました。
ここで ROM をダウンロードできます。 ROMをダウンロード
このプロジェクトをリポジトリからダウンロードします。 - Gogs リポジトリ - Github リポジトリ
背景を3つ作ります。最初の背景は移動せず、2 番目の背景は半分の速度でスクロールし、前景はバウンドするタイトル グラフィックの前面にある雲と山をスクロールします。開始を押すと再生する音楽と効果音を追加します。
2 つの背景がスクロールし、いくつかのテキストが印刷されて、選択可能なメニュー項目のように見えるメニュー画面。 「A」ボタンが押されるのをただ待つようにメニュー画面をコーディングします。
2 つのタイルマップ レイヤーが最初に背景として読み込まれ、マップをスクロールできますが、境界の外に出ないでください。さもないとクラッシュします。
画像アセット
バックグラウンド, ミッドグラウンド, 前景
バックグラウンド
ミッドグラウンド
前景
タイトル、4 つの 64x64 の正方形
タイトル、4 つの 64x64 の正方形
タイルマップ x2 レイヤー
コード
/*
* Copyright (c) 2020-2021 Gustavo Valiente gustavo.valiente@protonmail.com
* zlib License, see LICENSE file.
*/
#include "bn_core.h"
#include "bn_keypad.h"
#include "bn_optional.h"
#include "bn_bg_palettes.h"
#include "bn_music_actions.h"
#include "bn_sprite_actions.h"
#include "bn_sprite_text_generator.h"
#include "bn_display.h"
#include "bn_regular_bg_ptr.h"
#include "bn_regular_bg_actions.h"
#include "bn_regular_bg_builder.h"
#include "bn_regular_bg_attributes.h"
#include "bn_regular_bg_position_hbe_ptr.h"
#include "bn_affine_bg_ptr.h"
#include "bn_affine_bg_map_ptr.h"
#include "bn_string_view.h"
#include "bn_vector.h"
#include "bn_sprite_text_generator.h"
#include "bn_regular_bg_items_background.h"
#include "bn_regular_bg_items_foreground.h"
#include "bn_regular_bg_items_midground.h"
#include "bn_regular_bg_items_summerstage.h"
#include "bn_regular_bg_items_summerstage2.h"
#include "bn_affine_bg_items_seasonstileset.h"
#include "bn_sprite_items_cursor_right.h"
#include "bn_sprite_items_logo_p1.h"
#include "bn_sprite_items_logo_p2.h"
#include "bn_sprite_items_logo_p3.h"
#include "bn_sprite_items_logo_p4.h"
#include "bn_music_items.h"
#include "bn_sound_items.h"
#include "bn_sprite_items_bullet.h"
#include "info.h"
#include "variable_8x16_sprite_font.h"
namespace
{
bool main_menu_mode_enabled = false;
int cursor_index;
int num_options;
void title_screen(bn::sprite_text_generator& text_generator)
{
//BG2
bn::regular_bg_ptr background_bg = bn::regular_bg_items::background.create_bg(64,32);
// background_bg.set_priority(0);
//BG1
bn::regular_bg_ptr midground_bg = bn::regular_bg_items::midground.create_bg(64,64);
//midground_bg.set_priority(1);
//BG0
bn::regular_bg_ptr foreground_bg = bn::regular_bg_items::foreground.create_bg(64, 64);
foreground_bg.set_priority(0);
int sprite_y_range = 12;
bn::sprite_ptr sprite_p1 = bn::sprite_items::logo_p1.create_sprite(-32, -64);
bn::sprite_ptr sprite_p2 = bn::sprite_items::logo_p2.create_sprite(32, -64);
bn::sprite_ptr sprite_p3 = bn::sprite_items::logo_p3.create_sprite(32, 0);
bn::sprite_ptr sprite_p4 = bn::sprite_items::logo_p4.create_sprite(-32, 0);
bn::sprite_move_loop_action sprite_p1_move_action(sprite_p1, 120, -32, -56);
bn::sprite_move_loop_action sprite_p2_move_action(sprite_p2, 120, 32, -56);
bn::sprite_move_loop_action sprite_p3_move_action(sprite_p3, 120, 32, 8);
bn::sprite_move_loop_action sprite_p4_move_action(sprite_p4, 120, -32, 8);
constexpr bn::string_view info_text_lines[] = {
"",
"",
"",
"",
"",
"",
"",
"",
"Press Start",
};
info info("", info_text_lines, text_generator);
info.set_show_always(true);
/*
bn::sprite_move_loop_action sprite_p1_move_action(sprite_p1, 64 , sprite_y_range, sprite_y_range*2);
bn::sprite_move_loop_action sprite_p2_move_action(sprite_p2, 64+64 , sprite_y_range, sprite_y_range*2);
bn::sprite_move_loop_action sprite_p3_move_action(sprite_p3, 64 +64, sprite_y_range, sprite_y_range*2);
bn::sprite_move_loop_action sprite_p4_move_action(sprite_p4, 64 , sprite_y_range, sprite_y_range*2);
*/
bn::sound_items::spin_down.play();
bn::music_items::ccf.play(0.5);
while(! bn::keypad::start_pressed())
{
foreground_bg.set_x(foreground_bg.x() - 1);
midground_bg.set_x(midground_bg.x() - 0.5);
info.update();
sprite_p1_move_action.update();
sprite_p2_move_action.update();
sprite_p3_move_action.update();
sprite_p4_move_action.update();
bn::core::update();
}
bn::sound_items::spin_up.play();
}
void main_menu(bn::sprite_text_generator& text_generator)
{
//BG2
bn::regular_bg_ptr background_bg = bn::regular_bg_items::background.create_bg(64,32);
// background_bg.set_priority(0);
//BG1
bn::regular_bg_ptr midground_bg = bn::regular_bg_items::midground.create_bg(64,64);
//midground_bg.set_priority(1);
//BG0
bn::regular_bg_ptr foreground_bg = bn::regular_bg_items::foreground.create_bg(64, 64);
foreground_bg.set_priority(0);
constexpr bn::string_view info_text_lines[] = {
"",
"Main Menu",
"",
"Continue",
"New Game",
"Options",
"Credits",
"",
"",
};
info info("", info_text_lines, text_generator);
info.set_show_always(true);
bn::sound_items::spin_down.play();
bn::music_items::options.play(0.5);
while(! bn::keypad::a_pressed())
{
foreground_bg.set_x(foreground_bg.x() - 1);
midground_bg.set_x(midground_bg.x() - 0.5);
info.update();
bn::core::update();
}
bn::sound_items::spin_up.play();
}
}
bn::fixed get_map_index(bn::fixed tile_x, bn::fixed tile_y, bn::fixed columns)
{
return (tile_y * columns) + tile_x;
}
void main_game()
{
bn::regular_bg_ptr background_bg = bn::regular_bg_items::background.create_bg(64,32);
// background_bg.set_priority(0);
bn::regular_bg_ptr summerstage_tiles = bn::regular_bg_items::summerstage.create_bg(64,32);
bn::regular_bg_ptr summerstage2_tiles = bn::regular_bg_items::summerstage2.create_bg(64,32);
// bn::affine_bg_ptr seasons_tileset = bn::affine_bg_items::seasonstileset.create_bg(256,256);
bn::sprite_text_generator text_generator(variable_8x16_sprite_font);
text_generator.set_center_alignment();
bn::vector<:sprite_ptr> text_sprites;
while(! bn::keypad::start_pressed())
{
text_sprites.clear();
// generate the new text
//text_generator.generate(0, -40, currentCell, text_sprites);
if(bn::keypad::right_held())
{
if (summerstage_tiles.x() < (summerstage_tiles.dimensions().width() - bn::display::width()))
{
summerstage_tiles.set_x(summerstage_tiles.x() - 1);
summerstage2_tiles.set_x(summerstage2_tiles.x() - 1);
}
}
else if(bn::keypad::left_held())
{
if (summerstage_tiles.x() >= bn::display::width())
{
summerstage_tiles.set_x(summerstage_tiles.x() + 1);
summerstage2_tiles.set_x(summerstage2_tiles.x() + 1);
}
}
if(bn::keypad::down_held())
{
if (summerstage_tiles.y() <= (summerstage_tiles.dimensions().height()/2 + bn::display::height()))
{
summerstage_tiles.set_y(summerstage_tiles.y() - 1);
summerstage2_tiles.set_y(summerstage2_tiles.y() - 1);
}
}
else if(bn::keypad::up_held())
{
if (summerstage_tiles.y() >= bn::display::height())
{
summerstage_tiles.set_y(summerstage_tiles.y() + 1);
summerstage2_tiles.set_y(summerstage2_tiles.y() + 1);
}
}
bn::core::update();
}
}
int main()
{
bn::core::init();
bn::sprite_text_generator text_generator(variable_8x16_sprite_font);
bn::bg_palettes::set_transparent_color(bn::color(13, 8, 14));
while(true)
{
title_screen(text_generator);
bn::core::update();
main_menu(text_generator);
main_game();
}
}