ここまでの冒険を記録しますか?

長岡技大ソフトウェア開発サークルの開発ブログ

【ゲーム製作入門】C/C++で簡単なRPGを作る⑪(後)【DXライブラリ】

書き手:肥田野

DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。

RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。

この連載は前回までの内容を理解していることを前提に進めていきます。

イベントの実装までにかなりの時間を要してしまいましたが、今回でいよいよプレイヤーキャラが任意でイベントを起動できるようになります。

さっそくPlayerクラスにイベント起動用の関数を実装したいのですが、その前にRPGによく使われるイベントについて考えてみましょう。

今回のようなメッセージは基本中の基本ですが、他にも大事な要素がありますね。「村人」です。

誰もいない世界を冒険するのは寂しいですし(そういうゲームもありますが)、ゲームを進めるうえでの情報源も立札だけでは無機的で面白くありませんね。

今回は村人の実装は行いませんが、その準備だけはしておきましょう。

具体的には、「Playerクラス」を「Charaクラス→Playerクラス」の親子構造にするのです。

キャラクターの動きはCharaクラスで定義して、今回のイベントを起動させる等プレイヤーキャラにしか使わない要素はPlayerクラスにまとめます。

そうすれば、あとでCharaクラスからMurabitoクラスを派生させられますね。

というわけでPlayer.hから見ていきましょう。

続きを読む

【ゲーム製作入門】C/C++で簡単なRPGを作る⑪(中)【DXライブラリ】

書き手:肥田野

DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。

RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。

この連載は前回までの内容を理解していることを前提に進めていきます。

第10回ではテストとしてメッセージボックスをControlクラスで実体化させていました(前回のコードではこっそり消してあります)が、今後色々なイベントを追加していくにあたって、一々コードに書き加えていては膨大になりますし、パッと見ても分かりにくいですね。

そこで、どの座標にどんなイベントがあるのか、その他必要な情報(メッセージボックスの場合は読み取るテキストファイルのアドレス)をまとめて表にすれば、管理もしやすくなるでしょう。

そう、またCSVファイルの登場です。

マップの管理でトラウマを抱いた方もいるかもしれませんが、あそこで一度辛い経験をしたなら、今回は案外楽に感じるかもしれませんよ。

続きを読む

【ゲーム製作入門】C/C++で簡単なRPGを作る⑪(前)【DXライブラリ】

書き手:肥田野

DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。

RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。

この連載は前回までの内容を理解していることを前提に進めていきます。

前回メッセージウィンドウのテスト表示をしたので、今回からはいよいよイベントとしてマップに実装していきます。

……が、その前に。

段々ヘッダファイルが増えてきてプロジェクトが混沌としてきましたね。

冒頭に「#pragama once」を付けているとは言え、色々なクラスが他のクラスを参照するので、インクルードの順番やヘッダファイル同士の関係性が分かりにくくなってきました。

というか私がエラーを頻発させて頭を抱えていたので、OBの方の知恵をお借りして、プロジェクト全体を整理したいと思います。

その上でイベントの実装をしたいので、今回の項目は前後編に分けました。

前編はファイルの整理に絞って解説します。

※おことわり(15.06.20追記)

当記事執筆時に気が付かなかった不具合(カメラが動かない)が確認できたので、第11.5回で修正方法を解説しています。

記事の通りに編集しても問題なくコンパイルできると思いますが、正常な動作はできなくなっています。

当連載を11.5回まで読み進めれば、不具合は修正されますのでご了承ください。

続きを読む

【ゲーム製作入門】C/C++で簡単なRPGを作る⑩【DXライブラリ】

書き手:肥田野

DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。

RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。

この連載は前回までの内容を理解していることを前提に進めていきます。

前回はウィンドウのクラスを定義したので、今回はそれを拡張して、メッセージウィンドウのクラスを定義します。

このブログではこれまで扱ってきませんでしたが、クラスのとても便利な(最もと言っても過言ではない)機能に、「継承」というものがあります。

あるクラス(今回はWakuクラス)を基底クラスとし、派生クラス(これから作るMessageWindowクラス)を作ることができます。

派生クラスは基底クラスの機能をそのまま継承しているので、今回の場合はMessageWindowクラスで新たに座標や枠のサイズを定義しなおす必要はありません。

まずはコードを見てみましょう。

続きを読む

【ゲーム製作入門】C/C++で簡単なRPGを作る⑨【DXライブラリ】

書き手:肥田野

DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。

RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。

この連載は前回までの内容を理解していることを前提に進めていきます。

