RPG製作講座
こちらのコンテンツはHSP3の基礎命令を覚えながら
HSP(3.0)でRPGを作ってみようという講座です。

HSP初心者の方や、RPGのソースコードを参考にしたい
という方におすすめです。
STEP.1-1
タイトルとウィンドウの変更
新しく扱う命令
  • screen命令
  • title命令
何をするのか?
  • screen命令でHSP3のウィンドウを表示させてみよう。
  • title命令でタイトルバーのタイトルを変更してみよう。
STEP.1-2
フォントサイズの変更とメッセージの表示
新しく扱う命令
  • font命令
  • mes命令
何をするのか?
  • font命令でフォントの設定を変更してみよう。
  • mes命令で画面に文字を表示してみよう。
STEP.1-3
繰り返し処理と描写先の変更
新しく扱う命令
  • repeat命令
  • loop命令
  • pos命令
何をするのか?
  • repeat命令で繰り返しの処理を命令してみよう。
  • loop命令でrepeat命令の終わりを宣言しよう。
  • pos命令で文字の描写先を指定してみよう。
STEP.1-4
キー入力と待ち時間
新しく扱う命令
  • stick命令
  • wait命令
何をするのか?
  • stick命令でキー入力を所得しよう。
  • wait命令でプログラムを一時中断してみよう。
STEP.1-5
塗りつぶしと色変更と再描写
新しく扱う命令
  • boxf命令
  • color命令」
  • redraw命令
何をするのか?
  • boxf命令で短径を描写してみよう。
  • color命令で色の指定をしてみよう。
  • redraw命令で描写モードを切り替えてみよう。
STEP.1-6
乱数発生と時間・日付の取得
新しく扱う命令
「RANDOMIZE命令」と「RND命令」と「GETTIME命令」

RANDOMIZE命令で乱数発生の準備をしよう。
RND命令で実際に乱数を発生させよう。
GETTIME命令で現在の時刻データを取得してみよう。
STEP.2-1
ラベルとサブルーチン
新しく扱う命令
「GOTO命令」と「GOSUB命令」と「RETURN命令」

GOTO命令で指定ラベルにジャンプしてみよう。
GOSUB命令でサブルーチンにジャンプしてみよう。
RETURN命令でサブルーチンから復帰してみよう。
STEP.2-2
配列変数と配列の要素
新しく扱う命令
「DIM命令」と「LENGTH命令」

DIM命令で配列変数を作成してみよう。
LENGTH命令で配列の要素を取得してみよう。
STEP.2-3
画像の読み込みと画像コピー
新しく扱う命令
「BUFFER命令」と「PICLOAD命令」
「GSEL命令」と「GCOPY命令」

BUFFER命令で仮想ウィンドウを作ってみよう。
PICLOAD命令で画像ファイルを読み込んでみよう。
GSEL命令で描写先ウィンドウを切り替えてみよう。
GCOPY命令で画像ファイルをコピーしてみよう。
STEP.2-4
画面のコピーモードと比較処理
新しく扱う命令
「GMODE命令」と「SWITCH命令」と「CASE命令」
「SWBREAK命令」と「SWEND」

GMODE命令でウィンドウのコピーモードの指定をしよう。
SWITCH命令で比較ブロックの開始を宣言しよう。
CASE命令で比較値の指定をしよう。
SWBREAK命令で比較実行の脱出をしてみよう。
SWEND命令で比較ブロックの終了を宣言しよう。
STEP.2-5
テキストデータの読み込みと割り当て
新しく扱う命令
「SDIM命令」と「NOTESEL命令」と「NOTELOAD命令」
「NOTEGET命令」と「GETSTR命令」と「STRSIZE命令」
「INT命令」

SDIM命令で文字列型の配列変数を作成してみよう。
NOTESEL命令で対象バッファを指定しよう。
NOTELOAD命令でバッファにテキストデータを読み込んでみよう。
NOTEGET命令でバッファの指定行を読み込んでみよう。
GETSTR命令でバッファから文字列を読み込んでみよう。
STRSIZE命令で読み出しバイト数を取得してみよう。
INT命令で文字列データを整数値に変換しよう。
STEP.2-6
キャラクターのアニメーションと終了選択
新しく扱う命令
「ONEXIT命令」と「DIALOG命令」

ONEXIT命令で終了時のラベルジャンプ指定を決めよう。
DIALOG命令でダイアログを表示してみよう。
SRPG製作
ただただ勢い任せに作ったSRPG(シミュレーションRPG)の
サンプル・ソースコードや実行ファイル等を公開しています。

ブログを始めるきっかけとなった作品です(随時更新)

HSPでRPG製作「STEP4-4. アイテムウィンドウの実装(3)」を公開しました。

HSPでRPG製作「STEP4-4. アイテムウィンドウの実装(3)」を公開しました。

ステップ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]はこちらを使います
sample

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

マップファイル[ 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 ソースコードの入力
メインソースコード[ step4-4 ]
//================================================
// 定数の定義
//================================================
#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
step4-4(0).JPG
まずは最初の状態です。

スクリーンショット2
step4-4(0).JPG
確認の為、HP回復薬を使ってしまいます。

スクリーンショット3
step4-4(2).JPG
ここでCPUキャラに話しかけに行きます
そしてアイテムウィンドウを確認してみると・・・

スクリーンショット4
step4-4(3).JPG
見事にHP回復薬が増えていますね。
ちなみに何回でもこのアイテムを貰う事ができます。

アイテム取得のルーチンはいつでも呼び出せるように
マクロ形式にしておきました。こうすればイベント処理などを追加した場合に
即座に対応するのが可能になり、非常に便利です。

#deffunc get_item int val0, int val1
[ val0 ]で追加するアイテムのID(タイプ)を指定し
[ val1 ]で追加するアイテムの個数を指定します。
とはいっても、現在アイテムの種類は3つしかありませんが(==;)

次回のSTEPはアイテムの使用効果の実装(HPの回復など)
もしくは、装備ウィンドウの実装を計画しています。



ブログパーツ

テーマ : ゲーム製作 関連
ジャンル : ゲーム

コメントの投稿

非公開コメント

カレンダー
10 | 2009/11 | 12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -



検索フォーム
プロフィール

Author:アクアブルブル
HSP, Java, Cなど幅広く勉強中!!
HSPは主にゲーム製作として使用しています。

RPG・SLG・ADGジャンル問わず何でもプレイ。何でも製作がモットーです。

ランキングに参加しています。
よろしければクリックおねがいします。


ブログジャンキーにも登録してます。


リンクもご自由にどうぞ。

こちらは掲示板入り口

RSSリンクの表示
リンク
広告


プログラム参考図書
JavaScript Game
Google ads
ユーザータグ

クォータービュー HSP SRPG MAP ゲーム RPG 講座 経営シミュレーション シナリオ フリーソフト HSPコンテスト データ構造 TonyuSystem JavaScript SLG ソース ミスティックシード Elona アルゴリズム ふりーむ A* TRPG