2017-11-27 12 views
0

私は自分自身を教えています。チュートリアルに続き、画面上を移動するイメージがあります。今私は自分でそれを行い、自分のコードをモジュール化し、それをどうするのかを理解する方法を理解しようとしています。構造体の要素を定義しようとするとエラーが発生する

私はplayer座標を取得するための構造体を作成し、それをgame_loop.hファイルに呼び出しました。構造体から変数を設定することはできません。私はそれを簡潔に保つために重要なビットを含めることを試みた。コード全体を投稿する必要があるかどうかを教えてください。 私は間違っています。

//includes 
#include "game_loop.h" 

//main body 
int main(int argc, char *argv[]) 
{ 
    //TODO make game menu and link it here 

    //TODO make game loop and put it here 
    initSDL(); 
    renderGame(); 
    handleEvent(); 

    //make game cleanup and put it her 
    destroySDL(); 

    return 0; 
} 

INTヘッダファイルgame_loop.h - >

#include <stdio.h> 
#include <SDL2/SDL.h> 
#include <SDL2/SDL_image.h> 
#include "player.h" 

#define pSIZE 64 
#define wWIDTH 1280 
#define wHEIGHT 720 

//variables for starting SDL 
SDL_Event event; 
SDL_Window *window = NULL; 
SDL_Renderer *render = NULL; 

SDL_Surface *bgSurface = NULL; 
SDL_Texture *bgTexture = NULL; 

SDL_Surface *pSurface = NULL; 
SDL_Texture *pTexture = NULL; 

int flags = 0;  //window flags may need to change in the future 

struct Player player; 
player.x = 600; 
player.y = 300; 

void initSDL() 
{ 
//initializing SDL 
    if(SDL_Init(SDL_INIT_VIDEO)!= 0) 
{ 
    printf("ERROR starting SDL: %s\n", SDL_GetError()); 
}else{printf("Starting SDL: Successful.\n");} 

player.hファイルに - >

​​
+0

あなたが使用しているコードを投稿することはできますか?コードを読むことができない場合は、どうしたら間違っているのか分かりますか? –

+0

割り当てるグローバルスコープ内です。それを方法の中に入れてください。 'player.x = 600' – coderredoc

+0

私は質問にコードを追加しました。申し訳ありません、私の最初の時間は、コーディングに関するフォーラムで質問しています。そして、私は質問のコードの書式設定に苦労しています。私はそこに全体のコードを入れようとします – Nelyn

答えて

3

、関数の外側実行可能なコードの行を有します。

Player player; 
player.x = 600; 
player.y = 300; 

第1行目は、av ariable。それは大丈夫です。次の2行は、ステートメントなので、そうではありません。

構造体が定義されるときに構造体を初期化する必要があります。

Player player = { 600, 300 }; 

また、変数をヘッダファイルに定義することはお勧めできません。ヘッダーが複数のソースファイルで使用されている場合、複数の定義のためにエラーが発生します。あなたのヘッダファイルに

、変数は初期化せずにexternとして宣言する必要があります。

extern Player player; 

次にあなたが正確つのソース・ファイルで初期化して定義を置きます。

同様に、関数については、関数の宣言をヘッダーに、関数の定義を1つのソースファイルに記述します。

+0

編集:これは、私は複数行の形式が良いのような仕事をしたようだ。関数内で定義すれば、複数の行ステートメントを使用できますか?チュートリアルの後にはうまくいきましたので、私はその違いによってちょっと混乱していると思います。 ありがとうございます。私はそれを試してみてください。私はちょうど正しい方向にポイントが欲しかった。 – Nelyn

+0

@Nelyn代入文を関数の中に移動すると、代入文を実行できます。他の関数がそれを読み込もうとする前に早めに行う必要があります。ただし、初期化の構文が望ましいです。また、必要に応じて複数の行でイニシャライザを分割して読みやすくすることもできます。 – dbush

+0

ありがとうございました。これはちょうど一時的なことですが、ヘッダーに渡すためにメインのものを定義することを計画していますが、最初は作業を開始しようとしています。ラインを壊す上で素晴らしい。私はそれを考え、構造体が成長するとガンナはそれをしました。私はちょうどそれをテストするために2つの変数があります。ヘッダーファイルを作成するのは初めてのことですので、情報と忍耐力に感謝します。 – Nelyn

関連する問題