横スクロールSTGゲーム
横スクロールSTGゲーム
初心者です。今本を見ながら、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ライブラリ初期化
3
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 ***
とでます。どう改善すればいいでしょうか?
解らないところのプログラムは以下↓で
#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ライブラリ初期化
3
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 ***
とでます。どう改善すればいいでしょうか?
Re:横スクロールSTGゲーム
>・・・未定義の関数 'ssprintf' を呼び出した・・・
って言ってますからssprintfが未定義なのでしょう。
ところで、この関数は何?組み込み関数?見たことないです。
って言ってますからssprintfが未定義なのでしょう。
ところで、この関数は何?組み込み関数?見たことないです。
Re:横スクロールSTGゲーム
ssprintf はヘッダーファイルを見たところなかったので、組み込み関数ではないようです。本の誤記載かもしれません。通常ステージをクリアするたびにmap01.dat , map02.dat , map03.dat ・・・と次々に読み込んでいく場合は
if(MapLoad("media\\map01.dat","media\\map01.bmp")==0) return(0);
をどのように変えるとよいのでしょうか?
if(MapLoad("media\\map01.dat","media\\map01.bmp")==0) return(0);
をどのように変えるとよいのでしょうか?
Re:横スクロールSTGゲーム
情報追加です。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);
}
となっています。
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);
}
となっています。
Re:横スクロールSTGゲーム
> 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
になるとおもいます。
>をどのように変えるとよいのでしょうか?
結局 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ゲーム
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を変更していくように頑張ります。
どうも。
どうもありがとうございます。
これを参考に頑張ります。
アドバイスを参考に改善したのが↓です。
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です
またまたひよっこな質問ですみません
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);
またまたひよっこな質問ですみません
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:ファイルが解放されない
> gph=(char *)malloc((s.size()-1) * sizeof(char));
> for(int i=0;i<s.size();i++){
> gph=c;
> }
何文字分確保して何文字書き込んでいるつもりなのですか?
それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
意図した書き換えに成功していることを確認しましたか?
また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
どうやって確認しましたか?
つまり「連続して実行すると失敗する」ならば、
単独で実行するとどうなるかを確認することによって、
問題の切り分けが可能となります。
> for(int i=0;i<s.size();i++){
> gph=c;
> }
何文字分確保して何文字書き込んでいるつもりなのですか?
それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
意図した書き換えに成功していることを確認しましたか?
また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
どうやって確認しましたか?
つまり「連続して実行すると失敗する」ならば、
単独で実行するとどうなるかを確認することによって、
問題の切り分けが可能となります。
Re:ファイルが解放されない
>何文字分確保して何文字書き込んでいるつもりなのですか?
sの文字分確保しています
要するにgphにフルパスの文字数分確保をさせています
>それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
すみません
やっていませんのでわからないです
>意図した書き換えに成功していることを確認しましたか?
意図した書き換えには成功しました
>また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
書き換えたあとでもそのfopen~fcloseを持ったプログラムが実行中の時はLoadGraphは-1になってしまいます
>どうやって確認しましたか?
どうやってと言われるとあれですが
とりあえずデバッグ
リリース
各々で単体プログラム中てにて試しました
sの文字分確保しています
要するにgphにフルパスの文字数分確保をさせています
>それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
すみません
やっていませんのでわからないです
>意図した書き換えに成功していることを確認しましたか?
意図した書き換えには成功しました
>また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
書き換えたあとでもそのfopen~fcloseを持ったプログラムが実行中の時はLoadGraphは-1になってしまいます
>どうやって確認しましたか?
どうやってと言われるとあれですが
とりあえずデバッグ
リリース
各々で単体プログラム中てにて試しました
Re:ファイルが解放されない
> >何文字分確保して何文字書き込んでいるつもりなのですか?
>
> sの文字分確保しています
> 要するにgphにフルパスの文字数分確保をさせています
それならば何故1を引いているのですか?
> >それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
>
> すみません
> やっていませんのでわからないです
>
> >意図した書き換えに成功していることを確認しましたか?
>
> 意図した書き換えには成功しました
どうやって確かめましたか?
(例えば、バイナリエディタで見るとか)
> >また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
>
> 書き換えたあとでもそのfopen~fcloseを持ったプログラムが実行中の時はLoadGraphは-1になってし
> まいます
>
> >どうやって確認しましたか?
>
> どうやってと言われるとあれですが
> とりあえずデバッグ
> リリース
> 各々で単体プログラム中てにて試しました
fopen~fcloseを持ったプログラムを終了させた後ならば、
LoadGraphは成功しているのですか?
>
> sの文字分確保しています
> 要するにgphにフルパスの文字数分確保をさせています
それならば何故1を引いているのですか?
> >それとfopen~fcloseまでの部分を予め別のプログラムで実行してみましたか?
>
> すみません
> やっていませんのでわからないです
>
> >意図した書き換えに成功していることを確認しましたか?
>
> 意図した書き換えには成功しました
どうやって確かめましたか?
(例えば、バイナリエディタで見るとか)
> >また、別プログラムで書き換えた後ならば、LoadGraphは成功しているのですよね?
>
> 書き換えたあとでもそのfopen~fcloseを持ったプログラムが実行中の時はLoadGraphは-1になってし
> まいます
>
> >どうやって確認しましたか?
>
> どうやってと言われるとあれですが
> とりあえずデバッグ
> リリース
> 各々で単体プログラム中てにて試しました
fopen~fcloseを持ったプログラムを終了させた後ならば、
LoadGraphは成功しているのですか?
Re:ファイルが解放されない
>それならば何故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;
}
すみません修正しました
>どうやって確かめましたか?
(例えば、バイナリエディタで見るとか)
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;
}
Re:ファイルが解放されない
ミスです
gph=(char *)malloc((s.size()) * sizeof(char*));
↓
gph=(char *)malloc((s.size()) * sizeof(char));
でした
領域がへんになっていました
gph=(char *)malloc((s.size()) * sizeof(char*));
↓
gph=(char *)malloc((s.size()) * sizeof(char));
でした
領域がへんになっていました
Re:ファイルが解放されない
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;
このコードを単体で実行すると読み込めました
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;
このコードを単体で実行すると読み込めました
Re:ファイルが解放されない
すみません原因が判明しました;;
原因は
このコードより少し前にある
fopenに対してfcloseの数が対応してなかったことが原因でした
これによりfcloseをするとファイルはちゃんと解放されることがわかりました
原因は
このコードより少し前にある
fopenに対してfcloseの数が対応してなかったことが原因でした
これによりfcloseをするとファイルはちゃんと解放されることがわかりました
Re:ファイルが解放されない
> 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を使っては?
> for(int i=0;i<=s.size();i++){
> gph=c;
> }
まだ間違いです。
↓が正解。文字数 + '\0'を分の領域を確保。
gph=(char *)malloc((s.size() + 1) * sizeof(char));
それと特に意図がないならば、gphへの代入もstrcpyを使っては?