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ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

HSPでRPG製作「STEP3-4. CPUの移動処理」を公開しました。

HSPRPG製作「STEP3-4. CPUの移動処理」を公開しました。

ステップ3-4.0 CPUの移動処理

STEP3-4では、CPUキャラクターの移動処理を追加します。
それにともない、プレイヤーキャラクターの使用している変数などを
大幅に変更してあります、ご了承ください。

CPUキャラ処理の全体的な流れとしては
 1.CPUのイメージ描写
 2.現在、自分(CPU)は移動中なのか判断する
 3.移動中でなければ、1/32の確立で移動を開始、ランダムで移動方向も決定
 4.移動後の座標値を取得しておく
 5.移動後の座標に、壁があるか確認する
 6.移動後の座標に、他のCPUキャラがいないか確認する
 7.移動後の座標に、プレイヤーキャラがいないか確認する
 8.移動可能ならば移動フラグをONにする

ステップ3-4.1 使用するファイル一覧

・sample.bmp
・chr.bmp
・map.txt

※bmpファイルがアップロード出来ないので、pngファイル形式になっています
 PNGを一旦保存してから、BMPファイルに変換して頂くか
 後に記載されているURLから[ step3-4.zip ]をダウンロードしてください


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

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

マップファイル[ map.txt ]はこちらを使います
http://blog-imgs-26.fc2.com/p/o/k/pokopokogame/map.txt

以上の3つのファイルを保存して
ソースコードのあるフォルダと同じ場所に移動してください。

ソースコードと画像のまとまったファイルはこちらです。(87.4 KB)
http://pokpokgame.huuryuu.com/rpgmake/step3-4.zip

ステップ3-4.2 ソースコードの入力
//================================================
// 定数の定義
//================================================
#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 "step3-4"

buffer 1 : picload "sample.bmp"
buffer 2 : picload "chr.bmp"
gsel 0
font "", 20

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// キャラクターの向いている方向を保持する変数

//================================================
// 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_id c // CPUのインデックス用マクロ

// cpuの座標をランダムで決定する
// 壁にのめりこまない用x、yともに0と19は避ける
repeat cpu_max
c = cnt
cpu_x = rnd(18) + 1
cpu_y = rnd(18) + 1
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
}
swbreak
case 1
pos my_x * Chip_size, my_y * Chip_size + my_anime
if my_anime = 0 {
move = 0
}
swbreak
case 2
pos my_x * Chip_size - my_anime, my_y * Chip_size
if my_anime = 0 {
move = 0
}
swbreak
case 3
pos my_x * Chip_size, my_y * Chip_size - my_anime
if my_anime = 0 {
move = 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
}

// [ 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
}
}
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を代入
}
loop
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
}

gcopy 2, Chip_size*cpu_node, Chip_size*(anime/4), 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
dialog "このままゲームを終了しますか?", 2, "選択ダイアログ"
if stat = 6 : end // 「はい」が押された場合
if stat = 7 : goto *main// 「いいえ」が押された場合

ステップ3-4.3 実行結果

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

このように表示されましたか?出来ていればOKです
Nstep3-4.JPG
CPUキャラが動き回ります。
CPUキャラ用の画像を用意していないので、プレイヤーキャラと見分けがつきません(==;)

なお、以前までプレイヤーキャラの座標変数は[ cx, cy ]でしたが
分かりにくいので[ my_x, my_y ]に変更しましたm(_ _)m
スポンサーサイト

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

tag : HSP ソース 講座 RPG

コメントの投稿

非公開コメント

カテゴリ
検索フォーム
カレンダー
12 | 2019/01 | 02
- - 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を使ってゲームを製作しています。

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


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


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

こちらは掲示板入り口

ユーザータグ

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

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


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



更新確認ツール

FC2カウンタ



googleボットチェッカー

Googleボットチェッカー

msnボットチェッカー

MSNボットチェッカー



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