FC2ブログ
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)の
サンプル・ソースコードや実行ファイル等を公開しています。

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

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

胃腸の調子が最悪です…

胃腸の調子が最悪です…
食欲・体重がドンドン落ちてビックリしてます
不摂生な食生活は駄目ですね。
まだ症状が軽いので、気をつけて生活する事にします。

しかし冬場になると行動力が落ちるせいか
出かけなくなる→お腹が空かない→食事回数減る
結果、夏よりも体重が落ちるんです。
自分はかなり異端な人間じゃないかという疑問が浮かびます。

最近まともに三食食べた記憶がないので
気力低下もこれが原因にあるのかもしれません。
先週の土曜日などはフラフラ状態で講義受けてました
何も食べていないのに吐き気が凄くて大変でしたね…
この若さでこの有様…先が思いやられます(==;;)

ここまで超駄文ですが、皆様も体調には気をつけてくださいm(_ _)m
スポンサーサイト

ブラウザの違い

ブラウザの違いがかなりあることに気付きました。

ふとインターネットエクスプローラーでこのブログを表示してみたんですが
ちょくちょくと表示内容に違いがあるんですね。

自分はファイヤーフォックスを使っているので、この環境下でしか
ブログの動作確認をしていなかったのですが
もし違うブラウザを使うと、CSSなどの動作にも違い発生するのか気になって
本日IE7で確認してみたんですが、嫌な予感は的中しました・・・
ブラウザごとに表示内容が変わるんですね。

今の今まで気付かなかったんですが
このブログはブラウザ・ファイヤーフォックスでjavascriptをONの状態を推奨します

JavaScriptが動きません…

この様な感じのJavaScriptを使用してトップ画像を曜日毎に変化させようと
思っていたのですが、何故かJavaScriptが動きません…


<script language="JavaScript"><!--
    he = new Date();
    nad2 = he.getDay();
    document.write("<div align='left'>"); 
    document.write("<img src='http://pokpokgame.huuryuu.com/day2_files/" + nad2 + ".JPG'>");
    document.write("</div>");
// --></script>


HTMLエディターで確認すると、普通に動作するのですが
何が原因なのでしょうか?
もしこれを今日中に設置出来ないと数時間無駄にした事になります
それだけは勘弁ですね(--;)

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

またまたTOP画像改良中です。

少しばかりTOP画像が寂しい気がするので、またまたTOP画像改良中です。
そんな事ばかりに力を注いでいないで、HSPのプログラムUPしろって感じですね。

まったくもってその通りなのですが
見栄えが良いサイトってそれだけで面白さを感じてしまうと思いませんか?

コンテンツの内容も十分大切なんですが、それをいかに表現するかというところで
そのサイトが訪問者に与える興味に大きく差が出ると思うんです。

さてさて、グダグダと屁理屈を並べつつも更新作業に戻りたいと思います。

RSSを利用しようと思います。

HSP関連のブログを中心に集めたRSSを利用した
記事一覧を設置しようと考えています。

ニュース系サイト(ブログ)などにトップに置いてあるアレのことです。
沢山あるブログの新着情報が一目で分かって非常に便利ですよね。

よくよく考えれば、HSPのブログなどもああいう風に
相互で記事を共有しあえば、知識や読者も共有できるので
お互いにとっても非常に有意義な事だと思います。

HSPを扱っているブログを探し回ってどんどん追加していきたいと
思っているので、しばらくはこの作業に集中したいと思います。

※HSPのホームページ・ブログ等をお持ちでRSSを導入していない方は
これを機にRSSを導入してみてはいかがでしょうか?

アクセスアップは勿論の事
相互リンク等の煩わしさを改善できると自分は考えています。

トラックバックも便利ですがRSSは一度登録しておけば
自動的にお気に入りのデータを取得してくれるので手間いらずで役立ちます。

ついにユニークアクセスが100を越えました

ついにユニークアクセスが100を越えました
嬉しい限りのことですm(_ _)m

他にもHSP関連のサイトを開設されている方は沢山いるのに
こちらのサイトに毎度足を運んでいる方に感謝します。

まだまだ中身がスカスカのサイト(ブログ)ですが
コンテンツの増加と手直しを更に力を入れていきたいと思います。

