トップページ > 過去ログ > 記事閲覧
14歳からはじめるc言語ゲームプログラミング教室 Visua
名前:初心者 日時: 2009/01/18 17:32

この本のゲームを作り終えてこの本のゲームを改造したいと思っています。 あとがきに書いてある、「1ステージに数種類の敵を出現させる」というものに改造させたいと思っています。 ですが、あまり意味が理解できません。 どなたか簡単に説明してくれませんか? 初心者なので低レベルな質問かもしれませんが教えてください。

Page: 1 | 2 |

Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.1 )
名前:管理人 日時:2009/01/19 01:06

あとがきの件の部分を読んでみましたが、具体的なヒントが記載されています もしあとがきを読んでも何をすれば良いのかわからないのでしたら、 こちらの書籍で書かれていることをまだ十分に理解できていないということになります かといって一度読んだ本を何回も読み直すのも苦痛かと思いますので、この本を読んで 得られた知識を使って、本に書かれているプログラミングスタイル等は気にせずに 初心者さんが自分一人でできると思う範囲の簡単なオリジナルのゲームを作ってみては如何でしょうか? 本に書かれている内容から離れて WinMain から自分で考えてプログラムを組んでみようとすると、 そこで初めて自分がどれだけ本の内容を理解できていたかを知ることができると思います
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.2 )
名前:初心者 日時:2009/01/21 21:46

管理人さん返信ありがとうございます。 もうひとつ質問がありますので、返信よろしくお願いします。 僕は今、アクションゲームを作っています。 それで、自キャラにライフを作りたいと思って、以下の文を書きました。 (当たり判定のところの文です。) struct Enemy{ int life; //生命力 int temp1; //自由に使える変数 //判定用変数 int hantei; //自由に使える変数 }; const int HANTEI = 3000; //敵と自キャラの判定間隔 int jiki_life; //前の自キャラ生命力 //敵と自キャラの当たり判定 Ball2D m = { g_jikipos, 18 }; g_jiki_life = 2; while(ProcessMessage == 0 && g_jiki_life > jiki_life){ if ( g_enemies[i].hantei < (GetNowCount() + HANTEI) ){ if (HitTestBallAndBall( b, m ) == TRUE ){ g_jiki_life--; } } } if (g_jiki_life == 0){ return TRUE; } 以上の文を書くと当たり判定がなくなったり、1回当たったらすぐゲームオーバーになってしまいます。 なぜそうなるか、どこが間違っているかを教えてください。
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.3 )
名前:管理人 日時:2009/02/01 19:08

うーん、貼り付けて頂いたプログラムだけでは判断できません もしプログラムの量がそれほどでもないのでしたらプログラムの全体を こちらの掲示板に貼り付けてみて頂けないでしょうか?
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.4 )
名前:初心者 日時:2009/02/04 17:07

