質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

644閲覧

タイトルの後にチュートリアルを始めたい

sanosyouya

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/08/30 05:58

//============================================================================= // 終了処理 //============================================================================= void Uninit(void) { // 終了のモードをセット SetMode(MODE_MAX); // フェードの終了処理 UninitFade(); // サウンドの終了処理 UninitSound(); // 入力の終了処理 UninitInput(); // カメラの終了処理 UninitCamera(); // レンダラーの終了処理 UninitRenderer(); } //============================================================================= // 更新処理 //============================================================================= void Update(void) { // 入力の更新処理 UpdateInput(); // カメラ更新 UpdateCamera(); // モードによって処理を分ける switch (g_Mode) { case MODE_TITLE: // タイトル画面の更新 UpdateTitle(); break; case MODE_TUTORIAL: UpdateBG2(); UpdatePlayer2(); UpdateEnemy2(); break; case MODE_GAME: // ゲーム画面の更新 UpdateBG(); UpdatePlayer(); UpdateEnemy(); UpdateBullet(); UpdateScore(); break; case MODE_RESULT: // リザルト画面の更新 UpdateResult(); break; } UpdateFade(); // フェードの更新処理 } //============================================================================= // 描画処理 //============================================================================= void Draw(void) { // バックバッファクリア Clear(); SetCamera(); // 2Dの物を描画する処理 SetViewPort(TYPE_FULL_SCREEN); // Z比較なし SetDepthEnable(FALSE); // ライティングを無効 SetLightEnable(FALSE); // モードによって処理を分ける switch (g_Mode) { case MODE_TITLE: // タイトル画面の描画 DrawTitle(); break; case MODE_TUTORIAL: DrawBG2(); DrawPlayer2(); DrawEnemy2(); break; case MODE_GAME: // ゲーム画面の描画 DrawBG(); DrawBullet(); // 重なる順番を意識してね DrawEnemy(); DrawPlayer(); DrawScore(); break; case MODE_RESULT: // リザルト画面の描画 DrawResult(); break; } DrawFade(); // フェード画面の描画 #ifdef _DEBUG // デバッグ表示 DrawDebugProc(); #endif // バックバッファ、フロントバッファ入れ替え Present(); } long GetMousePosX(void) { return g_MouseX; } long GetMousePosY(void) { return g_MouseY; } #ifdef _DEBUG char* GetDebugStr(void) { return g_DebugStr; } #endif //============================================================================= // モードの設定 //============================================================================= void SetMode(int mode) { // モードを変える前に全部メモリを解放しちゃう StopSound(); // まず曲を止める // モードを変える前に全部メモリを解放しちゃう // タイトル画面の終了処理 UninitTitle(); // BGの終了処理 UninitBG(); // プレイヤーの終了処理 UninitPlayer(); // エネミーの終了処理 UninitEnemy(); // バレットの終了処理 UninitBullet(); // スコアの終了処理 UninitScore(); // リザルトの終了処理 UninitResult(); UninitPlayer2(); UninitEnemy2(); UninitBG2(); g_Mode = mode; // 次のモードをセットしている switch (g_Mode) { case MODE_TITLE: // タイトル画面の初期化 InitTitle(); PlaySound(SOUND_LABEL_BGM_maou); break; case MODE_TUTORIAL: InitBG2(); InitPlayer2(); InitEnemy2(); PlaySound(SOUND_LABEL_BGM_maou); break; case MODE_GAME: // ゲーム画面の初期化 InitBG(); InitPlayer(); InitEnemy(); InitBullet(); InitScore(); // ロードゲームだったらすべての初期化が終わった後にセーブデータを読み込む if (g_LoadGame == TRUE) { LoadData(); g_LoadGame = FALSE; // ロードしたからフラグをClearする } PlaySound(SOUND_LABEL_BGM_sample001); break; case MODE_RESULT: InitResult(); PlaySound(SOUND_LABEL_BGM_sample002); break; case MODE_MAX: break; } } ``````ここに言語を入力 //============================================================================= // 更新処理 //============================================================================= void UpdateTitle(void) { if (GetKeyboardTrigger(DIK_RETURN)) {// Enter押したら、ステージを切り替える SetFade(FADE_OUT, MODE_TUTORIAL); } // ゲームパッドで入力処理 else if (IsButtonTriggered(0, BUTTON_START)) { SetFade(FADE_OUT, MODE_TUTORIAL); } else if (IsButtonTriggered(0, BUTTON_B)) { SetFade(FADE_OUT, MODE_TUTORIAL); } // セーブデータをロードする? if (GetKeyboardTrigger(DIK_L)) { SetLoadGame(TRUE); SetFade(FADE_OUT, MODE_TUTORIAL); } // テストでエフェクトの発生場所を移動させる float speed = 4.0f; if (GetKeyboardPress(DIK_DOWN)) { effect_dy += speed; } else if (GetKeyboardPress(DIK_UP)) { effect_dy -= speed; } if (GetKeyboardPress(DIK_RIGHT)) { effect_dx += speed; } else if (GetKeyboardPress(DIK_LEFT)) { effect_dx -= speed; } #ifdef _DEBUG // デバッグ情報を表示する //PrintDebugProc("Player:↑ → ↓ ← Space\n"); #endif }``` ```ここに言語を入力 コード// エネミー全滅チェック if (g_Enemy2Cnt <= 0) { SetFade(FADE_OUT, MODE_GAME); }