最近美しいサイトデザインについて考えているので
HSPのプログラム更新作業が全く進みません。
CSSも大分使いこなせるようになったと思っていたのですが
まだまだ自分が表現したいものを楽々と構築できない日々です。

HSPコンテストに応募されている作品を全部プレイしてみたいのですが
時間と気力が足りません。情けない(--;)
自分の作品も修正して完成させなきゃいけませんね。

CSSとJavaScriptを使ってサイト変更中です。

またまた、CSSとJavaScriptを使ってサイト変更中です。
コンテンツの内容をさらに分かり易くするため
マウスオーバー毎に、コンテンツの詳細が表示される
CSSとJavaScriptを埋め込んでいます。

これがなかなか大変な作業です。
サイトデザインの更新もそうですが、最近更新作業が遅いです
気をつけねばいけませんね(--)

簡易バトルシミュレータを公開します。

育成シミュレーション用に組み込もうと思っていた
簡易バトルシミュレータを公開します。

セカンドールマスターの様なフリーソフトを作ろうと
以前考えていたことがあり、その戦闘部分を手直ししたものが
こちらのソースコードです。

構想としては武道大会のような形式で戦っていき
優勝者を決め、賞金などが支払われるといったものを作りたいです。
現在は開発を中止しているので、とりあえずUPしてみます。

被ダメージ部分の計算は
攻撃力と防御力と運の3つの要素で決定します

実行ファイルとソースコードはこちら(83.0 KB)
http://pokpokgame.huuryuu.com/soft/Battle05.zip

※余分なソースコードも残っていますが
 動作には全く関係無いので、見なかった事にしてください(==;)
	;--------------------------
; 簡易バトルシミュレーターから派生
title "簡易バトルシミュレーター"
;-------------------------
randomize
font "", 10

;====================================
; モジュール定義
;====================================
#module
#deffunc cbox int x0, int y0, int x1, int y1
color 255,255,255
boxf x0, y0, x1, y1
color
return

#deffunc step
redraw 1
repeat
wait 3
stick key
if key=256 : break
loop
return
#global
;====================================

;--------------------------
; ステータスデータの変数確保
;--------------------------
; fri 仲間の数
; lv レベル
; exp 経験値
; hp ヒットポイント
; mhp max_hp
; mp
; mmp max_mp
#const fri 20
dim pr, fri
#define lv pr. c. 0
#define exp pr. c. 1
#define hp pr. c. 2
#define mhp pr. c. 3
#define mp pr. c. 4
#define mmp pr. c. 5
#define pow pr. c. 6
#define dex pr. c. 7
#define spd pr. c. 8
#define mgc pr. c. 9
#define atk pr. c. 10
#define hit pr. c. 11
#define cri pr. c. 12
#define grd pr. c. 13
#define esp pr. c. 14
#define act pr. c. 15
#define age pr. c. 16

;--------------------------
; 名前の決定(未実装)
;--------------------------
//sdim name
//notesel name
//noteload "name.dat"

;--------------------------
; ランダムでパラメータを割り振っていく
; 3つのタイプを用意する
;--------------------------
repeat fri
c = cnt
repeat 10
switch cnt
case 0 : lv = 0 : swbreak
case 1 : exp = 0 :swbreak
case 2 : mhp = 30+rnd(5) : swbreak
case 3 : hp = mhp : swbreak
case 4 : mmp = 30+rnd(5) : swbreak
case 5 : mp = mmp : swbreak
case 6 : pr. c. cnt = rnd(10) + 5 : swbreak
case 7 : pr. c. cnt = rnd(10) + 5 : swbreak
case 8 : pr. c. cnt = rnd(10) + 5 : swbreak
case 9 : pr. c. cnt = rnd(10) + 5 : swbreak
swend
loop
loop


;--------------------------
; 装備品(未実装)
wep = 10, 80; ソード
prt = 14, 3
;--------------------------

repeat fri
c = cnt
repeat 4
pr. c. 10 = pow / 2 + wep.0
pr. c. 11 = 10 + wep.1
pr. c. 12 = 0
pr. c. 13 = dex / 4 + prt.0
pr. c. 14 = 10 + prt.1
loop
loop
;--------------------------