#include "myhelper.h" #include "mymain.h" #include "chap4.h" #include "chap5.h" #include "chap6.h" #include "chap7.h" //ステージ切り替え用の関数ポインタ void (*pf_initgamefunc)() = InitializeGame07; void (*pf_drawenemyfunc)() = DrawEnemies07; BOOL (*pf_checkclearfunc)() = CheckClearJyouken07; //前回のキーの状態を記録する BOOL g_akey_previous = FALSE; BOOL g_bkey_previous = FALSE; //自キャラのデータ Point2D g_jikipos = {40, 400}; //自キャラの座標 Vector g_jikivector = {0, 0}; //自キャラのベクトル BOOL g_direction = DIRECTION_RIGHT; //自キャラの向き BOOL g_nowjumping = FALSE; //現在ジャンプ中か否か //自キャラの武器 Weapon g_weapons[MAXWEAPON]; //敵キャラのデータ int g_usedenemy_num = 0; //実際に使用する数 Enemy g_enemies[MAXENEMY]; //敵の弾 Bullet g_ebullets[MAXBULLET]; //地面を表す線 int g_usedline_num = 1; //実際に使用している線の数 Line2D g_landlines[MAXLANDLINE]; //画像ハンドル int g_jikiimage[11]; int g_backimage; int g_wallimage; int g_weaponimage; int g_bulletimage; int g_titleimage; int g_clashimage[3]; int g_hitimage; //音声ファイル int g_backmusic; //バックで再生する音楽 //効果音 int g_clip1, g_clip2, g_clip3, g_clip4, g_clip5; //爆発などの一時アニメーション表示 SplashAnimation g_splashes[MAXSPLASH]; //ゲーム状態の記録 GameState g_gamestate = GAME_TITLE; //一時アニメーションの表示関数 void DrawSplash(){ for (int i=0; i<MAXSPLASH; i++ ){ if ( g_splashes[i].used == TRUE ){ DrawAnimation( g_splashes[i].position.x, g_splashes[i].position.y, 1, 0, g_splashes[i].hanten, g_splashes[i].imgarray, g_splashes[i].allframe, g_splashes[i].fps); //表示時間を超えたら終了 if ( (GetNowCount() & INT_MAX) - g_splashes[i].starttime > g_splashes[i].life ){ g_splashes[i].used = FALSE; } } } } //一時アニメーションのセット void SetSplash(SplashAnimation sp){ sp.used = TRUE; //念のため sp.starttime = (GetNowCount() & INT_MAX); //表示開始時間設定 for (int i=0; i<MAXSPLASH; i++ ){ if ( g_splashes[i].used == FALSE ){ g_splashes[i] = sp; } } } /*地面との当たり判定 当たり判定を行うBall2Dの配列と要素数を与え、衝突していればTRUEを返す。 衝突したLine2Dが地面と見なせる場合、引数HitLandにLine2D型のポインタを返す。 衝突したLine2Dが壁と見なせる場合、引数HitWallにLine2D型のポインタを返す。 Line2Dを知る必要がないときは引数にNULLを指定。 注意:複数の地面または壁と衝突した場合、最初に判定したものが返される。 */ bool CollisionLandLines( Ball2D *ballarray, int ballnum, Line2D **pphitland, Line2D **pphitwall ){ bool result = FALSE; Line2D *presultland = NULL; Line2D *presultwall = NULL; for(int i=0; i<g_usedline_num; i++){ for(int j=0; j<ballnum; j++){ //衝突チェック if ( HitTestLineAndBall(g_landlines[i], ballarray[j]) == TRUE ){ //衝突した線が90度±20度の場合、その線は壁とみなす if ( PIE/2.0 - fabs(g_landlines[i].katamuki) < PIE/9.0f){ result = TRUE; if (presultwall == NULL) presultwall = &g_landlines[i]; } else { //そうでないなら地面 //地面に対して円の中心が上側にあるかチェック if ( IsPointAtLineFace(g_landlines[i], ballarray[j].position) == TRUE ){ result = TRUE; if (presultland == NULL) presultland = &g_landlines[i]; } } } } } //Line2Dを返す if (pphitland != NULL) *pphitland = presultland; if (pphitwall != NULL) *pphitwall = presultwall; return result; } //武器の発射処理 void ShootWeapon(){ for (int i=0; i<MAXWEAPON; i++){ if (g_weapons[i].used == FALSE){ //左右共通の初期値セット g_weapons[i].used = TRUE; g_weapons[i].position = g_jikipos; g_weapons[i].movec = WEAPONSPEED; g_weapons[i].hanten = g_direction; //g_directionがFALSEなら右、TRUEなら左へ発射 if (g_direction==TRUE){ g_weapons[i].movec.x = -WEAPONSPEED.x; } SetSimpleTimer(0, 200); PlaySoundMem(g_clip2, DX_PLAYTYPE_BACK); break; } } } //武器の表示と移動 void DrawWeapon(){ for (int i=0; i<MAXWEAPON; i++){ if (g_weapons[i].used == TRUE){ g_weapons[i].position = AddVectorInFrameTime( g_weapons[i].position, g_weapons[i].movec ); DrawAnimation( g_weapons[i].position.x, g_weapons[i].position.y, 1, 0, g_weapons[i].hanten, &g_weaponimage, 1, 1.0f); //武器が画面範囲から出たらusedをFALSEにする if ( HitTestPointAndBox(g_framerect, g_weapons[i].position) == FALSE ){ g_weapons[i].used = FALSE; } } } } /*敵と武器、自キャラの当たり判定 自キャラが消滅したらTRUEを返す*/ bool CollisionCharacter(){ for (int i=0; i<g_usedenemy_num; i++){ if (g_enemies[i].used == TRUE){ Ball2D b = { {g_enemies[i].position.x, g_enemies[i].position.y}, g_enemies[i].hankei }; //敵と武器の当たり判定 for (int j=0; j<MAXWEAPON; j++){ if (g_weapons[j].used == TRUE){ Line2D w = { {g_weapons[j].position.x - WEAPONVECTOR.x/2, g_weapons[j].position.y - WEAPONVECTOR.y/2}, {g_weapons[j].position.x + WEAPONVECTOR.x/2, g_weapons[j].position.y + WEAPONVECTOR.y/2} }; if ( HitTestLineAndBall(w,b) == TRUE ){ //衝突したら敵のライフを1減らす g_enemies[i].life--; //敵消滅 if ( g_enemies[i].life == 0 ) { g_enemies[i].used = FALSE; //敵消滅時アニメーションの表示 Vector v = {15,0}; SplashAnimation clashsp = { TRUE, 250, //0.25秒 0, //現在時間はSetSplash側で設定 AddVector(g_enemies[i].position, v), g_clashimage, 3, 12.0f, !(g_weapons[i].hanten) }; SetSplash(clashsp); PlaySoundMem(g_clip4, DX_PLAYTYPE_BACK); } else { if (g_enemies[i].life > 0 ){ //ヒット時アニメーションの表示 SplashAnimation hitsp = { TRUE, 100, //0.1秒 0, //現在時間はSetSplash側で設定 g_enemies[i].position, &g_hitimage, 1, 1.0f, !(g_weapons[i].hanten) }; SetSplash(hitsp); PlaySoundMem(g_clip3, DX_PLAYTYPE_BACK); } //どちらの条件も満たさない(つまりlifeが最初から負の値)のときは //敵は武器が当たってもダメージを受けない } g_weapons[j].used = FALSE; //lifeが最初から負の値のときは //敵は武器が当たってもダメージを受けない } } } //敵と自キャラの当たり判定 Ball2D m = { g_jikipos, 18 }; g_enemies[i].jiki_life = 3; if ( HitTestBallAndBall( b, m ) == TRUE ){ g_enemies[i].jiki_life--; } if ( g_enemies[i].jiki_life--){ if ( g_enemies[i].hantei < (GetNowCount() & HANTEI) ){ if ( HitTestBallAndBall( b, m ) == TRUE ){ g_enemies[i].jiki_life--; } } } if (g_enemies[i].jiki_life == 0){ return TRUE; } } } //敵の弾と自キャラの当たり判定 for (int i=0; i<MAXBULLET; i++){ if (g_ebullets[i].used == TRUE){ Ball2D m = { g_jikipos, 18 }; if ( HitTestBallAndBall( g_ebullets[i].bpos, m ) == TRUE ){ g_enemies[i].jiki_life--; } if ( g_enemies[i].jiki_life--){ if ( g_enemies[i].hantei < (GetNowCount() & HANTEI) ){ if ( HitTestBallAndBall( g_ebullets[i].bpos, m ) == TRUE ){ g_enemies[i].jiki_life--; } } } if (g_enemies[i].jiki_life == 0){ return TRUE; } } } } /*ゲーム状態切り替え用のグローバル変数と関数群*/ //ゲームオーバー状態に移行する Point2D gmbodypos; //ゲームオーバー用の自キャラ座標 Vector gmbodyspd; //移動速度 void GoGameOver(){ //すでにゲームオーバー状態なら即脱出 if (g_gamestate == GAME_OVER) return; gmbodypos = g_jikipos; gmbodyspd = JUMPMOVEC; if (g_direction == DIRECTION_RIGHT){ gmbodyspd.x = -40.0f; } else { gmbodyspd.x = 40.0f; } g_jikipos.y = 10000000; g_jikivector.x = 0; g_jikivector.y = 0; g_gamestate = GAME_OVER; SetSimpleTimer(31,7000); StopSoundMem( g_backmusic ); PlaySoundMem( g_clip5, DX_PLAYTYPE_BACK ); } //ゲームクリアー状態に移行する void GoGameClear(){ //すでにゲームクリアー状態なら即脱出 if (g_gamestate == GAME_CLEAR) return; g_gamestate = GAME_CLEAR; SetSimpleTimer(31,7000); StopSoundMem( g_backmusic ); } //ゲームタイトル状態に移行する void GoGameTitle(){ //すでにゲームタイトル状態なら即脱出 if (g_gamestate == GAME_TITLE) return; g_gamestate = GAME_TITLE; StopSoundMem( g_backmusic ); } //ゲームスタート状態に移行する void GoGameMain(){ //すでにゲーム中なら即脱出 if (g_gamestate == GAME_MAIN) return; //ここにステージ切り替え? pf_initgamefunc(); //データ初期化 g_gamestate = GAME_MAIN; PlaySoundMem( g_clip1, DX_PLAYTYPE_BACK ); PlaySoundMem( g_backmusic, DX_PLAYTYPE_LOOP ); } //ゲームオーバー、ゲームクリアー、ゲームタイトル画面の描画 void DrawGameOver(){ gmbodypos = AddVectorInFrameTime(gmbodypos, gmbodyspd); gmbodyspd = AddVectorInFrameTime(gmbodyspd, GRAVITY); DrawAnimation(gmbodypos.x, gmbodypos.y, 1, 0, g_direction, &g_jikiimage[10], 1, 1.0f); if ( GetPassedTime(31)> -5000) { int col = GetColor(255,0,0); SetFontSize(100); SetFontThickness(9); ChangeFontType(DX_FONTTYPE_EDGE); int x = 320 - GetDrawStringWidth("GAMEOVER",8)/2; DrawString(x,160, "GAMEOVER", col); } if ( GetPassedTime(31)>0 ) GoGameTitle(); } void DrawGameClear(){ if ( GetPassedTime(31)> -5000) { int col = GetColor(0,255,255); SetFontSize(100); SetFontThickness(9); ChangeFontType(DX_FONTTYPE_EDGE); int x = 320 - GetDrawStringWidth("GAMECLEAR",9)/2; DrawString(x,160, "GAMECLEAR", col); } if ( GetPassedTime(31)>0 ) GoGameTitle(); } void DrawGameTitle(){ DrawRotaGraph(320,140, 1,0, g_titleimage, TRUE, FALSE); int col = GetColor(255,0,255); SetFontSize(32); SetFontThickness(9); int x = 320 - GetDrawStringWidth("PUSH Z KEY",10)/2; DrawString(x,300, "PUSH Z KEY", col); //キー入力チェック int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); if (key & PAD_INPUT_A){ if (g_akey_previous == FALSE){ g_akey_previous = TRUE; GoGameMain(); } }else{ g_akey_previous = FALSE; } //ステージ切り替え if ( CheckHitKey(KEY_INPUT_1) == 1 ){ pf_initgamefunc = InitializeGame04; pf_drawenemyfunc = DrawEnemies04; pf_checkclearfunc = CheckClearJyouken04; } if ( CheckHitKey(KEY_INPUT_2) == 1 ){ pf_initgamefunc = InitializeGame05; pf_drawenemyfunc = DrawEnemies05; pf_checkclearfunc = CheckClearJyouken05; } if ( CheckHitKey(KEY_INPUT_3) == 1 ){ pf_initgamefunc = InitializeGame06; pf_drawenemyfunc = DrawEnemies06; pf_checkclearfunc = CheckClearJyouken06; } if ( CheckHitKey(KEY_INPUT_4) == 1 ){ pf_initgamefunc = InitializeGame07; pf_drawenemyfunc = DrawEnemies07; pf_checkclearfunc = CheckClearJyouken07; } } //ゲームメイン描画 void DrawGameMain(){ //背景描画 DrawGraph(0,0, g_backimage, FALSE); //地形を描画 DrawAnimation(g_stagesize.width/2 , g_stagesize.height/2, 1, 0, FALSE, &g_wallimage, 1, 1.0f); #ifdef _DEBUG for( int i=0; i<g_usedline_num; i++ ){ DrawLine2D(g_landlines[i], GetColor(128,128,128), 4); } #endif //敵の処理の呼び出し pf_drawenemyfunc(); Vector curvec1 = {0,0} ; int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ); if (key & PAD_INPUT_LEFT){ curvec1 = AddVector( curvec1, LEFTMOVEC ); g_direction = DIRECTION_LEFT; } if (key & PAD_INPUT_RIGHT){ curvec1 = AddVector( curvec1, RIGHTMOVEC ); g_direction = DIRECTION_RIGHT; } //地面との当たり判定 BOOL ontheground = FALSE; //着地フラグ Ball2D jikifeet[2] = { { {g_jikipos.x - 8, g_jikipos.y + 26} , 8}, { {g_jikipos.x + 8, g_jikipos.y + 26} , 8} }; Line2D *phitland, *phitwall; bool hit = CollisionLandLines( jikifeet, 2, &phitland, &phitwall ); if (hit == TRUE){ //地面としてヒットした線があるかチェック if ( phitland != NULL ){ //自キャラが下方向に移動しているかチェックする g_jikivector.x = 0; if ( (g_nowjumping == TRUE) ){ //ジャンプ中 if ( g_jikivector.y > 0 ){ g_jikivector.y = 0; g_nowjumping = FALSE; } } else { //非ジャンプ中 g_jikivector.y = 0; } ontheground = TRUE; //線の傾きを反映 curvec1 = RotateVector(curvec1, phitland->katamuki); //移動する足場に対する処理 if ( fabs(phitland->speed.x) > 0 || fabs(phitland->speed.y) > 0 ){ g_jikipos = AddVectorInFrameTime(g_jikipos, phitland->speed); } } //壁としてヒットした線があるかチェック if ( phitwall != NULL ){ //もし移動方向に壁があるなら、その方向に移動できないようにする Point2D curpos = { g_jikipos.x, g_jikipos.y+26 }; Line2D myline1 = { curpos, AddVector(curpos, g_jikivector) }; Line2D myline2 = { curpos, AddVector(curpos, curvec1) }; if( (HitTestLineAndLine(myline1, *phitwall) == TRUE) || (HitTestLineAndLine(myline2, *phitwall) == TRUE) ){ curvec1.x = 0; curvec1.y = 0; g_jikivector.x = 0; } } } //ジャンプ処理 if( key & PAD_INPUT_A ){ if ( g_akey_previous == FALSE ){ curvec1 = AddVector( curvec1, JUMPMOVEC ); g_nowjumping = TRUE; g_akey_previous = TRUE; } } else { g_akey_previous = FALSE; } //弾の発射・移動 if (key & PAD_INPUT_B) { if (g_bkey_previous == FALSE){ ShootWeapon(); //武器を発射したらその時点の移動はストップする curvec1.x = 0; curvec1.y = 0; g_bkey_previous = TRUE; } } else { g_bkey_previous = FALSE; } DrawWeapon(); //自キャラ座標の計算 if ( ontheground == TRUE ){ //接地時 g_jikivector = AddVector( g_jikivector, curvec1 ); } else { //ジャンプ中 g_jikivector = AddVectorInFrameTime( g_jikivector, GRAVITY ); if(g_jikivector.y > 400) g_jikivector.y = 400; } g_jikipos = AddVectorInFrameTime( g_jikipos, g_jikivector ); //自キャラの描画 if ( (key & PAD_INPUT_B) && (GetPassedTime(0) < 500) ){ //武器の発射 DrawAnimation(g_jikipos.x,g_jikipos.y, 1, 0, g_direction, &g_jikiimage[1],1, 4.0f); }else{ if ( (ontheground == TRUE) && (g_nowjumping == FALSE) ){ if ( fabs(curvec1.x) > ZEROVALUE ){ //走る DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction, &g_jikiimage[2],6, 12 ); }else{ //停止状態 DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction, &g_jikiimage[0],1, 12 ); } }else{ //ジャンプ状態 if ( fabs(g_jikivector.x) < ZEROVALUE ){ DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction, &g_jikiimage[8],1, 12 ); }else{ DrawAnimation( g_jikipos.x,g_jikipos.y, 1, 0, g_direction, &g_jikiimage[9],1, 12 ); } } } //スプラッシュアニメーションの表示 DrawSplash(); //スクロール if (XInView(g_jikipos.x) <= SCROLL_LIMIT) ScrollToLeft(g_jikipos.x); if (XInView(g_jikipos.x) >= 639 - SCROLL_LIMIT) ScrollToRight(g_jikipos.x); if (YInView(g_jikipos.y) <= SCROLL_LIMIT) ScrollToUp(g_jikipos.y); if (YInView(g_jikipos.y) >= 479 - SCROLL_LIMIT) ScrollToDown(g_jikipos.y); //終了判定 if ( g_gamestate == GAME_MAIN ){ //敵と武器、自キャラの当たり判定 if ( CollisionCharacter() == TRUE ) GoGameOver(); //自キャラが画面外に落ちてもゲームオーバー if ( g_jikipos.y > 1000 ) GoGameOver(); //ゲームクリアチェック if (pf_checkclearfunc() == TRUE) GoGameClear(); } } //メインループ void MyMain(){ switch(g_gamestate){ case GAME_TITLE: DrawGameTitle(); break; case GAME_MAIN: DrawGameMain(); break; case GAME_OVER: DrawGameMain(); DrawGameOver(); break; case GAME_CLEAR: DrawGameMain(); DrawGameClear(); break; } } //マップ用のラインデータを読み込む関数 int LoadMap(char *pfname){ int f; //ファイルハンドル char buf[1024]; //テキスト一時読み込み一時バッファ f = FileRead_open(pfname); if (f==0) return -1; //読み込みエラー g_usedline_num = 0; while( FileRead_eof(f) == 0 ) //終端チェック { // 一行読み込み FileRead_gets( buf, 1023, f ) ; int sx,sy,ex,ey; sscanf_s(buf, "%d,%d,%d,%d", &sx, &sy, &ex, &ey); Line2D l = { {(float)sx, (float)sy}, {(float)ex, (float)ey}, 0, {0,0}}; SetLine2DKatamuki(&l); g_landlines[g_usedline_num] = l; g_usedline_num++; } // ファイルを閉じる FileRead_close( f ) ; return 0; } //色々なファイルの読み込み int LoadFiles(){ //画像ファイルの読み込み if (LoadDivGraph("media\\player01.bmp", 11,11,1,64,64,g_jikiimage) == -1) return -1; g_weaponimage = LoadGraph("media\\weapon01.bmp", 0); if (g_weaponimage == -1) return -1; g_bulletimage = LoadGraph("media\\bullet01.bmp", 0); if (g_bulletimage == -1) return -1; g_titleimage = LoadGraph("media\\title01.bmp", 0); if (g_titleimage == -1) return -1; if (LoadDivGraph("media\\clash01.bmp", 3,3,1,64,106,g_clashimage) == -1) return -1; g_hitimage = LoadGraph("media\\hit01.bmp", 0); if (g_hitimage == -1) return -1; //音楽ファイルの読み込み g_backmusic = LoadSoundMem("media\\music02.wav"); if (g_backmusic == -1) return -1; g_clip1 = LoadSoundMem("media\\power33.wav"); if (g_clip1 == -1) return -1; g_clip2 = LoadSoundMem("media\\swing25_c.wav"); if (g_clip2 == -1) return -1; g_clip3 = LoadSoundMem("media\\hit_p07.wav"); if (g_clip3 == -1) return -1; g_clip4 = LoadSoundMem("media\\crash18_d.wav"); if (g_clip4 == -1) return -1; g_clip5 = LoadSoundMem("media\\fall05.mp3"); if (g_clip5 == -1) return -1; //ゲームの初期化 pf_initgamefunc(); return 1; } こんな感じです。 CollisionLandLines関数が、当たり判定の部分です。
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.5 )
名前:管理人 日時:2009/02/04 23:53

