HSPでRPG製作「STEP4-4. アイテムウィンドウの実装(3)」を公開しました。
HSPでRPG製作「STEP4-4. アイテムウィンドウの実装(3)」を公開しました。
STEP4-2,3に引き続き、STEP4-4ではアイテムウィンドウの実装を
掲載していきます。
前回はアイテムウィンドウでスペースボタンを押すと
選択されているアイテムが消費されるルーチンを加えました。
今回のSTEP4-4では、CPUキャラに話しかけると「HP回復薬」を一つ
貰える(増える)ルーチンを加えることにします。
・menu.hsp
・sample.bmp
・chr.bmp
・map.txt
・cpu0.txt
・cpu1.txt
・cpu2.txt
・cpu3.txt
・cpu4.txt
※bmpファイルがアップロード出来ないので、pngファイル形式になっています
PNGファイルを一旦保存してから、BMPファイルに変換して頂くか
後に記載されているURLから[ step4-4.zip ]をダウンロードしてください
画像[ sample.bmp]はこちらを使います

画像[ chr2.bmp ]はこちらを使います

マップファイル[ map.txt ]はこちらを使います
http://blog-imgs-26.fc2.com/p/o/k/pokopokogame/map.txt
CPUの会話用ファイル[ cpu1-4.txt ]はこちらを使います
cpu0
cpu1
cpu2
cpu3
cpu4
分離ソースコード[ menu.hsp ]
以上9つのファイルを保存して
ソースコードのあるフォルダと同じ場所に移動してください。
ソースコードと画像のまとまったファイルはこちらです。(96.4 KB)
http://pokpokgame.huuryuu.com/rpgmake/step4-4.zip
メインソースコード[ step4-4 ]
分離ソースコード[ menu.hsp ]
ソースコードが入力出来たら、F5キーを押してください
スクリーンショット1
s.jpg)
まずは最初の状態です。
スクリーンショット2
s.jpg)
確認の為、HP回復薬を使ってしまいます。
スクリーンショット3
s.jpg)
ここでCPUキャラに話しかけに行きます
そしてアイテムウィンドウを確認してみると・・・
スクリーンショット4
s.jpg)
見事にHP回復薬が増えていますね。
ちなみに何回でもこのアイテムを貰う事ができます。
アイテム取得のルーチンはいつでも呼び出せるように
マクロ形式にしておきました。こうすればイベント処理などを追加した場合に
即座に対応するのが可能になり、非常に便利です。
#deffunc get_item int val0, int val1
[ val0 ]で追加するアイテムのID(タイプ)を指定し
[ val1 ]で追加するアイテムの個数を指定します。
とはいっても、現在アイテムの種類は3つしかありませんが(==;)
次回のSTEPはアイテムの使用効果の実装(HPの回復など)
もしくは、装備ウィンドウの実装を計画しています。
| ステップ4-4.0 アイテムウィンドウの実装(3) |
|---|
STEP4-2,3に引き続き、STEP4-4ではアイテムウィンドウの実装を
掲載していきます。
前回はアイテムウィンドウでスペースボタンを押すと
選択されているアイテムが消費されるルーチンを加えました。
今回のSTEP4-4では、CPUキャラに話しかけると「HP回復薬」を一つ
貰える(増える)ルーチンを加えることにします。
| ステップ4-4.1 使用するファイル一覧 |
|---|
・menu.hsp
・sample.bmp
・chr.bmp
・map.txt
・cpu0.txt
・cpu1.txt
・cpu2.txt
・cpu3.txt
・cpu4.txt
※bmpファイルがアップロード出来ないので、pngファイル形式になっています
PNGファイルを一旦保存してから、BMPファイルに変換して頂くか
後に記載されているURLから[ step4-4.zip ]をダウンロードしてください
画像[ sample.bmp]はこちらを使います

画像[ chr2.bmp ]はこちらを使います

