横スクロールSTGゲーム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こばち

横スクロールSTGゲーム

#1

投稿記事 by こばち » 15年前

初心者です。今本を見ながら、STGゲームをプログラムしています。それで詰まってしまって、質問です。
解らないところのプログラムは以下↓で

#include "spgame.h"
#include "stdio.h"



int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
1 ChangeWindowMode(TRUE); //ウィンドウモードで起動
2 if(DxLib_Init() == -1) return(-1); //DXライブラリ初期化

4 gametitlejpg = LoadGraph("media\\gametitle.jpg");
5 JicharaLoad();
6 TekiLoad();
7 int stagenum = 1;
8 if(MapLoad(ssprintf("media\\map0%d.dat" ,stagenum),"media\\map01.bmp")==0) return(0);
9 if(ZakoLoad("media\\zako01.pat", "media\\zako01.bmp")==0) return(0);
10 backjpg = LoadGraph("media\\back01.jpg");

     
・・・
・・・
    ・・・


マップをステージクリアするたびに読み込もうとおもって、7行目でstagenumという変数をつくって、8行目でテキストでつくったデータを読み込もうとしたんですがエラーとなりました。エラー文は、

エラー E2268 C:\MyC\smp_yokogame01c\yokogame01.cpp 30: 未定義の関数 'ssprintf' を呼び出した(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2034 C:\MyC\smp_yokogame01c\yokogame01.cpp 30: 'int' 型は 'char *' 型に変換できない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2340 C:\MyC\smp_yokogame01c\yokogame01.cpp 30: 1 番目のパラメータは char * 型として定義されているので int 型は渡せない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
*** 3 errors in Compile ***


とでます。どう改善すればいいでしょうか?

non

Re:横スクロールSTGゲーム

#2

投稿記事 by non » 15年前

>・・・未定義の関数 'ssprintf' を呼び出した・・・

って言ってますからssprintfが未定義なのでしょう。
ところで、この関数は何?組み込み関数?見たことないです。

こばち

Re:横スクロールSTGゲーム

#3

投稿記事 by こばち » 15年前

ssprintf はヘッダーファイルを見たところなかったので、組み込み関数ではないようです。本の誤記載かもしれません。通常ステージをクリアするたびにmap01.dat , map02.dat , map03.dat ・・・と次々に読み込んでいく場合は

if(MapLoad("media\\map01.dat","media\\map01.bmp")==0) return(0);

をどのように変えるとよいのでしょうか?

こばち

Re:横スクロールSTGゲーム

#4

投稿記事 by こばち » 15年前

情報追加です。MapLoad関数は

int MapLoad(char *datname, char *bmpname){
int f; //f=ファイルハンドル

//画像読み込み
LoadDivGraph(bmpname,32,8,4,32,32,mapbmp);

//ファイルを開く
f = FileRead_open(datname);
if(f == 0) {
printfDx("map.dat読み込みエラー");
return(0);
}
//マップ長さを読み込み
char buf[10];
if(FileRead_gets(buf,10,f)==-1) return(0);
worldmax = atoi(buf);
if(worldmax>=1020) worldmax=1020;

//マップ文字列読み込み
for(int i=0; i<15; i=i+1){
if(FileRead_gets(mapdat, worldmax + 3, f) == -1) {
return(0);
}
}
//ファイルを閉じる
FileRead_close(f);
return(worldmax);
}

となっています。

Ma

Re:横スクロールSTGゲーム

#5

投稿記事 by Ma » 15年前

> if(MapLoad("media\\map01.dat","media\\map01.bmp")==0) return(0);
>をどのように変えるとよいのでしょうか?

結局 spintf の間違いの可能性が高いのでは?


for(int i = 1; i < 10; i ++){
char temp[100];
sprintf(temp,"media\\map%02d.dat",i);
printf("%s",temp);
}

たぶんこれで、
media\\map01.dat
media\\map02.dat
media\\map03.dat

になるとおもいます。

こばち

Re:横スクロールSTGゲーム

#6

投稿記事 by こばち » 15年前

sprintfでできました。
どうもありがとうございます。
これを参考に頑張ります。

アドバイスを参考に改善したのが↓です。

 int i = 1;
char temp[100];
sprintf(temp,"media\\map%02d.dat",i);
if(MapLoad(("%s",temp),"media\\map01.bmp")==0) return(0);

これで読み込めるようになりました。あとはクリアするたびにiを変更していくように頑張ります。
どうも。

Yuno

ファイルが解放されない

#7

投稿記事 by Yuno » 15年前

こんにちはYunoです
またまたひよっこな質問ですみません

fopenでひらいたファイルをすぐ後に
LoadGraphで開いても-1になってしまいます

いったいなぜでしょうか?

一応その部分のコードです

(sはstringでファイルのフルパスが入っている、のちにchar *cに代入)

char *gph;
gph=(char *)malloc((s.size()-1) * sizeof(char));
for(int i=0;i<s.size();i++){
gph=c;
}
fp = fopen( gph,"r+b+");
fwrite( " PNG" , sizeof( char ) , 4 , fp );
int a=137;
rewind(fp);
fwrite( &a , sizeof( char ) , 1 , fp );
fclose( fp ) ;
ret=LoadGraph(gph);<-ここで-1になってしまう
printfDx("%d\n",ret);
remove(gph);
free(gph);

たいちう

Re:ファイルが解放されない

#8

投稿記事 by たいちう » 15年前

> gph=(char *)malloc((s.size()-1) * sizeof(char));
> for(int i=0;i<s.size();i++){
> gph=c;
> }

何文字分確保して何文字書き込んでいるつもりなのですか?

それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
意図した書き換えに成功していることを確認しましたか?

また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
どうやって確認しましたか?


つまり「連続して実行すると失敗する」ならば、
単独で実行するとどうなるかを確認することによって、
問題の切り分けが可能となります。

Yuno

Re:ファイルが解放されない

#9

投稿記事 by Yuno » 15年前

>何文字分確保して何文字書き込んでいるつもりなのですか?

sの文字分確保しています
要するにgphにフルパスの文字数分確保をさせています

>それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?

すみません
やっていませんのでわからないです

>意図した書き換えに成功していることを確認しましたか?

意図した書き換えには成功しました

>また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?

書き換えたあとでもそのfopen~fcloseを持ったプログラムが実行中の時はLoadGraphは-1になってしまいます

>どうやって確認しましたか?

どうやってと言われるとあれですが
とりあえずデバッグ
リリース
各々で単体プログラム中てにて試しました

たいちう

Re:ファイルが解放されない

#10

投稿記事 by たいちう » 15年前

> >何文字分確保して何文字書き込んでいるつもりなのですか?
>
> sの文字分確保しています
> 要するにgphにフルパスの文字数分確保をさせています

それならば何故1を引いているのですか?


> >それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
>
> すみません
> やっていませんのでわからないです
>
> >意図した書き換えに成功していることを確認しましたか?
>
> 意図した書き換えには成功しました

どうやって確かめましたか?
(例えば、バイナリエディタで見るとか)


> >また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
>
> 書き換えたあとでもそのfopen~fcloseを持ったプログラムが実行中の時はLoadGraphは-1になってし
> まいます
>
> >どうやって確認しましたか?
>
> どうやってと言われるとあれですが
> とりあえずデバッグ
> リリース
> 各々で単体プログラム中てにて試しました

fopen~fcloseを持ったプログラムを終了させた後ならば、
LoadGraphは成功しているのですか?

Yuno

Re:ファイルが解放されない

#11

投稿記事 by Yuno » 15年前

>それならば何故1を引いているのですか?

すみません修正しました

>どうやって確かめましたか?
(例えば、バイナリエディタで見るとか)

Stirlingで正しく変換されていることを確認しました

>fopen~fcloseを持ったプログラムを終了させた後ならば、
LoadGraphは成功しているのですか?

fopen~fcloseを実行しないで以下のコードで実行した結果読み込みませんでした…
gphの設定が悪いのでしょうか


int test(char *path){
int ret;
char pszFile[256],pszExtent[32];
_splitpath(path,NULL,NULL,pszFile,pszExtent);
string s,t;
t=string(pszFile)+string(pszExtent);
char c[DECRY_MAX];
s="C:\\Program Files\\thM01\\temps\\"+t;
strcpy(c,s.c_str());
char *gph;
gph=(char *)malloc((s.size()) * sizeof(char*));
for(int i=0;i<s.size();i++){
gph=c;
}
ret=LoadGraph(gph);
return ret;
}

Yuno

Re:ファイルが解放されない

#12

投稿記事 by Yuno » 15年前

ミスです
gph=(char *)malloc((s.size()) * sizeof(char*));

gph=(char *)malloc((s.size()) * sizeof(char));
でした
領域がへんになっていました

Yuno

Re:ファイルが解放されない

#13

投稿記事 by Yuno » 15年前

int ret;
char pszFile[256],pszExtent[32];
_splitpath(path,NULL,NULL,pszFile,pszExtent);
string s,t;
t=string(pszFile)+string(pszExtent);
char c[DECRY_MAX];
s="C:\\Program Files\\thM01\\temps\\"+t;
strcpy(c,s.c_str());
char *gph;
gph=(char *)malloc((s.size()) * sizeof(char));
for(int i=0;i<=s.size();i++){
gph=c;
}
printfDx("gph = %s\nsize = %d\nlast = %s",gph,s.size(),gph[s.size()]);
ret=LoadGraph(gph);
return ret;

このコードを単体で実行すると読み込めました

Yuno

Re:ファイルが解放されない

#14

投稿記事 by Yuno » 15年前

すみません原因が判明しました;;

原因は
このコードより少し前にある
fopenに対してfcloseの数が対応してなかったことが原因でした

これによりfcloseをするとファイルはちゃんと解放されることがわかりました

たいちう

Re:ファイルが解放されない

#15

投稿記事 by たいちう » 15年前

> gph=(char *)malloc((s.size()) * sizeof(char));
> for(int i=0;i<=s.size();i++){
> gph=c;
> }

まだ間違いです。
↓が正解。文字数 + '\0'を分の領域を確保。

gph=(char *)malloc((s.size() + 1) * sizeof(char));

それと特に意図がないならば、gphへの代入もstrcpyを使っては?

Yuno

Re:ファイルが解放されない

#16

投稿記事 by Yuno » 15年前

ありがとうございます
終末処理をしないでするところでした

今回はこちらの方が安定しているのでmallocを使おうと思います

閉鎖

“C言語何でも質問掲示板” へ戻る