すいません、myhelper.h や mymain.h, chap4.h 等のヘッダファイルの 中身も貼り付けて頂けないでしょうか? Enemy 構造体や Bullet 構造体がどのような 中身なのか分からないと、原因を判断できません。
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.6 )
名前:初心者 日時:2009/02/05 22:09

myhelper.h #include "DxLib.h" #include <limits.h> #include <math.h> //構造体宣言 //座標またはベクトルを記録する構造体 struct Vector{ float x,y; }; typedef Vector Point2D; //線を記録する構造体 struct Line2D{ Point2D startpos, endpos; float katamuki; //傾きをラジアン値で記録 Vector speed; //移動している場合は速度をセット }; //球体を記録する構造体 struct Ball2D{ Point2D position; float hankei; //半径 }; //四角形を記録する構造体 struct Rect2D{ Point2D lefttop; Point2D rightbottom; float width; float height; }; //ライブラリ関数 Point2D PosInView(Point2D in); int XInView(float inx); int YInView(float iny); void ScrollToLeft(float jikiposx); void ScrollToRight(float jikiposx); void ScrollToUp(float jikiposy); void ScrollToDown(float jikiposy); void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness); void DrawCircleInView(float x, float y, float r, int Color, int FillFlag); void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag, int *imgarray, int allframe, float fps); //ベクトル関数 Vector CreateVector(Vector in, float veclen); Vector AddVector(Vector v1, Vector v2); Vector SubVector(Vector v1, Vector v2); Vector AddVectorInFrameTime(Vector pos, Vector speed); Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel); Vector Normalize(Vector in); Vector RotateVector(Vector in, float radian); float VectorLengthSquare(Vector in); float DotProduct(Vector v1, Vector v2); float CrossProduct(Vector v1, Vector v2); void SetLine2DKatamuki(Line2D *in); void DrawLine2D(Line2D in, int Color, int Thickness); void DrawBall2D(Ball2D in, int Color, int Fill); //当たり判定関数 bool HitTestLineAndBall(Line2D linein, Ball2D ballin); bool IsPointAtLineFace(Line2D linein, Point2D ptin); bool HitTestLineAndLine(Line2D line1, Line2D line2); bool HitTestBallAndBall(Ball2D a, Ball2D b); bool HitTestPointAndBox(Rect2D rect, Point2D pt); //タイマー関数 void SetSimpleTimer(int idx, int time); int GetPassedTime(int idx); //グローバル変数 extern float g_frametime; extern Rect2D g_framerect; //画面領域(当たり判定) extern Point2D g_current_field_pos; //現在の左上座標 extern Rect2D g_stagesize; //ステージサイズ //定数宣言 const float ZEROVALUE = 1e-10f; const float PIE = 3.1415926f; const int SCROLL_LIMIT = 200; mymain.h//mymain.cppで宣言されている構造体、関数など //構造体宣言 //敵データ struct Enemy{ BOOL used; //使用中フラグ Point2D position; //位置 float hankei; //当たり判定領域の大きさ BOOL hanten; //画像の左右反転フラグ int life; //生命力 int temp1; //自由に使える変数 }; //自キャラの武器 struct Weapon{ BOOL used; //使用中フラグ Point2D position; //位置 Vector movec; //移動量 BOOL hanten; //画像の左右反転フラグ }; //敵の弾01 struct Bullet{ bool used; Ball2D bpos; Vector distance; //弾の移動方向 }; //一時アニメーション struct SplashAnimation{ bool used; //使用中フラグ int life; //表示持続時間 int starttime; //表示を開始した時間 Point2D position; //場所 int *imgarray; //アニメパターンなどのデータ int allframe; float fps; bool hanten; //画像の左右反転フラグ }; //定数 //自キャラの移動に関するデータ const Vector RIGHTMOVEC = {120, 0}; const Vector LEFTMOVEC = {-120, 0}; const Vector JUMPMOVEC = {0, -180}; const Vector GRAVITY = {0, 300}; //重力加速度 //向き const BOOL DIRECTION_RIGHT = FALSE; const BOOL DIRECTION_LEFT = TRUE; //敵キャラに関するデータ const int MAXENEMY = 24; //配列の要素数(敵の最大数) //マップに関するデータ const int MAXLANDLINE = 128; //自キャラの武器に関するデータ const int MAXWEAPON = 3; //武器の数 const Vector WEAPONVECTOR = {56,0}; //武器の当たり判定用ベクトル const Vector WEAPONSPEED = {500.0f, 0}; //武器の移動速度 //敵キャラの弾に関するデータ const int MAXBULLET = 20; //配列の要素数 const float BULLETSPEED = 100; //敵弾の速度 const int BULLETFREQ = 3000; //弾の発射間隔 //一時アニメーションに関するデータ const int MAXSPLASH = 16; extern SplashAnimation g_splashes[]; //グローバル変数のextern宣言 //前回のキーの状態を記録する extern BOOL g_akey_previous; extern BOOL g_bkey_previous; //自キャラのデータ extern Point2D g_jikipos; //自キャラの座標 extern Vector g_jikivector; //自キャラのベクトル extern BOOL g_direction; //自キャラの向き extern BOOL g_nowjumping; //現在ジャンプ中か否か extern Weapon g_weapons[MAXWEAPON]; //敵キャラに関するデータ extern int g_usedenemy_num; //実際に使用する数 extern Enemy g_enemies[] ; extern Bullet g_ebullets[]; //地面を表す線 extern int g_usedline_num; //実際に使用している線の数 extern Line2D g_landlines[MAXLANDLINE]; //画像ハンドル extern int g_jikiimage[11]; extern int g_backimage; extern int g_wallimage; extern int g_weaponimage; extern int g_bulletimage;; extern int g_titleimage; extern int g_clashimage[3]; extern int g_hitimage; extern int g_backmusic; //バックで再生する音楽 extern int g_clip1, g_clip2, g_clip3, g_clip4, g_clip5; //ゲーム状態の記録 enum GameState{ GAME_TITLE, GAME_MAIN, GAME_OVER, GAME_CLEAR }; extern GameState g_gamestate; //他から呼び出されるMyMainの関数宣言 void MyMain(); int LoadMap(char *pfname); int LoadFiles(); chap4.h //関数プロトタイプ宣言 void InitializeGame04(); void DrawEnemies04(); BOOL CheckClearJyouken04(); こんな感じです。
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.7 )
名前:管理人 日時:2009/02/07 01:01