;==========================
; 仲間のパロメータ表示
;==========================
repeat fri
c = cnt
repeat 15
pos cnt*30 + 20, c*12 + 30
mes ""+pr. c. cnt+""
loop
loop
;==========================

fact = "Lv","Exp","HP","MHP","MP","MMP","POW","DEX","SPD","MGC","ATK","HIT","CRI","GRD"
foreach fact
pos cnt*30 + 20, 10
mes ""+fact.cnt+""
loop

pos 550,10 : button "Battle",*battle


///////////////////////////
; 敵さん用意
///////////////////////////
dim ene, 4
ene.0 = 100
ene.1 = 100
ene.2 = 0
color 255, 255, 255
///////////////////////////
stop


*battle
redraw 0
wait 5

;--------------------------
; 画面クリア
color 255,255,255
boxf
color 0, 0, 0
;--------------------------

;--------------------------
; 格パラメータのインデックス表示
foreach fact
pos cnt*30 + 20, 10
mes ""+fact.cnt+""
loop
;--------------------------


;==========================
; 仲間のパロメータ表示
;==========================
repeat fri
c = cnt

repeat 15
pos cnt*30 + 20, c*12 + 30
mes ""+pr. c. cnt+""
loop

// 死亡者は飛ばす
if hp <= 0 : continue

switch cnt
case 0 : c.1 = 0 : c.2 = 0 : swbreak
case 1 : c.1 = 0 : c.2 = 1 : swbreak
case 2 : c.1 = 0 : c.2 = 2 : swbreak
case 3 : c.1 = 1 : c.2 = 0 : swbreak
case 4 : c.1 = 1 : c.2 = 1 : swbreak
case 5 : c.1 = 1 : c.2 = 2 : swbreak
case 6 : c.1 = 2 : c.2 = 0 : swbreak
case 7 : c.1 = 2 : c.2 = 1 : swbreak
case 8 : c.1 = 2 : c.2 = 2 : swbreak
swend

loop
;==========================

redraw 1

c.1 = 0
c.3 = 1// 試合
turn = 0
goto *event
goto *battle


*event
// 対戦相手
c.2 = c.1 + 1

repeat
redraw 0
color 255, 255, 255
boxf 10, 300, 400, 480
color 0, 0, 0
wait 20

// 攻撃ターンの切り替え
if c.0 = c.2 {
c.0 = c.1
} else {
c.0 = c.2
turn++
}

// ターン数計測
pos 10,300
mes "第 "+c.3+" 戦 ターン"+turn+""

//--------------------------------
// HPの表示
//--------------------------------
// 対戦者
c = c.1
pos 10, 320
mes "キャラ"+c+"のターン HP "+hp+" / "+mhp+""
// 挑戦者
c = c.2
pos 200, 320
mes "キャラ"+c+"のターン HP "+hp+" / "+mhp+""

//--------------------------------
// 行動可能までターンを貯める
//--------------------------------
c = c.1 : turn.1 += spd
c = c.2 : turn.2 += spd

//--------------------------------
// 攻撃
//--------------------------------
repeat 2, 1

// 攻撃ターンの切り替え
if c.0 = c.2 {
c.0 = c.1
} else {
c.0 = c.2
}

//--------------------------------
// ターンの描写
//--------------------------------
if cnt = 2 : a = 200 : else : a = 0
boxf 10+a, 340, turn.cnt+a, 350
pos 10+a, 360

if turn.cnt >= 100 {
redraw 1

a = rnd(3)
switch a
case 0
mes "攻撃ミス"
a.3 = 0
swbreak
case 1
mes "通常攻撃"
a.3 = 1
swbreak
case 2
mes "クリティカル"
a.3 = 2
swbreak
swend
wait 30

// ダメージ計算
a.2 = rnd(3)+1 * a.3
if c = c.1 {
a.1 = pow + a.2
c = c.2
a.1 -= dex
if a.1 < 0 : a.1 = 0 // ダメージ0の場合
hp -= a.1 + 1
if hp < 0 : hp = 0
} else {
a.1 = pow + a.2
c = c.1
a.1 -= dex
if a.1 < 0 : a.1 = 0 // ダメージ0の場合
hp -= a.1 + 1
if hp < 0 : hp = 0
}

// メッセージ表示
if c = c.1 {
mes "キャラ"+c.1+"に"+a.1+"のダメージ"
} else {
mes "キャラ"+c.2+"に"+a.1+"のダメージ"
}
wait 30

// 残りHP表示
mes "HP "+hp+" / "+mhp+""
wait 40

// 負け判定
if hp <= 0 {
font "", 18
mes ""+c+"の負け"
redraw 1
wait 100
font "", 10
go_next = 1
}

turn.cnt = 0
}
loop
redraw 1