一番上のコードはメインcppの中に書いてあるコードなのですが
ここでチュートリアルモードを宣言していて
次のタイトルのコードの中でタイトル画面でクリックをしたら
次のチュートリアルモードに行くように設定しています
ですが、タイトルの後にチュートリアルモードのいくのではなく
そのまま、ゲームモードに行ってしまいます
一番下のコードはチュートリアルで使用する、敵のコードです
三体のエネミーが全滅したらゲームモードに行くようにしてもチュートリアルが始まらずそのままゲームモード行ってしまいます

解決方法が分かる方はいますか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/08/30 06:47 編集

まずは自分でデバッグしてください. ご自身で用意したモード遷移の機構が想定通り動いてるのかどうかをチェックすれば良いのでは. 例えば, > タイトル画面でクリックをした あたりからの処理を実際に追ってみれば想定と違う動作に出くわすんじゃないですか?
jimbe

2022/08/30 08:06 編集

メインの cpp とは何のことでしょう? コード片だけでは何も分かりません。
dodox86

2022/08/30 07:59

そもそも回答をいただいていたたくさんの過去の質問を放置し過ぎです。質問の丸投げ具合と相まって、これでは誰も回答する気にはなれないでしょう。
fana

2022/08/30 09:23

> ご自身で用意した って書いたけども,質問のリストを見た感じ,この人,自分でコード書いてるのかなぁ? とか…(←失礼な) 仮にどこかから持ってきたコードを改造しようとしては毎度そんなことになっているのであれば,最初から自前で実装していくことを考えた方が良いのではなかろうか.
thkana

2022/08/30 11:24

わかる人は居るでしょうが、ここはデバッグ依頼や製作依頼をする場ではありません。
nonkannagi

2022/09/01 08:44

このコードに関しては一度も自分でコードを組んだといっていませんでしたが、誤解を生んだのでしたら申し訳ございません。 過去の質問に関しては、私のアカウントが不具合を起こしており「解決」にしようとしてもならない状態にあるので放置という形になっております、申し訳ございません
nonkannagi

2022/09/01 08:46

いま別のアカウントになっており、こっちにアカウントで返信させていただきました
guest

回答1

0

解決方法が分かる方はいますか

解決方法…それはデバッグ作業です.

デバッガを使えば捗るでしょうが,単純に何か出力を仕込んでみるような方法(いわゆるprintfデバッグ)でも何でも良いので,まずは実動作を調べて下さい.
(…とだけ書くと,何故か反感を持つ者が存在する様子(?)なので,以下,もうちょっとだけ書く)

例えば,

チュートリアルが始まらずそのままゲームモード行ってしまいます

という現象の理由を調べるなら,モードに関する部分が実際にどのように動作しているのかを確認してみればよいでしょう.
「現在のモード」を決定しているのが g_mode という変数の値だというのであれば,こいつの値がいつどこで何に変わっているのか? を調べれば良いのかもしれません.
実際に行う作業は,「あなたが今現在,何を把握できていて,何を把握できていないのか」次第となるでしょうが,すっごい最初の方から調べていく必要があるなら,例えば…

(1) g_mode という文字列でプログラム全体を検索する