今回は、今後必要になってくるウィンドウの表示と、CheckHitKeyによって長押しを防ぐ処理について解説します。

特にウィンドウ回りの構成は今後どう転んでもついて回ってくるので、私もかなり頭を抱えて作りました(^_^;)

それではソースコードを見ていきましょう。

続きを読む

【ゲーム製作入門】C/C++で簡単なRPGを作る⑧【DXライブラリ】

書き手:肥田野

DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。

RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。

この連載は前回までの内容を理解していることを前提に進めていきます。

今回はウィンドウサイズを超えたマップの扱い方について解説します。

建物の中やワンフロアのダンジョンなどではこれまでの1画面のマップで事足りるのですが、やはりそれより広いサイズのマップも扱いたいですよね。

とはいえあまり広すぎるとcsvファイルの編集作業が大変なことになってしまうので、前回までより少し、縦横5マス分だけ拡張しました。実際には何マスでも拡張できますよ。

さて、マップを拡張するためには、csvファイルのデータの追加はもちろんですが、その他にもやらなければいけない大事な作業が生まれます。

それはカメラの移動です。主人公がウィンドウからはみ出ないように、カメラが追いかけなくてはいけません。

しかしこれまでカメラという概念は全く考えてきませんでしたよね。画像もただ座標を指定して描画していましたし。

それなら描画関数に指定する座標を操作して、あたかもカメラで追いかけているかのように描画しようというのが今回の発想です。

そのために新しいヘッダファイルを用意して、CameraDrawという関数を作成しました。

≪Function.h≫

#pragma once
#include<DxLib.h>

int viewX = 0;
int viewY = 0;

void CameraDraw(int x1,int y1,int x2,int y2,int gh,int trans){
    DrawExtendGraph(x1-viewX,y1-viewY,x2-viewX,y2-viewY,gh,trans);
}

viewXとviewYはグローバル変数です。

CameraDrawの中身はほとんどDrawExtendGraphそのままですが、座標からviewXとviewYを差し引いているのがミソです。

プレイヤーが移動するなどしてカメラを動かさなければいけない場合は、viewXとviewYをずらしてやります。

そして、プロジェクト内のマップ表示に関するすべてのDrawExtendGraphをCameraDrawに置き換えてやれば、引数の順番などはそのままなのですぐ使えるようになります。

ちなみに、Ctrl+Hキーで「検索と置換」をすることができます。これでドキュメントの中からDrawExtendGraphを全てCameraDrawに置き換えてやれば楽ちんですよ。

≪Map.h≫

#pragma once

#include<DxLib.h>
#include"Function.h"

#define CELL_WIDTH 40
#define CELL_HEIGHT 40
#define CELL_NUM_X 21
#define CELL_NUM_Y 17
#define WINDOW_Y 480
#define WINDOW_X 640

struct Cell{
    int gh;
    bool canwalk;
    int drawMode;//0:プレイヤーより奥 1:プレイヤーより手前
};

class Map{
public:
    Cell cell[CELL_NUM_X][CELL_NUM_Y];
    int chipgh[(128/16)*(1248/16)];
    int width,height;

    Map(char* add){
        LoadDivGraph("BaseChip.png",(128/16)*(1248/16),128/16,1248/16,16,16,chipgh);
        
        FILE* fp;//ファイルのポインタを宣言
        fp = fopen(add,"r");//fpを読み取り形式で開く
        if(fp == NULL){
            DebugBreak();
        }
        int c;//文字を格納する
        int retu = 0;
        int gyou = 0;
        char buf[10];//文字列を格納する
        memset(buf,0,sizeof(buf));
        bool eofFlag = false;
        while(1){
            while(1){
                c = fgetc(fp);
                if(c == EOF){
                    eofFlag = true;
                    break;
                }
                if(c != ','){//「,」が出てくるまで読み進める
                    strcat(buf,(const char*)&c);
                }else{
                    int num = atoi(buf);
                    cell[retu][gyou].gh = chipgh[num];
                    memset(buf,0,sizeof(buf));
                    break;
                }
            }
            if(eofFlag)break;
            while(1){
                c = fgetc(fp);
                if(c != ','){
                    strcat(buf,(const char*)&c);
                }else{
                    int num = atoi(buf);
                    cell[retu][gyou].canwalk = num;
                    memset(buf,0,sizeof(buf));
                    break;
                }
            }
            while(1){
                c = fgetc(fp);
                if(c != ';' && c != '\n'){
                    strcat(buf,(const char*)&c);
                }else{
                    int num = atoi(buf);
                    cell[retu][gyou].drawMode = num;
                    memset(buf,0,sizeof(buf));
                    break;
                }
            }
            //1セル分のループを抜けたら
            if(c == ';'){
                retu++;
            }
            if(c == '\n'){//改行だったら行を増やす
                gyou++;
                if(retu*CELL_WIDTH>width)width = retu*CELL_WIDTH;
                retu = 0;
            }
        }
        height = gyou*CELL_HEIGHT;
        fclose(fp);
    }