if go_next = 1 {
go_next = 0
break
}
loop

// 次の対戦へ
turn = 0
c.3++
if c.1 < fri-2 : c.1+2 : else : stop

goto *event


スクリーンショット1
bs01.JPG

20人のキャラクターを作成し、ランダムでパラメーターを決めています。
一対一の戦闘方式になっており、[ Battle ]ボタンを押すと戦闘が始まります。
ちなみに、全キャラクターが戦い終わるまでただ見ているだけです。

育成パートも作成していたのですが、気力が底をついたみたいなので
完成形に近づいた時にでも公開しようかとおもいます。

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

tag : HSP ソース

都市を道路で繋ぎ、ひたすら発展させるSLG「都市網」

今回ご紹介するフリーソフト
都市を道路で繋ぎ、ひたすら発展させるSLG「都市網」です。

起動画面
city1.JPG
「cityweb.exe」をダブルクリックして都市網を起動させます。
画面には何も表示されていません


次に「ファイル」をクリックして「新規作成」を選びます。
マップファイルの読み込み(bmpファイル)を選択する小窓が表示されます
city2.JPG
今回は「japan.bmp」を選ぶ事にします。


日本の地図が読み込まれました
city3.JPG


次に「スタート」をクリックしてゲームを開始します。
ここで「ツール」をクリックして「都市建設」を選択します
city4.JPG

都市の建設には1000$必要みたいです。
city5.JPG
「はい」をクリックします。


この作業を2回繰り返し「都市」を2つ建設しました。
city6.JPG

都市1をダブルクリックしてみましょう、都市の情報を見る事ができます。
city7.JPG
人口はかなり少ないですね。人口増加率がマイナスに傾いています…


さて都市と都市を道路で結ぶ作業にはいります。
先程の都市情報画面もしくは「ツール」から「道路建設」をクリックします
都市1と都市2を結びたいので、まず都市1をクリックします。

次に敷設先の都市を選択します、今度は都市2をクリックします。
city8.JPG


どうやら道路の建設にもお金が掛かるようです。
city9.JPG
ここも「はい」をクリック
道路は長ければ長いほど、維持費・建設費が高くなるので注意が必要です。


city10.JPG
無事2都市間に道路が建設されました。
うまくいけばこの後に、2都市の間で交流が始まり
人口が増えていき、それに伴い都市も成長していきます。


こちらはかなり時間が経った後の都市網です。
city11.JPG

かなり大きな都市やまだまだ小さな都市などが多数存在しています。
このゲームのミソは、大きな都市からの道路を
1都市あたり最大「5本」以内で、どれだけ互いに繋ぐ事が出来るかを
考え、発展させていくというところです。

一度利益が上がり始めると、もっと都市と道路を増築したくなってしまい
ひたすら熱中して「首都級都市」の完成を試みるようになります。
ハマれば辞められないほど面白いので是非プレイしてみてください。

作者様のホームページ
暇つぶし研究所


ダウンロード
http://www.vector.co.jp/soft/dl/win95/game/se163291.html
リンク確認 09/12/11

テーマ : ゲーム
ジャンル : ゲーム

tag : フリーソフト SLG ゲーム

HSPと関係の無い記事…

HSPと関係の無い記事で流れ着いた方
申し訳ありませんm(_ _)m
「まほでんわーるど」の攻略は特にしていませんのであしからず。

いやしかし、凄いですね新作フリーソフトの簡単なレビューを
載せただけなのですがHSP関連の記事検索と同じ位に
アクセス数があります。

フリーソフトレビューだけでもこのブログは成り立つのでは?など
嫌な考えが頭をよぎります(実際そうかもしれません)。

