Re: マップデータをファイルから読み込むには ( No.2 ) |
- 名前:ジュンヤ 日時:2013/08/11 19:07
1.
sprintf_sかostringstreamを使用すればできます。
sprintf_sを使用する場合
char buf[256];
sprintf_s( buf, sizeof(buf), "Debug\\Stage\\%d", Stage );
FileRead_open( buf );
ostringstreamを使用する場合(sstreamをインクルードする必要があります)
ostringstream os;
os << "Debug\\Stage\\" << Stage;
FileRead_open( os.str().c_str() );
2.
単純に代入するということでしたら、
for( int i = 0; i < HEIGHT; i++ )
{
for( int j = 0; j < WIDTH; j++ )
{
MapData[i][j] = 0;
}
}
この様にすればいいと思うのですが、これでは問題ありますでしょうか?
|
Re: マップデータをファイルから読み込むには ( No.3 ) |
- 名前:Talvisota 日時:2013/08/12 10:51
返答ありがとうございます!
しかし、私の2の説明がいささか足りなかったようなようです。申し訳ありません。
読み込んだデータを、int MapData[HEIGHT][WIDTH] = { ・・・ のような、配列に代入させるには、
どうしたらいいのでしょうか?
というのは、1で、テキストファイルから読み込んだデータを当てはめさせるには、ということを聞きたかったのです。
あまりにも手間をかけてしまうようですが、宜しくお願いします。
|
Re: マップデータをファイルから読み込むには ( No.4 ) |
- 名前:softya(ソフト屋) 日時:2013/08/12 11:56
可変サイズのマップを2次元配列に対応させるのは困難ですので、通常は1次元配列を使います。
y * 横幅 + xの式でマップデータにアクセスできます。
|
Re: マップデータをファイルから読み込むには ( No.5 ) |
- 名前:ジュンヤ 日時:2013/08/12 13:19
説明はsoftya(ソフト屋)さんの仰せの通りです。
具体的には、以下の様にMapDataを宣言しマップデータを格納するのに必要な分だけのメモリを確保します。
(newでメモリ確保して使わなくなったら必ずdeleteしてください)
int* MapData = new int[ HEIGHT*WIDTH ];
読み込みに関しては、DXライブラリのアーカイブを使用する場合には、FileRead_getsやFileRead_getcを使用すればよいでしょう。
リファレンスにサンプルプログラムが載ってますので、そちらを参考にしてください。
アーカイブを使用しない場合は、C言語の標準関数を使用しても問題ないです。
アクセスしたい時は、例えば2行目の3列目のデータにアクセスしたい時は(ただし0行目0列目も含む数え方で)
MapData[ 2 * WIDTH + 3 ]
とすれば任意のマップデータを取得できます。
この様にすれば、2次元配列を1次元配列として扱えるので便利です。
|
Re: マップデータをファイルから読み込むには ( No.6 ) |
- 名前:Talvisota 日時:2013/08/12 22:38
お二人とも、ご解答ありがとうございます。
あの……非常に聞きづらいのですが、FileRead_getsを使った読み込ませ方はどうしたらいいのでしょうか?
void FileLoad(){
char buf[256];
sprintf_s( buf, sizeof(buf), "Debug\\Stage\\%d", Stage );
FileRead_open( buf );
int* MapData = new int[ HEIGHT*WIDTH ];
while(buf == NULL)
{
// 一行読み込み
FileRead_gets( buf, 256,MapData ) ;
}
}
↑警告やエラーに従ったまま打ち込んだ結果、最終的にこんなメチャクチャなことになりました。(当然、エラーが発生。)
ああ、自分の頭の回転の悪さたるや我ながらうんざりします。
どうか、お教えください。うう・・・
|
Re: マップデータをファイルから読み込むには ( No.7 ) |
- 名前:softya(ソフト屋) 日時:2013/08/12 23:27
1文字がマップの1要素な場合は、
char* MapData = new char[ HEIGHT*WIDTH ];
の方が良いと思います。
一行読み込みは、ワークポインタを使ってください。
char * MapDataWork = MapData;
int wsize = 100; 横サイズ
while(buf == NULL) { ← 間違っています。 FileRead_eofを使います。
FileRead_gets( MapDataWork , wsize ,FileHandle ) ; ←FileHandle が見当たりません。
MapDataWork += wsize;//横サイズをずらす
}
などと成ります。
FileRead_gets自体の使い方ははリファレンスを確認してください。
|
Re: マップデータをファイルから読み込むには ( No.8 ) |
- 名前:Talvisota 日時:2013/08/13 15:51
softya(ソフト屋)さん、解決策のご提供ありがとうございます!
しかし、もうしばらくお付き合いください(!?)。なんとも面倒なことに、
Railway Construction.exe の 0x77e715de で
ハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000064 を読み込み中にアクセス違反が発生しました。
という、例外が発生してしまいました。いったい、どうしたらいいのでしょうか?どうかアドバイスをお願いします。
問題のあるであろうソース部分を載せておきます。足りないのでありましたら、その旨レスしていただけたら幸いです。
(なんだかごちゃごちゃですが、ご了承下さい)
( * で分けた上と下は別のcppです。分けておるのです)
#include "Header.h"
int FileHandle;
int wsize = 30;
void FileLoad(){
char buf[256];
sprintf_s( buf, sizeof(buf), "Debug\\Stage\\%d", Stage );
FileHandle = FileRead_open( buf );
char* MapData = new char[ HEIGHT*WIDTH ];
char * MapDataWork = MapData;
while(FileRead_eof( FileHandle ) == 0) {
FileRead_gets( MapDataWork , wsize ,FileHandle ) ;
MapDataWork += wsize;//横サイズをずらす
}
}
************************
void DrawMain(){
int i,j,k;
k = 0;
if((Me.Y <= 224)&&(NowHeight > 0)){
if(GetNowCount() - Timer1 > 500){
NowHeight --;
Timer1 = GetNowCount();
}
else
Me.Y = 225;
}
if((Me.Y >= 384)&&(NowHeight < 5)){
if(GetNowCount() - Timer1 > 500){
NowHeight ++;
Timer1 = GetNowCount();
}
else
Me.Y = 383;
}
MyX1 = ( Me.X + (Me.G_width - Me.B_width) / 2) / SIZE;// Me.X / 32;
MyY1 = ( ( Me.Y + (Me.G_height - Me.B_height) / 2) / SIZE ) + NowHeight;//Me.Y / 32;
MyX2 = ( Me.X + (Me.G_width + Me.B_width) / 2) / SIZE;
MyY2 = ( ( Me.Y + (Me.G_height + Me.B_height) / 2) / SIZE ) + NowHeight;
/* 縦スクロールを表現させるため、NowHeight変数を使用している。この変数の値を減増させることで、描くマップチップ画像を制御しているという算段だ。
だが、これは画像表示のみを念頭に入れており、中の数字までは考えていない。 つまろこいつか?(NowHeight)*/
for(i = NowHeight;i<HEIGHT;i++){
for(j = 0;j<WIDTH ;j++){
// if(MapData[i][j]==0)
DrawGraph(j*SIZE,k*SIZE,MapGraph[MapData[i * WIDTH + j]],FALSE);
/* else if(MapData[i][j]==2)
DrawGraph(j*SIZE,k*SIZE,MapGraph[1],FALSE);
else
DrawGraph(j*SIZE,k*SIZE,MapGraph[0],FALSE);*/
}
k++;
}
MyMove();
MyShot();
DrawGraph(Me.X,Me.Y,MyGraph[WalkFlag],TRUE);
DrawGraph((int)Sight.DX,(int)Sight.DY,SightGraph,TRUE);
DrawFormatString(10, 10 , GetColor(0,0,0) ,"X %d Y %d" , Me.X,Me.Y) ;
DrawFormatString(10,30,GetColor(0,0,0),"判定 %d MyY1 %d、MyX1 %d MyY2 %d MyX2 %d NowHei %d",MapAtari(MyY1,MyX1),MyY1,MyX1,MyY2,MyX2,NowHeight);
DrawFormatString(10, 60 , GetColor(0,0,0) ,"MyShotX %d MyShotY %d" , MyShotX,MyShotY) ;
DrawFormatString(Me.X - 20, Me.Y , GetColor(0,0,0) ,"%d" , MapAtari(MyY1,MyX1 - 1)) ;
DrawFormatString(Me.X + 30, Me.Y , GetColor(0,0,0) ,"%d" , MapAtari(MyY1,MyX1 + 1)) ;
DrawFormatString(Me.X , Me.Y - 20, GetColor(0,0,0) ,"%d" , MapAtari(MyY1 - 1,MyX1)) ;
DrawFormatString(Me.X , Me.Y + 20, GetColor(0,0,0) ,"%d" , MapAtari(MyY1 + 1,MyX1)) ;
}
※明日より遠出してしまうため、返信は今日より3日ほど遅れてしまいます。ご了承くださいまし
|
Re: マップデータをファイルから読み込むには ( No.9 ) |
- 名前:ジュンヤ 日時:2013/08/13 19:41
こういう場合、大抵は無効なポインタ又は配列範囲外にアクセスしてしまった場合に起きることが多いです。
MapDataWork += wsize;//横サイズをずらす
↑の部分が怪しいです。おそらくeof判定される前にMapDataWorkが範囲外を指してしまったのではないでしょうか。
wsizeとHEIGHTとWIDTHの値を適切な値にすれば解消すると思います。
デバッグモードで調べてみてください。
詳しくはこちら
ttp://marupeke296.com/DBG_No1_Step.html
|
Re: マップデータをファイルから読み込むには ( No.10 ) |
- 名前:Talvisota 日時:2013/08/20 18:30
アドバイスありがとうございます!
途中報告という形で書き込ませてもらいます。
MyY2 = ( ( Me.Y + (Me.G_height + Me.B_height) / 2) / SIZE ) + NowHeight;
/* 縦スクロールを表現させるため、NowHeight変数を使用している。この変数の値を減増させることで、描くマップチップ画像を制御しているという算段だ。
だが、これは画像表示のみを念頭に入れており、中の数字までは考えていない。 つまろこいつか?(NowHeight)*/
for(i = NowHeight;i<HEIGHT;i++){
for(j = 0;j<WIDTH ;j++){
// if(MapData[i][j]==0)
ここで例外が発生したようです→ DrawGraph(j*SIZE,k*SIZE,MapGraph[MapData[i * WIDTH + j]],FALSE);
/* else if(MapData[i][j]==2)
DrawGraph(j*SIZE,k*SIZE,MapGraph[1],FALSE);
else
DrawGraph(j*SIZE,k*SIZE,MapGraph[0],FALSE);*/
}
k++;
}
MyMove();
MyShot();
DrawGraph(Me.X,Me.Y,MyGraph[WalkFlag],TR
上式のような判定になりました。やはり、void FileLoad()の部分が怪しいとみていいのでしょうか。
引き続き、尽力します。
・追記
いまさらですが、テキストファイル内のデータは、下記のようでいいのでしょうか?
度々申し訳ありません。
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 21 22 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 30 31 1 1 15 16 1 1 1 1 1 1 1 1 1 1 1 0
0 1 18 19 20 1 13 14 1 1 1 1 1 1 1 1 1 1 1 0
0 1 27 28 29 1 1 1 1 1 1 1 1 1 1 8 1 1 1 0
0 1 1 1 1 1 1 1 1 2 1 1 1 1 1 17 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 6 6 1 7 7 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 3 1 1 4 1 1 1 9 10 11 12 1 1 0
0 1 1 1 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 0
0 1 1 1 1 1 1 1 1 1 23 24 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 32 33 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
|
Re: マップデータをファイルから読み込むには ( No.11 ) |
- 名前:ジュンヤ 日時:2013/08/20 20:37
MapDataの範囲外にアクセスしてしまっているようです。
配列やポインタにアクセスする時は必ずエラーチェックするようにしましょう、
以下の様にすれば、デバッグモードを起動しないでもエラーの原因がすぐにわかります。
printfDxでなく、assertを使っても大丈夫です。
for( int i = 0; i < HEIGHT; i++ )
{
for( j = 0; j < WIDTH ; j++ )
{
// 配列の範囲内なら描画
if( ( i * WIDTH + j ) < HEIGHT * WIDTH )
{
// ここに描画処理を描く
}
else // 範囲外ならエラー出力
{
printfDx( "MapDataの範囲外にアクセスしてます\n" );
printfDx( "i * WIDTH + j = %d HEIGHT * WIDTH = %d\n", i * WIDTH + j, HEIGHT * WIDTH );
printfDx( "%s()[%d]\n", __FUNCTION__, __LINE__ ); // エラーが起きた関数名と行数を出力する
ScreenFlip();
WaitKey();
}
}
}
テキストファイル内のデータですが、数字によって描画されるブロックと当たり判定などを決めているという仕様ですよね?
2Dアクションゲームなどでは、その仕様でも問題ないと思います。
ただRPGなどですと、描画するブロックの種類や当たり判定以外にも、
イベントやフラグの情報をマップ自体に持たせたい時もあると思うので、
レイヤーなどの仕組みが必要になると思います。
そうなるとマップエディタを自作するか、フリーソフトを使うかする必要があります。
私はいつもPlatinumというマップエディタを使ってます。
h t t p://w w w.hyperdevice.net/
どのやり方が完全に正解だということはないので、自分がやりやすい方法を必要に応じて選べばいいのではないでしょうか。
|
Re: マップデータをファイルから読み込むには ( No.12 ) |
- 名前:Talvisota 日時:2013/08/25 13:28
ジュンヤ さん、ご解答ありがとうございます。
アドバイスを頂き、さっそくプログラムを打ち込んで問題解決に挑んだのですが、相変わらずなんともです。
ですが、一つ気づいたのですが、逆アセンブルを見てみたところ、
013BBF53 movsx edx,byte ptr [ecx+eax]
ということを記していました。(例外発生場所は上述と同じ場所)
なかの文から察するに、バイトに関する部分にやはりもんだいがあるらしいです。
範囲外にアクセスしてしまっている、という今までのアドバイスを受け、
WIDTH や HEIGHT、wsizeなどの数値を大きくしたり、
テキストファイルを今一度確認してみたり(ちなみにファイル自体の大きさは860Byteでした)と、いろいろな試みをしてきましたが、一向に良くなる気配がありません。
また、ジュンヤ さんの提案してくださったエラー発生時の対処も引っかかりませんでした。
(見るべき場所が間違っているのかもしれませんが、画面に表示されるということでまちがっていませんよね?)
もしかすると、範囲内でイレギュラーが発生しているのかも、という不確かな疑惑まで湧いて出てくる始末。
引き続き、尽力します。現在ネットを渡り歩いて解決策の模索中であります。
(すでにスレも二桁となり、あまりにも長々しいことで申し訳ありません。
これ以後とも、少なからずのご迷惑をおかけしますこと、ご了承ください。)
|
Re: マップデータをファイルから読み込むには ( No.13 ) |
- 名前:いっち 日時:2013/08/25 15:18
Talvisotaさん>
差し支えないようでしたらソースコードを丸ごとアップロードして下さい。
解決が早くなると思います。
|
Re: マップデータをファイルから読み込むには ( No.14 ) |
- 名前:Talvisota 日時:2013/08/25 17:49
//Header.h
#define SIZE 32
#define WIDTH 20
#define HEIGHT 20
#define M_PI 3.14159265358979
extern void MyMove();
extern void FileLoad();
extern int MapAtari(int a,int b);
extern int NowHeight;
extern char* MapData;
extern int Stage ;
extern int FileSize;
struct Chara{
int X;
int Y;
double DX;
double DY;
int GHandle;
int life; //あるorない
int Vec;
int G_width;//画像範囲
int G_height;
int B_width;//当たり範囲
int B_height;
};
<hr size="1" color="#804000">
//1.cpp
#include "Header.h"
enum{
TITLE,BRIE,MAIN
};
void Load();
void DrawTitle();
void DrawMain();
void DrawBrie();//Briefing
void MyMove();
void MyShot();
void MySum();
void EneSum();
void FileLoad();
int MapAtari(int a,int b);
int CharaAtari(Chara a,Chara b);
int ShotMap(Chara a);
struct Chara Me;
struct Chara Sight;
struct Chara Bullet[50];
struct Chara Ene1[30];
int MyGraph[2],MapGraph[50],SightGraph,BulletGraph,Ene1Graph[8];
bool PushFlag = false;
int WalkFlag = 0;
int state = TITLE;
int MyX1=1,MyY1=18;
int MyX2=1,MyY2=18;
int MyX3=1,MyY3=18;
double MyShotX,MyShotY;//自弾の速さ
int Stage = 1;
int RemTop = 5;
int NowHeight = 5;
int Timer1 = 0, Timer2 = 0;
int StepX=32,StepY=32;
int ArcX,ArcY,TriX,TriY;//半径80 弧X,弧Y,三角X,三角Y
int trigger = 0;
int Angle = 270;
double sb = 0, sbx = 0, sby = 0, bx = 0, by = 0, sx = 0, sy = 0;
int BrieTime;
char* MapData ;
/**/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE); //X→640 Y→480
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
Load();
MySum();
//MyX1 = ( Me.X + (Me.G_width - Me.B_width) / 2) / 32;// Me.X / 32;
//MyY1 = ( Me.Y + (Me.G_height - Me.B_height) / 2) / 32;//Me.Y / 32;
//MyX2 = ( Me.X + (Me.G_width + Me.B_width) / 2) / 32;
//MyY2 = ( Me.Y + (Me.G_height + Me.B_height) / 2) / 32;
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)!=1){
ClsDrawScreen();
switch(state){
case TITLE:
DrawTitle();
break;
case BRIE:
DrawBrie();
break;
case MAIN:
DrawMain();
break;
}
ScreenFlip();
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
void DrawTitle(){
DrawString(100,100,"TITLE",GetColor(100,100,100));
if(CheckHitKey(KEY_INPUT_SPACE)==1){
state = BRIE;
BrieTime = GetNowCount();
}
}
void DrawBrie(){
DrawFormatString(200,200,GetColor(200,0,0),"STAGE %d",Stage);
if(GetNowCount() - BrieTime > 5000){
FileLoad();
state = MAIN;
}
}
void DrawMain(){
int i,j,k;
k = 0;
if((Me.Y <= 224)&&(NowHeight > 0)){
if(GetNowCount() - Timer1 > 500){
NowHeight --;
Timer1 = GetNowCount();
}
else
Me.Y = 225;
}
if((Me.Y >= 384)&&(NowHeight < 5)){
if(GetNowCount() - Timer1 > 500){
NowHeight ++;
Timer1 = GetNowCount();
}
else
Me.Y = 383;
}
MyX1 = ( Me.X + (Me.G_width - Me.B_width) / 2) / SIZE;// Me.X / 32;
MyY1 = ( ( Me.Y + (Me.G_height - Me.B_height) / 2) / SIZE ) + NowHeight;//Me.Y / 32;
MyX2 = ( Me.X + (Me.G_width + Me.B_width) / 2) / SIZE;
MyY2 = ( ( Me.Y + (Me.G_height + Me.B_height) / 2) / SIZE ) + NowHeight;
/* 縦スクロールを表現させるため、NowHeight変数を使用している。この変数の値を減増させることで、描くマップチップ画像を制御しているという算段だ。
だが、これは画像表示のみを念頭に入れており、中の数字までは考えていない。 つまろこいつか?(NowHeight)*/
for(i = NowHeight;i<HEIGHT;i++){
for(j = 0;j<WIDTH ;j++){
if( ( i * WIDTH + j ) < HEIGHT * WIDTH )
{
DrawGraph(j*SIZE,k*SIZE,MapGraph[MapData[i * WIDTH + j]],FALSE);
}
else // 範囲外ならエラー出力
{
printfDx( "MapDataの範囲外にアクセスしてます\n" );
printfDx( "i * WIDTH + j = %d HEIGHT * WIDTH = %d\n", i * WIDTH + j, HEIGHT * WIDTH );
printfDx( "%s()[%d]\n", __FUNCTION__, __LINE__ ); // エラーが起きた関数名と行数を出力する
ScreenFlip();
WaitKey();
}
}
k++;
}
MyMove();
MyShot();
DrawGraph(Me.X,Me.Y,MyGraph[WalkFlag],TRUE);
DrawGraph((int)Sight.DX,(int)Sight.DY,SightGraph,TRUE);
DrawFormatString(10, 10 , GetColor(0,0,0) ,"X %d Y %d" , Me.X,Me.Y) ;
DrawFormatString(10,30,GetColor(0,0,0),"判定 %d MyY1 %d、MyX1 %d MyY2 %d MyX2 %d NowHei %d",MapAtari(MyY1,MyX1),MyY1,MyX1,MyY2,MyX2,NowHeight);
DrawFormatString(10, 60 , GetColor(0,0,0) ,"MyShotX %d MyShotY %d" , MyShotX,MyShotY) ;
DrawFormatString(Me.X - 20, Me.Y , GetColor(0,0,0) ,"%d" , MapAtari(MyY1,MyX1 - 1)) ;
DrawFormatString(Me.X + 30, Me.Y , GetColor(0,0,0) ,"%d" , MapAtari(MyY1,MyX1 + 1)) ;
DrawFormatString(Me.X , Me.Y - 20, GetColor(0,0,0) ,"%d" , MapAtari(MyY1 - 1,MyX1)) ;
DrawFormatString(Me.X , Me.Y + 20, GetColor(0,0,0) ,"%d" , MapAtari(MyY1 + 1,MyX1)) ;
}
void Load(){
SightGraph = LoadGraph("Debug\\Graphics\\Target.png");
LoadDivGraph("Debug\\Graphics\\MY.png",2,2,1,30,60,MyGraph);
LoadDivGraph("Debug\\Graphics\\SnowMap.png",36,9,4,32,32,MapGraph);
BulletGraph = LoadGraph("Debug\\Graphics\\Bullet.png");
LoadDivGraph("Debug\\Graphics\\SnowMap.png",8,4,2,60,30,Ene1Graph);
}
void MySum(){
// Me.GHandle = MyGraph[0];
Me.G_width = 30;
Me.G_height = 60;
Me.B_width = 26;
Me.B_height = 50;
Me.X = 96;
Me.Y = 352;
// Sight.DX = Me.X + 4;
// Sight.DY = Me.Y - 140;
// Sight.G_width = 38;
// Sight.G_height = 42;
GetGraphSize( SightGraph , &Sight.G_width , &Sight.G_height ) ;
for(int i = 0;i < 3;i++){
Bullet[i].GHandle = BulletGraph;
Bullet[i].G_width = 5;
Bullet[i].G_height = 10;
Bullet[i].B_width = 3;
Bullet[i].B_height = 9;
Bullet[i].life = 0;
Bullet[i].X = Me.X + 18;
Bullet[i].Y = Me.Y + 8;
}
}
void EneSum(){
for(int i = 0;i < 30;i++){
Ene1[i].G_width = 30;
Ene1[i].G_height = 60;
Ene1[i].B_width = 28;
Ene1[i].B_height = 40;
}
}
void MyMove(){
int StayX,StayY;
MyX1 = ( Me.X + (Me.G_width - Me.B_width) / 2) / SIZE;
MyY1 = ( ( Me.Y + (Me.G_height - Me.B_height) / 2) / SIZE ) + NowHeight;
MyX2 = ( Me.X + (Me.G_width + Me.B_width) / 2) / SIZE;
MyY2 = ( ( Me.Y + (Me.G_height + Me.B_height) / 2) / SIZE ) + NowHeight;
Sight.DX = cos(Angle * M_PI / 180 )* 100 + (Me.X + 18);
Sight.DY = sin(Angle * M_PI / 180 )* 100 + (Me.Y + 8);
if(MapAtari(MyY1,MyX1)==1){
if(CheckHitKey(KEY_INPUT_A)==1){
if((MapAtari(MyY1 ,MyX1 - 1 )==1)&&(MapAtari(MyY2 ,MyX1 - 1)== 1)&& MapAtari(MyY1 + 1,MyX1 - 1)==1) Me.X -= 2;
PushFlag = true;
}
if(CheckHitKey(KEY_INPUT_D)==1){
if((MapAtari(MyY1,MyX2 + 1)==1)&&(MapAtari(MyY2,MyX2 + 1)== 1)&& MapAtari(MyY1 + 1,MyX1 + 1)==1) Me.X += 2;
PushFlag = true;
}
if(CheckHitKey(KEY_INPUT_W)==1){
if((MapAtari(MyY1 - 1,MyX1)==1)&&(MapAtari(MyY1 - 1,MyX2)== 1)) Me.Y -= 2;
PushFlag = true;
}
if(CheckHitKey(KEY_INPUT_S)==1){
if((MapAtari(MyY2 +1,MyX1)==1)&&(MapAtari(MyY2 + 1,MyX2)== 1)) Me.Y += 2;
PushFlag = true;
}
if(CheckHitKey(KEY_INPUT_A)==0 && CheckHitKey(KEY_INPUT_D)==0 && CheckHitKey(KEY_INPUT_W)==0 && CheckHitKey(KEY_INPUT_S)==0)
PushFlag = false;
if(PushFlag == true){
if(GetNowCount() - Timer2 > 300){
WalkFlag = 1;
}
if(GetNowCount() - Timer2 > 600){
WalkFlag = 0;
Timer2 = GetNowCount();
}
}
}
if (Angle > 240 && Angle < 290 ){
if(CheckHitKey(KEY_INPUT_LEFT)==1)
Angle --;
if(CheckHitKey(KEY_INPUT_RIGHT)==1)
Angle ++;
}
else if (Angle <= 240)
Angle = 241;
else if (Angle >= 290)
Angle = 289;
if(CheckHitKey(KEY_INPUT_Q) == 1){
Me.X = 33;
Me.Y = 416;
}
}
void MyShot(){
int i;
if(trigger == 0){
if(CheckHitKey(KEY_INPUT_UP) == 1){
for(i=0; i<3; i=i+1){
if(Bullet[i].life == 0){
Bullet[i].life = 1;
Bullet[i].X = Me.X + 18;
Bullet[i].Y = Me.Y + 8;
Bullet[i].Vec = 0;
sx = (double)Bullet[i].X + (double)Bullet[i].B_width / 2 ;
sy = (double)Bullet[i].Y + (double)Bullet[i].B_height / 2 ;
bx = Sight.DX + Sight.G_width / 2 ;
by = Sight.DY + Sight.G_height / 2 ;
sbx = sx - bx ;
sby = sy - by ;
// 平方根を求めるのに標準関数の sqrt を使う、
sb = sqrt( sbx * sbx + sby * sby ) ;
MyShotX = sbx / sb * 10 ;
MyShotY = sby / sb * 10 ;
break;
}
}
trigger = 80;
}
}
if(trigger>0) trigger = trigger - 1;
//弾の移動
for(i=0; i<3; i=i+1){
if(Bullet[i].life > 0){
Bullet[i].Y = Bullet[i].Y - (int)MyShotY;
Bullet[i].X = Bullet[i].X - (int)MyShotX;
DrawGraph(Bullet[i].X, Bullet[i].Y, Bullet[i].GHandle, TRUE);
// DrawFormatString(100,100,GetColor(0,0,0),"%d ",MapData[Bullet[i].Y /32][Bullet[i].X / 32]);
//画面外へ出た時の処理
if(Bullet[i].Y < 0 || Bullet[i].X < 0 || Bullet[i].X > 480) Bullet[i].life = 0;
if(ShotMap(Bullet[i])==1) Bullet[i].life = 0;
}
}
}
int MapAtari(int a,int b){
int retval = 0;
if((MapData[ a * WIDTH + b]==1)) //Good...?
retval = 1;
return retval;
}
int CharaAtari(Chara a, Chara b){
int retval = 0;
int ax1 = (int)a.X + (a.G_width - a.B_width)/2;
int ay1 = (int)a.Y + (a.G_height - a.B_height)/2;
int ax2 = (int)a.X + (a.G_width + a.B_width)/2;
int ay2 = (int)a.Y + (a.G_height + a.B_height)/2;
int bx1 = (int)b.X + (b.G_width - b.B_width)/2;
int by1 = (int)b.Y + (b.G_height - b.B_height)/2;
int bx2 = (int)b.X + (b.G_width + b.B_width)/2;
int by2 = (int)b.Y + (b.G_height + b.B_height)/2;
if( (ax1<bx2) && (bx1<ax2) && (ay1<by2) && (by1<ay2) ){
retval = 1;
}
return(retval);
}
int ShotMap(Chara a){
int retval = 0;
int ShotX1,ShotY1,ShotX2,ShotY2;
ShotX1 = (a.X + (a.G_width - a.B_width)/2)/32 ;
ShotY1 = (a.Y + (a.G_height - a.B_height)/2)/ 32;
ShotX2 = (a.X + (a.G_width + a.B_width)/2)/32 ;
ShotY2 = (a.Y + (a.G_height + a.B_height)/2)/32 ;
if((MapData[ (ShotY1 + NowHeight ) * WIDTH + ShotX1] != 1)&&(MapData[(ShotY1 + NowHeight) * WIDTH + ShotX1 ] != 0)&&(MapData[ (ShotY2 + NowHeight) * WIDTH +ShotX2] != 0)&&(MapData[(ShotY2 + NowHeight)* WIDTH + ShotX2 ] != 1) ,
(MapData[ (ShotY1 + NowHeight ) * WIDTH + ShotX2] != 1)&&(MapData[(ShotY1 + NowHeight) * WIDTH + ShotX2 ] != 0)&&(MapData[(ShotY2 + NowHeight) * WIDTH + ShotX1 ] != 1)&&(MapData[(ShotY2 + NowHeight) * WIDTH + ShotX1 ] != 0)) retval = 1;
return retval;
}
<hr size="1" color="#804000">
//Stage1.cpp
#include "Header.h"
int FileHandle;
int wsize = 43;
int FileSize;
void FileLoad(){
char buf[800];
sprintf_s( buf, sizeof(buf), "Debug\\Stage\\%d.txt", Stage );
FileHandle = FileRead_open( buf );
char * MapData = new char[ HEIGHT*WIDTH ];
char * MapDataWork = MapData;
FileSize = FileRead_size( buf) ;
DrawFormatString( 30, 0 , GetColor(255,0,0) ,"%d" , FileSize) ;
while(FileRead_eof( FileHandle ) == 0) {
FileRead_gets( MapDataWork , wsize,FileHandle ) ;
MapDataWork += wsize;//横サイズをずらす
}
// MapData = MapDataWork;
FileRead_close( FileHandle ) ;
}
<hr size="1" color="#804000">
以上が、現在のソースコードです。
(意味不明なメッセージも伏せられたりもしていますが、スルーしてください)
あまりにも面倒なことにつき合わしてしまい、大変申し訳ありませんでした。
|
Re: マップデータをファイルから読み込むには ( No.15 ) |
- 名前:いっち 日時:2013/08/25 21:12
読み込んでいるファイルの形式が不明ですが、関数 FileLoad を以下のようにすることでうまくいくと思います。
void FileLoad(){
char buf[800];
sprintf_s( buf, sizeof(buf), "Debug\\Stage\\%d.txt", Stage );
int FileHandle = FileRead_open( buf );
int i;
for ( i = 0; i < HEIGHT*WIDTH; i++ ) {
if ( FileRead_scanf( FileHandle, "%d", MapData+i ) != 1 ) { // EOF?
break;
}
}
DrawFormatString( 30, 0, GetColor( 255, 0, 0), "%d", i );
FileRead_close( FileHandle );
return;
}
それと変数 MapData は int型の配列にしてください。
int MapData[HEIGHT*WIDTH];
|
Re: マップデータをファイルから読み込むには ( No.16 ) |
- 名前:Talvisota 日時:2013/08/26 10:48
テキストファイルの中身は全て半角数字、一文字ずつ半角スペースで区切られて、縦横共に数字が20あります。
1.txt 中身↓
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 21 22 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 30 31 1 1 15 16 1 1 1 1 1 1 1 1 1 1 1 0
0 1 18 19 20 1 13 14 1 1 1 1 1 1 1 1 1 1 1 0
0 1 27 28 29 1 1 1 1 1 1 1 1 1 1 8 1 1 1 0
0 1 1 1 1 1 1 1 1 2 1 1 1 1 1 17 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 6 6 1 7 7 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 3 1 1 4 1 1 1 9 10 11 12 1 1 0
0 1 1 1 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 0
0 1 1 1 1 1 1 1 1 1 23 24 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 32 33 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
|
Re: マップデータをファイルから読み込むには ( No.17 ) |
- 名前:Talvisota(解決) 日時:2013/08/26 23:02
ついにできました!!ファイル内のデータ通りにがオズが表示されます!
長かった・・・!!もう今夜は一人宴でしょう。よかったよかった。
まだまだ開発はこれからですが、難問を突破したことに大変感激しております。
こうしてできたのも、皆様のアドバイスとご厚意によって成し遂げられたものに違いありません。
softya(ソフト屋)さん、ジュンヤさん、いっちさん、どうもありがとうございました!!
|
|