    void FrontView(){
        for(int i=0;i<CELL_NUM_X;i++){
            for(int j=0;j<CELL_NUM_Y;j++){
                if(cell[i][j].drawMode == 1)CameraDraw(i*CELL_WIDTH,j*CELL_HEIGHT,(i+1)*CELL_WIDTH,(j+1)*CELL_HEIGHT,cell[i][j].gh,TRUE);
            }           
        }
    }

    void BackView(){
        for(int i=0;i<CELL_NUM_X;i++){
            for(int j=0;j<CELL_NUM_Y;j++){
                if(cell[i][j].drawMode == 0)CameraDraw(i*CELL_WIDTH,j*CELL_HEIGHT,(i+1)*CELL_WIDTH,(j+1)*CELL_HEIGHT,cell[i][j].gh,TRUE);
            }           
        }
    }

    void All(){

    }
};

ほとんど変更点はありませんが、マップのサイズが変わったのでCELL_NUM_XとCELL_NUM_Yの値を変更し、ついでにマップ全体のサイズをwidthとheightという変数に保存しました。

この二つはControl.hで使います。

≪Control.h≫

#pragma once
#include<DxLib.h>
#include"Map.h"
#include"Player.h"

class Control{
public:
    Player* pl;
    Map* map[3];
    int camX,camY;

    Control(){
        camX = camY = 0;
        pl = new Player();
        map[0] = new Map("flame1.csv");
        map[1] = new Map("flame2.csv");
        map[2] = new Map("flame3.csv");
        pl->x = pl->targetX = CELL_WIDTH;
        pl->y = pl->targetY = CELL_HEIGHT;
    }

    ~Control(){
        delete pl;
        for(int i=0;i<3;i++){
            delete map[i];
        }
    }

    void All(){
        if(pl->x>WINDOW_X/2 && pl->x<map[0]->width-WINDOW_X/2+CELL_WIDTH){
            viewX = pl->x-WINDOW_X/2;
        }
        if(pl->y>WINDOW_Y/2 && pl->y<map[0]->height-WINDOW_Y/2){
            viewY = pl->y-WINDOW_Y/2;
        }

        for(int i=0;i<3;i++)map[i]->BackView();
        pl->All(map);
        for(int i=0;i<3;i++)map[i]->FrontView();
    }
};

All関数に注目してください。

ちょっと分かりにくい式ですが、プレイヤーがカメラを動かす必要がある座標にいるときだけ、viewXやviewYを動かしています。

マップの端まで来たときに真っ黒い画面が見えては興醒めなので、ちょうどマップの端がウィンドウの端で止まるように調整しています。

この式にはいくつも変数が使われて混乱しそうになりますが、落ち着いてじっくり読めば、どう動いているのかが分かるかと思います。

何しろ私も、この式に至るまで丸1日頭を抱え続けたので……(^_^;)

それと、使っているチップ画像が違えば全く役に立たないのですが、こちらで使っていたcsvの中身はこちらになります ≪flame1.csv

2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0
2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0;2,1,0

≪flame2.csv

88,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;89,0,0;90,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;33,1,1;34,1,1;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;41,0,0;42,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;33,1,1;34,1,1;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;41,0,0;42,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;33,1,1;34,1,1;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;41,0,0;42,0,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;33,1,1;34,1,1;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;41,0,0;42,0,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
96,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;98,0,0
104,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;105,0,0;106,0,0

≪flame3.csv

62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;83,0,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0
62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0;62,1,0

Exelで開く場合は、メモ帳などで先に「;」と「,」を入れ替えてから使ってくださいね。

この時もCtrl+Hが使えますよ。

さて、上手く広いマップを動き回れたでしょうか。

段々できることが広がっていく楽しさは、RPGそのものにも通じるところがありますね。

ゲームとは、作る段階から始まっているのかもしれません。

次回もノープランなので、実現できそうな要素から実装してみたいと思います。

【ゲーム製作入門】C/C++で簡単なRPGを作る⑦【DXライブラリ】

書き手:肥田野

DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。

RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。

この連載は前回までの内容を理解していることを前提に進めていきます。

今回はこれまでに解説したことを応用して、マップを3レイヤーから合成してみます。

続きを読む