目的は,

  • こいつを指すポインタや参照が存在していないことを確認する.
  • とりあえず↑が無いとしたら,g_mode の値を変更している個所が1箇所(SetMode関数内の g_Mode = mode;)のみであることを確認する.

(これらが確認できない場合は,そもそも関数の役割だとかそういうのが破綻しているということなので,「うまく動かない」とか何とかじゃなくて根本的に書き直した方が…)

※もちろん,バッファオーバランだとか,ポインタ値をてきとーに変更した結果… とかで g_mode の場所をうっかり書き換えてしまう可能性は他にも考えられるけれども,出力を仕込むような方法ではそれを見つけるのは難しいと思う.

(2) SetMode関数がまともであることを確認する

前記(1)がOKだったなら,モード遷移を引き起こすのは SetMode関数のみである,と判断して良いハズだ.
そしたら,このSetMode関数自体がそもそもまともなのか? を確認する必要がある.

少なくともこの関数から抜けた際には,g_mode の値は所望のモード値(引数に与えられた値)になっている必要があるのだろう(それがこの関数の責務の1つであろう)と見えるので,これがちゃんとできているのかを確認する.

例えば,今存在している SetMode関数の名前を,SetMode_ とかに適当に変えて,

void SetMode(int mode) { 現在の g_mode の値と,引数 mode の値を表示する SetMode_( mode ); //本来の関数を呼ぶ 現在の g_mode の値を表示する }

みたいなのを書いて実行してみれば良かろう.
出力結果が異常であれば SetMode 関数の内部に問題があるってことだ.

(3) SetMode(ゲームモード) という呼び出し箇所を突き止める

上記(2)もOKだったとして,その出力を見ていれば,唐突に「ゲームモード」に遷移させる処理が実施されていること(あるいは,予想とは異なり,そんな遷移は実施されていないこと)を確認できるハズ.

遷移が確認されたならば…
例えば SetMode関数を呼び出している全ての行の直前にそれぞれ異なる出力を行う処理を仕込んでもう一度実行してみれば,どこの関数呼び出しが「ゲームモード」へ遷移させているのかがわかるよね.
→以降は,調査すべき事柄とは「何故そこが実行されることになったのだろう?」ということになるので,また必要な調査を行っていけばよい.

まとめ

ご自身でデバッグすればいいと思います.

それでも不明点がある場合には,その点を質問すればよいでしょう.
例えば,「ここの SetMode関数呼び出しが実施されるせいでゲームモードに遷移しちゃうのだということは突き止めたけども,でもこの呼び出しが書かれている関数自体をそもそも誰も呼んでいないハズなのに何故そんなことが…」とかなんとかいうような,具体的な謎に実際に直面したら→それを質問する感じで.

投稿2022/09/01 02:00

編集2022/09/01 02:12
fana

総合スコア11673

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/09/01 02:04

(やったー! 某氏に負けない長文できたよー!) もちろん,大前提として > 「現在のモード」を決定しているのが g_mode という変数の値 みたいなことはわかっている必要があるよ. そもそもそこからわからないような場合には……どうすればいいのだろう? うーん.
nonkannagi

2022/09/01 08:41

「現在のモード」を決定しているのが g_mode という変数の値 これは理解しています。 このコードに書いてある、ほかのモードに変わるためのコードのところに もともとはゲームモードに行くと書いてあったので そこをチュートリアルに行くようにかきかえたのですが、チュートリアルに行かずゲームモードに行ってしまうからここで質問させていただきました (2)(3)に関しても友人と確認しましたが問題はありませんでした 色々な可能性を考え思考しましたが、わからず質問しました
fana

2022/09/01 09:15

> (2)(3)に関しても友人と確認しましたが問題はありませんでした (2)は問題がなかった ← そうですか (3)も問題がなかった ← それどういう意味?
fana

2022/09/01 09:17

仮に話がこの回答のように進んだとしたら,(3)の時点で「ゲームモードに行ってしまう」理由は突き止められているわけで,そしたらもう謎は残っていないのでは? ??? ?????
nonkannagi

2022/09/01 13:09

上記の回答を書いてくれたのは、fanaさんですか?
fana

2022/09/02 01:42

何を尋ねているのかわかりません. 少なくとも「どのアカウントが回答したか」は明確に表示されていると思うのですが…? 「"fana" というアカウントの中の人は常に1人ではなく,入れ替わっているのでは?」とかそういう話がしたいのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問