これを機に、すこし反省して
次からはフリーソフトレビューを丁寧に行う事にします。
作者様がこのブログに辿り着く可能性もあるんですからね。

ちなみに話は変わりますが
「まほでんわーるど」のオススメパーティー編成は
"ローグ",”ローグ”,”ローグ”
”ハイプリースト”,”エレメント”,”エレメント”
です。

高速でダンジョンを上って行き、報酬アイテムもシッカリと稼ぎ
尚且つ全滅を逃れるような構成は、個人的にこれがおすすめです。

さらにエレメントに、値の張る杖全般&アクセサリ&弓矢を装備させ
IQだけを恐ろしいほど特化させます。

すると戦闘中は各属性の魔法(横一列)をバンバン撃ってくれるので
非常に助かります。ドラゴンに進化させても良いのですが
攻撃対象が1人になってしまうので、あまりおすすめできません。

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
リンク修正 09/12/11

ステップ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の回復など)
もしくは、装備ウィンドウの実装を計画しています。

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

更新内容が無い一日でした…

更新内容が無い一日でした…
言い訳としては、UPしようとしていたRPG製作STEP4-4が
バグだらけで公開できません

それ以前にアイテム関連を扱うソースコードを別のファイルとして
扱うように色々と移植作業を行っていたのですが
思ったように動かないです(--;)

最近疲れているのか更新作業があまり進みません
しかも、作業用ノートPCの↓キーが反応してくれないという始末です。

新しいノートPCの買い時なんですかね?
デスクトップは自作で作れるのですが
ノートPCは流石に自作できませんからね、困りました。

仕方ないので、価格comで良い感じのノートPCを探すことにします。

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

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

ステップ4-3.0 アイテムウィンドウの実装(2)

STEP4-2に引き続き、STEP4-3ではアイテムウィンドウの実装を
掲載していきます。

STEP4-3では表示されたアイテムを選択し、スペースボタンを押す事により
使用可能なアイテムは一つ消費されます。
また、所持数が0個になったアイテムはアイテムウィンドウから
表示されなくなります。
装備するアイテムは灰色で表示されるようになっていて
スペースボタンを押しても使用出来ないようになっています。

ステップ4-3.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-3.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.6 KB)
http://pokpokgame.huuryuu.com/rpgmake/step4-3.zip

ステップ4-3.2 ソースコードの入力
メインソースコード[ step4-3 ]
//================================================
// 定数の定義
//================================================
#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-3"

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 = 10// 所持アイテム総数
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 = rnd(3)
item_have = rnd(5) +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
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"
// 使用可能なアイテムかどうか
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"
}
}
}

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

ステップ4-3.3 実行結果

ソースコードが入力出来たら、F5キーを押してください

このように表示されましたか?出来ていればOKです
スクリーンショット1
step4-3(1).JPG
STEP4-2で作成したアイテムウィンドウです。
使用不可のアイテム(装備品)は灰色で表示されています。

スクリーンショット2
step4-3(2).JPG
選択しているアイテムを全部使用して、所持数を0にすると
所持アイテム全体が整頓されるようになっています。

次回はアイテムの入手処理とアイテムウィンドウの実装(3)を掲載予定です。
これで大まかなアイテム処理を実装できたと思います。

しかし、この講座(?)は見ている方がいるのか心配になって来ました。
変数の解説、図の挿入などは最終的に予定していますが
講座と銘打っている以上、早い段階からそれらのレイアウトなんかも考えた方が
良いのかもしれません。

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

tag : HSP ソース 講座 RPG

カテゴリ
検索フォーム
カレンダー
11 | 2008/12 | 01
- 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 31 - - -



月別アーカイブ
リンク
RSSリンクの表示
プロフィール

アクアブルブル

Author:アクアブルブル
HSPを使ってゲームを製作しています。

ランキングに参加しています。


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


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

こちらは掲示板入り口

ユーザータグ

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

最新コメント
フリーソフトで面白いゲーム まとめサイト
スポンサードリンク


アフィリエイトのリンクシェアで、チャリティ活動

更新確認ツール

FC2カウンタ



googleボットチェッカー

Googleボットチェッカー

msnボットチェッカー

MSNボットチェッカー



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。