マップファイル[ map.txt ]はこちらを使います
http://blog-imgs-26.fc2.com/p/o/k/pokopokogame/map.txt
CPUの会話用ファイル[ cpu1-4.txt ]はこちらを使います
cpu0
cpu1
cpu2
cpu3
cpu4
分離ソースコード[ menu.hsp ]
以上9つのファイルを保存して
ソースコードのあるフォルダと同じ場所に移動してください。
ソースコードと画像のまとまったファイルはこちらです。(96.4 KB)
http://pokpokgame.huuryuu.com/rpgmake/step4-4.zip
| ステップ4-4.2 ソースコードの入力 |
|---|
//================================================
// 定数の定義
//================================================
#include "menu.hsp"
*start
#define Chip_size 20 // チップのサイズ(20×20)
#define Map_sizex 20 // マップサイズX(マス単位)
#define Map_sizey 20 // マップサイズY(マス単位)
//================================================
// 画面に関連データを初期化&
//================================================
randomize
// スクリーン0 width[ 20×20 ] hight[ 20×20 ]で初期化
screen 0, Chip_size * Map_sizex, Chip_size * Map_sizey
title "step4-4"
buffer 1 : picload "sample.bmp"
buffer 2 : picload "chr2.bmp"
gsel 0
font "", 14
onexit goto *game_end
//================================================
// プレイヤーキャラクターの設定
//================================================
dim c_pr, 20
#define my_x c_pr. 0 // キャラX座標
#define my_y c_pr. 1 // キャラY座標
#define my_node c_pr. 2 // キャラの方向
#define my_anime c_pr. 3// キャラのアニメーション
my_x = 5 // キャラX座標
my_y = 5 // キャラY座標
my_node = 0// キャラクターの向いている方向を保持する変数
//================================================
// 所持アイテムの設定
//================================================
all_item = 3// 所持アイテム総数
dim item, 2, // 無限にアイテムを持てるように配列を確保する。
#define item_type item. 0. c// アイテムのタイプ
#define item_have item. 1. c// アイテムの所持数
#define item_id c// アイテムのインデックス
repeat all_item
item_id = cnt
item_type = cnt
item_have = cnt + 1
loop
//================================================
// CPUの初期設定
// 構造体ぽく扱う為に、変数[ cpu_pr. *. * ]に
// #define命令で呼び出し用のマクロ名を付け使用する
//================================================
cpu_max = 5
dim cpu_pr, 10, cpu_max
#define cpu_x cpu_pr. 0. c // CPUのX座標用マクロ
#define cpu_y cpu_pr. 1. c // CPUのY座標用マクロ
#define cpu_node cpu_pr. 2. c // CPUの方向
#define cpu_move cpu_pr. 3. c // CPUの移動用フラグ
#define cpu_anime cpu_pr. 4. c// CPUキャラのアニメーション
#define cpu_type cpu_pr. 5. c // CPUキャラのタイプ
#define cpu_flag cpu_pr. 6. c // CPUの会話用フラグ
#define cpu_id c // CPUのインデックス用マクロ
// cpuの座標をランダムで決定する
// 壁にのめりこまない用x、yともに0と19は避ける
repeat cpu_max
c = cnt
cpu_x = rnd(18) + 1
cpu_y = rnd(18) + 1
cpu_type = rnd(2)
loop
//================================================
// マップデータをテキストファイルから読み込み
//================================================
sdim data
notesel data // バッファに変数[ data ]を指定する
noteload "map.txt"
// 配列変数[ マップ ]を用意する
dim map, Map_sizex, Map_sizey
// マップデータを変数[ map ]に割り当てる
x = 0
y = 0
repeat length(map)
noteget b.0, y // 読み込むデータの行
a = 0 // インデックスを0にする
repeat length2(map)
getstr b.1, b.0, a, ',' // 読み込むデータの番号
a += strsize // 次のデータ参照するためにインデックスを追加
map(x, y) = int(b.1) // int型に変換したものを代入
x += 1
loop
y += 1 : x = 0
loop
dim data // メモリ解放
b = 0
//================================================
// メインルーチン
//================================================
*main
redraw 0
wait 5
// 背景を塗りつぶし
color 255, 255, 255
boxf
color 0, 0, 0
// アニメーションのカウンター
anime += 1
if anime > 7 : anime = 0
gosub *draw_map
gosub *draw_chr
gosub *check_key
gosub *draw_cpu
gosub *check_move_cpu
redraw 1
goto *main
//--------------------------------------
// マップを描写
//--------------------------------------
*draw_map
x = 0 // X座標を保持するための変数
y = 0 // Y座標を保持するための変数
repeat length(map)
repeat length2(map)
// マップデータが0の場合地面を描写
if map(x, y) = 0 {
color 200, 200, 200
pos x * Chip_size, y * Chip_size
gcopy 1, Chip_size,0, Chip_size, Chip_size
}
// マップデータが1の場合壁を描写
if map(x, y) = 1 {
color 200, 200, 200
pos x * Chip_size, y * Chip_size
gcopy 1, 0,0, Chip_size, Chip_size
}
x += 1
loop
y += 1 : x = 0
loop
return
//--------------------------------------
// キャラクター描写
//--------------------------------------
*draw_chr
gmode 2
color 0, 0, 0
// [ move ]フラグが2の場合は移動アニメーションを描写
if move = 2 {
gosub *draw_my_anime
} else {
pos my_x * Chip_size, my_y * Chip_size
}
gcopy 2, Chip_size*my_node, Chip_size*(anime/4), Chip_size,Chip_size
return
//--------------------------------------
// 移動中のキャラアニメーション
//--------------------------------------
*draw_my_anime
my_anime -= 4 // アニメーションフレーム[ */20 ]
// キャラの向いてる方向で処理を分ける
switch my_node
case 0
pos my_x * Chip_size + my_anime, my_y * Chip_size
if my_anime = 0 {
move = 0
my_anime = 0
}
swbreak
case 1
pos my_x * Chip_size, my_y * Chip_size + my_anime
if my_anime = 0 {
move = 0
my_anime = 0
}
swbreak
case 2
pos my_x * Chip_size - my_anime, my_y * Chip_size
if my_anime = 0 {
move = 0
my_anime = 0
}
swbreak
case 3
pos my_x * Chip_size, my_y * Chip_size - my_anime
if my_anime = 0 {
move = 0
my_anime = 0
}
swbreak
swend
return
//--------------------------------------
// キー入力チェック
//--------------------------------------
*check_key
stick key, 15
//---------------------------------------------
// [ move ]フラグが[ 2 ]の時は移動中とみなし一切の
// キー入力を受け付けない
//---------------------------------------------
if move != 2 {
// キー入力があった場合は移動先を調べる
if key >= 1 {
move = 0 // 動けるか判断するフラグ
gosub *sarch_node
gosub *check_map
gosub *check_cpu
}
// スペースキーが押された場合の処理
if key = 16 : gosub *check_obj
// [ move ]フラグが[ 1 ]と[ 2 ]ではない時に移動可能です
if move = 0 {
// [ key ]という変数の状態を比較する
switch key
case 1 // 「左」方向に進みたい時
move = 2
my_x -= 1
my_anime = 20// アニメーションフレームを設定
swbreak
case 2 // 「上」方向に進みたい時
move = 2
my_y -= 1
my_anime = 20// アニメーションフレームを設定
swbreak
case 4 // 「右」方向に進みたい時
move = 2
my_x += 1
my_anime = 20// アニメーションフレームを設定
swbreak
case 8 // 「下」方向に進みたい時
move = 2
my_y += 1
my_anime = 20// アニメーションフレームを設定
swbreak
swend
}
//-----------------------------------
// [ C ]ボタンが押されたかキー入力チェック
// もし押されていればメニューウィンドウを開く
//-----------------------------------
getkey key, 67
if key = 1 {
gosub *draw_cpu// CPUを描写しておく
goto *menu_window// [ menu.hsp ]にジャンプ
}
return
}
return
/*使用する可能性があるので保留
if my_x < 0 : my_x = 0
if my_y < 0 : my_y = 0
if my_x >= Map_sizex : my_x = Map_sizex -1
if my_y >= Map_sizey : my_y = Map_sizey -1*/
//------------------------------------------------
// 押されたキー情報からキャラクターの向きを調べる
// 向いている方向の1マス先の座標を変数[ a,b ]に代入する
//------------------------------------------------
*sarch_node
switch key
case 1 // 「左」方向に進みたい時
a = my_x - 1// X座標
b = my_y // Y座標
my_node = 0 // キャラクターの向きを変える
swbreak
case 2 // 「上」方向に進みたい時
a = my_x // X座標
b = my_y - 1// Y座標
my_node = 1 // キャラクターの向きを変える
swbreak
case 4 // 「右」方向に進みたい時
a = my_x + 1// X座標
b = my_y // Y座標
my_node = 2 // キャラクターの向きを変える
swbreak
case 8 // 「下」方向に進みたい時
a = my_x // X座標
b = my_y + 1// Y座標
my_node = 3 // キャラクターの向きを変える
swbreak
//--------------------------------
// キーを同時に入力すると移動が無効になる
//--------------------------------
default
a = my_x
b = my_y
swbreak
swend
return
//------------------------------------------------
// 壁があるか調べる
//------------------------------------------------
*check_map
// 移動したい座標に壁がある場合は[ move ]に1を代入
if map(a, b) = 1 : move = 1
return
//------------------------------------------------
// CPUがいるか調べる
//------------------------------------------------
*check_cpu
// 移動したい座標にCPUがいるか調べる
repeat cpu_max
cpu_id = cnt // cpuのインデックス
if a = cpu_x && b = cpu_y {
move = 1 // CPUが存在するので変数[ move ]に1を代入
sflag = cnt
}
loop
return
//------------------------------------------------
// 今向いている方向の一歩先の座標に何があるか調べる
//------------------------------------------------
*check_obj
// 現在のプレイヤーキャラの方向
switch my_node
case 0 // 「左」方向
a = my_x - 1// X座標
b = my_y // Y座標
swbreak
case 1 // 「上」方向
a = my_x // X座標
b = my_y - 1// Y座標
swbreak
case 2 // 「右」方向
a = my_x + 1// X座標
b = my_y // Y座標
swbreak
case 3 // 「下」方向に進みたい時
a = my_x // X座標
b = my_y + 1// Y座標
swbreak
swend
sflag = 0 // 誰がいるか判別するためのフラグ
move = 0 // 動けるか判断するフラグ
gosub *check_cpu
if move != 0 {
cpu_id = sflag
//--------------------------------
// cpuは話し掛けられた方向を振り向く
//--------------------------------
if cpu_x > my_x : cpu_node = 0// CPUが右にいる場合、左に振り向く
if cpu_x < my_x : cpu_node = 2// CPUが左にいる場合、右に振り向く
if cpu_y > my_y : cpu_node = 1// CPUが上にいる場合、下に振り向く
if cpu_y < my_y : cpu_node = 3// CPUが下にいる場合、上に振り向く
gosub *draw_messege
}
return
//================================================
// メッセージの描写
//===============================================
*draw_messege
gosub *draw_cpu
redraw 1
// プレイヤーY座標でメッセージウィンドウの
// 表示位置を変える
if my_y < 10 {
a.0 = 260
a.1 = 360
} else {
a.0 = 40
a.1 = 140
}
// 表示するメッセージを読み込む
dim data
notesel data
noteload "cpu"+sflag+".txt"
// [ cpu_flag ]で読み取る会話部分を指定する
repeat 3
noteget b.0, cnt + 3 * cpu_pr.6.sflag
b.1 += ""+b.0+"\n"
loop
// スペースボタンが押されるまでループする
repeat -1
redraw 0
wait 5
// キー入力待ち
stick key
if key = 16 : break
// メッセージウィンドウ
color 255, 255, 255
boxf 40, a.0, 360, a.1
// ウィンドウ枠線
color 0, 0, 80
boxf 42, a.0+2, 358, a.1-2
// メッセージの表示
color 255, 255, 255// 白色にする
pos 50, a.0+10
mes ""+b.1+""
// 待機中アニメーション
anime += 1
if anime > 7 : anime = 0
if anime != 3 && anime != 4 {
pos 200, a.1-20
mes "▼"
}
redraw 1
loop
// 会話フラグを変更
cpu_id = sflag
cpu_flag = 1
get_item 0, 1
return
//================================================
// CPUキャラクター描写
//================================================
*draw_cpu
repeat cpu_max
cpu_id = cnt // キャラクターのインデックスIDを変更
// [ cpu_move ]フラグが2の場合は
// 移動アニメーションを描写
if cpu_move = 2 {
gosub *draw_cpu_anime
} else {
pos cpu_x * Chip_size, cpu_y * Chip_size
}
//--------------------------------
// CPUタイプ別に画像をコピーする
//--------------------------------
if cpu_type = 0 {
gcopy 2, Chip_size*cpu_node, Chip_size*(anime/4)+40, Chip_size,Chip_size
} else {
gcopy 2, Chip_size*cpu_node, Chip_size*(anime/4)+80, Chip_size,Chip_size
}
loop
return
//--------------------------------------
// 移動中のCPUキャラアニメーション
//--------------------------------------
*draw_cpu_anime
cpu_anime -= 4 // アニメーションフレーム[ */20 ]
// キャラの向いてる方向で処理を分ける
switch cpu_node
case 0
pos cpu_x * Chip_size + cpu_anime, cpu_y * Chip_size
if cpu_anime = 0 {
cpu_move = 0
}
swbreak
case 1
pos cpu_x * Chip_size, cpu_y * Chip_size + cpu_anime
if cpu_anime = 0 {
cpu_move = 0
}
swbreak
case 2
pos cpu_x * Chip_size - cpu_anime, cpu_y * Chip_size
if cpu_anime = 0 {
cpu_move = 0
}
swbreak
case 3
pos cpu_x * Chip_size, cpu_y * Chip_size - cpu_anime
if cpu_anime = 0 {
cpu_move = 0
}
swbreak
swend
return
//================================================
// CPUキャラの行動処理
//================================================
*check_move_cpu
repeat cpu_max
cpu_id = cnt // CPUのインデックス変更
//--------------------------------
// CPUは移動中では無い状態[cpu_move != 2 ]ならば
// 1/32の確率で移動する
//--------------------------------
a = rnd(32)
if cpu_move != 2 && a = 0 {
cpu_move = 0 // CPUキャラが動けるか判断するフラグ
cpu_node = rnd(4) // CPUキャラの進みたい方向をランダムで決定する
gosub *sarch_node_cpu// 移動後の座標値を取得
gosub *check_map_cpu // マップのチェック
gosub *check_cpu_cpu // 他のCPUがいるかチェック
gosub *check_my_cpu // プレイヤーキャラをチェック
// [ cpu_move ]フラグが[ 0 ]の時に移動可能です
if cpu_move = 0 {
// [ cpu_node ]CPUの方向の状態を比較する
switch cpu_node
case 0 // 「左」方向に進みたい時
cpu_move = 2
cpu_x -= 1
cpu_anime = 20// アニメーションフレームを設定
swbreak
case 1 // 「上」方向に進みたい時
cpu_move = 2
cpu_y -= 1
cpu_anime = 20// アニメーションフレームを設定
swbreak
case 2 // 「右」方向に進みたい時
cpu_move = 2
cpu_x += 1
cpu_anime = 20// アニメーションフレームを設定
swbreak
case 3 // 「下」方向に進みたい時
cpu_move = 2
cpu_y += 1
cpu_anime = 20// アニメーションフレームを設定
swbreak
swend
}
}
loop
return
//------------------------------------------------
// 押されたキー情報からキャラクターの向きを調べる
// 向いている方向の1マス先の座標を変数[ a,b ]に代入する
//------------------------------------------------
*sarch_node_cpu
switch cpu_node
case 0 // CPUキャラが「左」方向に進みたい時
a = cpu_x - 1 // X座標
b = cpu_y // Y座標
swbreak
case 1 // CPUキャラが「上」方向に進みたい時
a = cpu_x // X座標
b = cpu_y - 1 // Y座標
swbreak
case 2 // CPUキャラが「右」方向に進みたい時
a = cpu_x + 1 // X座標
b = cpu_y // Y座標
swbreak
case 3 // CPUキャラが「下」方向に進みたい時
a = cpu_x // X座標
b = cpu_y + 1 // Y座標
swbreak
swend
return
//------------------------------------------------
// CPUキャラの移動したい座標に壁があるか調べる
//------------------------------------------------
*check_map_cpu
//-----------------------------------
// 移動したい座標に壁がある場合は
// [ cpu_move ]に[ 1 ]を代入
//-----------------------------------
if map(a, b) = 1 : cpu_move = 1
return
//------------------------------------------------
// CPUキャラの移動したい座標に他のCPUがいるか調べる
//------------------------------------------------
*check_cpu_cpu
//-----------------------------------
// 移動したい座標に自分以外のCPUが存在する場合は
// [ cpu_move ]に[ 1 ]を代入
//-----------------------------------
repeat cpu_max
// 自分自身は計算しない
if cpu_id = cnt : continue
// 他のCPUのX,Y座標と自分の移動したい座標を照らし合わせる
if a = cpu_pr(0, cnt) && b = cpu_pr(1, cnt) {
// CPUが存在するので変数[ cpu_move ]に1を代入
cpu_move = 1
}
loop
return
//------------------------------------------------
// CPUキャラの移動したい座標にプレイヤーキャラがいるか調べる
//------------------------------------------------
*check_my_cpu
if a = my_x && b = my_y {
cpu_move = 1
}
return
//--------------------------------------
// プログラムを終了するか尋ねる
//--------------------------------------
*game_end
end
dialog "このままゲームを終了しますか?", 2, "選択ダイアログ"
if stat = 6 : end // 「はい」が押された場合
if stat = 7 : goto *main// 「いいえ」が押された場合
分離ソースコード[ menu.hsp ]
// ソースコード本体にジャンプ
goto *start
//================================================
// メニューウィンドウ・メインルーチン
//================================================
*menu_window
redraw 0
wait 5
// キー入力待ち
gosub *Mcheck_key
// [ x ]ボタンが押された場合
// メニューウィンドウのルーチンから抜ける
if press = "X" : goto *main
// メニューの項目表示
gosub *draw_menu_window
redraw 1
goto *menu_window
//================================================
// メニューウィンドウ内のキーチェック
//================================================
*Mcheck_key
// どのボタンが押されたか判定用に使用する
press = ""
stick key
// キー入力チェック
switch key
case 2// [ 上 ]キー入力待ち
press = "UP"
swbreak
case 8// [ 下 ]キー入力待ち
press = "DOWN"
swbreak
case 16// [ SPECE ]キー入力待ち
press = "SPECE"
swbreak
swend
// [ X ]キー入力待ち(キャンセルボタン)
getkey key, 88
if key = 1 : press = "X"
// どのボタンが押されたか判定する
switch press
// [ SPECE ]キーが押された場合
case "SPECE"
// 選択されている項目ごとに処理を分岐させる
switch select
//「道具」が選択されている場合
case 0
// 所持アイテムが1個以上の時のみ
// アイテムウィンドウを開く
if all_item > 0 {
font "", 12
select.1 = 0// 道具選択に使用する変数
gosub *item_window_init
} else {
gosub *no_item
}
swbreak
// 「特殊」が選択されている場合
case 1
gosub *magic_window
swbreak
swend
swbreak
// [ 上 ]キーが押された場合
case "UP"
select -= 1
if select < 0 : select = 5
swbreak
// [ 下 ]キーが押された場合
case "DOWN"
select += 1
if select > 5 : select = 0
swbreak
// [ X ]キーが押された場合
case "X"
swbreak
swend
return
//--------------------------------------
// アイテムを持っていなかった時の処理
//--------------------------------------
*no_item
return
//================================================
// メニューウィンドウの項目表示
//================================================
*draw_menu_window
a.0 = ginfo_winx-10// パネルのサイズX
a.1 = ginfo_winy-10// パネルのサイズY
a.2 = ginfo_winx-80// メニュー項目の座標X
// メニューウィンドウ背景
color 0, 0, 0
boxf
// 背景パネル
color 255, 255, 255
boxf 10, 10, a.0, a.1
color 0, 0, 140
boxf 12, 12, a.0 -2, a.1 -2// 枠線
// 項目パネル
color 255, 255, 255
boxf a.0 -100, 10, a.0, 200// 枠線
color 0, 0, 140
boxf a.0 -98, 12, a.0 -2, 198
// メニューの表示
color 255, 255, 255
pos a.2, 45 : mes "道具"
pos a.2, 65 : mes "特殊"
pos a.2, 85 : mes "装備"
pos a.2, 105 : mes "強さ"
pos a.2, 125 : mes "設定"
pos a.2, 145 : mes "保存"
// 選択中の項目
pos 300, 45 + select * 20
mes "●"
return
//================================================
// プレイヤーの所持アイテムを読み込む
//================================================
*item_window_init
redraw 0
wait 5
// [ x ]ボタンが押された場合
// メニューウィンドウのルーチンから抜ける
if press = "X" {
press = ""// 押されたキー情報を空にする
return
}
gosub *check_key_item
gosub *draw_item_window
redraw 1
goto *item_window_init
//================================================
// アイテムウィンドウの
//================================================
*draw_item_window
a.3 = 13// 各種パネル表示開始位置X
a.4 = 13// 各種パネル表示開始位置Y
// メニューウィンドウ背景
color 0, 0, 0
boxf
// 背景パネル
color 255, 255, 255
boxf 10, 10, a.0, a.1
color 0, 0, 140
boxf 12, 12, a.0 -2, a.1 -2// 枠線
// 上部パネル
color 255, 255, 255
boxf a.3, a.4, 130, 40
color 0, 0, 140
boxf a.3 +2, a.4 +2, 128, 38// 枠線
// 「道具」ウィンドウ看板
pos a.3 +4, a.4 +4
color 255, 255, 255
mes "道具"
// 道具の目的選択項目
// 「つかう」「せいとん」
color 255, 255, 255
boxf 132, a.4, 387, 40
color 0, 0, 140
boxf 134, a.4 +2, 385, 38// 枠線
// 道具の具体的な解説
color 255, 255, 255
boxf a.3, 42, 387, 72
color 0, 0, 140
boxf a.3 +2, 44, 385, 70// 枠線
// 文字色は白色
color 255, 255, 255
a.5 = a.3 + 20// 道具の表示開始位置X
a.6 = a.4 + 70// 道具の表示開始位置Y
repeat all_item
// アイテムのインデックスIDを変更
item_id = cnt
// 交互に道具を表示するため
// [ cnt ]の回数で位置の調整を行う
if cnt \ 2 = 0 {
a.7 = a.5// X座標
} else {
a.7 = a.5 + 180// X座標
}
a.8 = (cnt/2)*16 + a.6// Y座標
// 道具名を表示する位置
pos a.7, a.8
switch item. 0. cnt
case 0
color 255, 255, 255
mes "HP回復薬"
swbreak
case 1
color 255, 255, 255
mes "MP回復薬"
swbreak
case 2
color 100, 100, 100
mes "木刀"
swbreak
swend
// この道具を何個所持しているか
pos a.7 + 130, a.8
mes": "+item. 1. cnt+"
loop
// 選択中の道具の横にカーソル表示
color 255, 255, 255
pos 18 + (select.1\2)*180, a.6 + (select.1/2) * 16
mes "●"
return
//================================================
// アイテムウィンドウでのキー入力を調べる
//================================================
*check_key_item
// どのボタンが押されたか判定用に使用する
press = ""
stick key
// キー入力チェック
switch key
case 1// [ 左 ]キー入力待ち
press = "LEFT"
swbreak
case 2// [ 上 ]キー入力待ち
press = "UP"
swbreak
case 4// [ 右 ]キー入力待ち
press = "RIGHT"
swbreak
case 8// [ 下 ]キー入力待ち
press = "DOWN"
swbreak
case 16// [ SPECE ]キー入力待ち
press = "SPECE"
swbreak
swend
// [ X ]キー入力待ち(キャンセルボタン)
getkey key, 88
if key = 1 : press = "X"
// どのボタンが押されたか判定する
switch press
// [ SPECE ]キーが押された場合
case "SPECE"
gosub *use_item
swbreak
// [ 左 ]キーが押された場合
case "LEFT"
select.1 -= 1
if select.1 < 0 : select.1 = all_item-1
swbreak
// [ 右 ]キーが押された場合
case "RIGHT"
select.1 += 1
if select.1 > all_item-1 : select.1 = 0
swbreak
// [ 上 ]キーが押された場合
case "UP"
select.1 -= 2
if select.1 < 0 : select.1 = all_item-1
swbreak
// [ 下 ]キーが押された場合
case "DOWN"
select.1 += 2
if select.1 > all_item-1 : select.1 = 0
swbreak
// [ X ]キーが押された場合
case "X"
swbreak
swend
return
//================================================
// 特殊のウィンドウ
//================================================
*magic_window
return
//================================================
// アイテムの使用
//================================================
*use_item
// 使用可能なアイテムかどうか
if item. 0. select(1) != 2 {
item. 1. select(1) -= 1
// もしアイテムが無くなった場合の
// 並び替えルーチン
if item.1.select(1) = 0 {
// 並び替え始めのインデックス
c(1) = all_item - (select.1 + 1)
c(0) = select.1
// 並び替え
repeat c(1), select.1
if c(1) = cnt != all_item {
c(0) = cnt + 1
}
item.0.cnt = item.0.c(0)
item.1.cnt = item.1.c(0)
loop
// 選択項目が一番最後だった場合
// 選択項目の表示位置をずらす
if all_item-1 = select.1 && select.1 != 0 {
select.1 -= 1
}
// 所持アイテム種類を一つ減らす
all_item -= 1
// アイテムが全て無くなった場合
// メニューウィンドウに自動で戻る
if all_item = 0 {
press = "X"
}
}
}
return
//================================================
// アイテム取得
//================================================
#deffunc get_item int val0, int val1
have_item = 0// 所持アイテムかどうかのフラグ
//-----------------------------------
// 既に持っているタイプのアイテムか確認する
//-----------------------------------
repeat all_item
if item.0.cnt = val0 {
item.1.cnt += val1
have_item = 1// フラグON
break
}
loop
//-----------------------------------
// 持っていないアイテムのタイプだった場合
//-----------------------------------
if have_item = 0 {
item.0.all_item = val0
item.1.all_item = val1
all_item += 1
}
return
| ステップ4-4.3 実行結果 |
|---|
ソースコードが入力出来たら、F5キーを押してください
スクリーンショット1
s.jpg)
まずは最初の状態です。
スクリーンショット2
s.jpg)
確認の為、HP回復薬を使ってしまいます。
スクリーンショット3
s.jpg)
ここでCPUキャラに話しかけに行きます
そしてアイテムウィンドウを確認してみると・・・
スクリーンショット4
s.jpg)
見事にHP回復薬が増えていますね。
ちなみに何回でもこのアイテムを貰う事ができます。
アイテム取得のルーチンはいつでも呼び出せるように
マクロ形式にしておきました。こうすればイベント処理などを追加した場合に
即座に対応するのが可能になり、非常に便利です。
#deffunc get_item int val0, int val1
[ val0 ]で追加するアイテムのID(タイプ)を指定し
[ val1 ]で追加するアイテムの個数を指定します。
とはいっても、現在アイテムの種類は3つしかありませんが(==;)
次回のSTEPはアイテムの使用効果の実装(HPの回復など)
もしくは、装備ウィンドウの実装を計画しています。