うーん2/5に貼り付けて頂いた構造体の中身には2/4に貼り付けていただいたプログラムの中で 使用されている jiki_life が無いですね・・・ 私の返信が日を跨いでいるから、その間にソースが変化したということでしょうか? 何度も申し訳ありませんが、ソースファイルも沢山あるようですし、お手数ですが宜しければ BQE00322(アットマーク)nifty.com に現在初心者さんが作成されているプログラムの プロジェクトフォルダを丸ごと zip 等で圧縮して送って頂けないでしょうか? 全体のプログラムを拝見すれば原因が分かると思いますので・・・
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.8 )
名前:初心者 日時:2009/02/09 19:35

メールのことでしょうか?
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.9 )
名前:管理人 日時:2009/02/09 19:40

はい、BQE00322(アットマーク)nifty.com 、(アットマーク)と書かれているところを@に変えた アドレスに可能であれば送ってください
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.10 )
名前:初心者 日時:2009/02/09 22:01

自分で変更していないものを送ります。
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.11 )
名前:初心者 日時:2009/02/09 22:29

すいません。 メールソフトの不具合?でメールが送信できません。
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.12 )
名前:管理人 日時:2009/02/10 19:35

> メールソフトの不具合 どのような不具合か分かりますでしょうか? もしお使いのメールサービスの容量制限や添付ファイル制限等でしたらお手上げですが・・・
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.13 )
名前:初心者 日時:2009/02/10 23:45

Message size exceeds fixed maximum message size こんな感じのエラーが出ます。
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.14 )
名前:管理人 日時:2009/02/11 00:10

送信できるメールのサイズの最大値を超えてしまっているというエラーですね・・・ どうやら現在初心者さんがお使いのメールサービスではプログラムを送って頂くのは難しそうです ところで、「自分で変更していないものを送ります。」とのことですが この度問題が発生しているというプログラムは、初心者さんが組まれたものでは 無いのでしょうか?
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.15 )
名前:初心者 日時:2009/02/12 21:51

>送信できるメールのサイズの最大値を超えてしまっているというエラーですね・・・ このプログラムを分けて送ったらどうでしょうか? >この度問題が発生しているというプログラムは、初心者さんが組まれたものでは 無いのでしょうか? 14歳からはじめるc言語ゲームプログラミング教室という本を改造していて、その改造がうまくいかないから、教えてもらっています。

Page: 1 | 2 |