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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2659閲覧

GLEWライブラリで未定義の外部シンボルというエラーが出る原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/06 08:19

環境はVisual studio です。Windows10です。

追加のインクルードディレクトリにパスを追加
追加のライブラリディレクトリにパスを追加
追加の依存ファイルにパスを追加

(ダウンロードしたサイト): https://sourceforge.net/projects/glew/files/glew/2.1.0/

イメージ説明

#include "Game.hpp" #include "SpriteComponent.hpp" #include "BGSpriteComponent.hpp" #include "TileMapComponent.hpp" #include "Asteroid.hpp" //標準ライブラリ関係 #include <iostream> #include <vector> #include <unordered_map> //SDLライブラリ関係 #include "SDL.h" #include "SDL_image.h" //#include "glfw3.h" #include "glew.h" #include "GL.h" //自作ヘッダー関係 #include "Actor.hpp" #include "Math.h" #include "Ship.hpp" #include "Asteroid.hpp" Game::Game() :mWindow(nullptr) ,mRenderer(nullptr) ,mTicksCount(0) ,mIsRunning(true) { mUpdatingActors = 0; } //初期化 bool Game::Initialize() { // Initialize SDL int sdlResult = SDL_Init(SDL_INIT_VIDEO);//SDLライブラリを初期化 int sdlimage = IMG_Init(IMG_INIT_PNG);//SDL_imageを初期化 if (sdlResult != 0) { //SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); return false; } //oepngl を設定 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3); SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,1); // Create an SDL Window mWindow = SDL_CreateWindow( "Game Programming in C++ (Chapter 2)", // Window title 100, // Top left x-coordinate of window 100, // Top left y-coordinate of window 1024, // Width of window 768, // Height of window SDL_WINDOW_OPENGL // Flags (0 for no flags set) ); mContext = SDL_GL_CreateContext(mWindow); glewExperimental = GL_TRUE; if(glewInit() != GL_TRUE) { //SDL_Log("失敗"); return false; } glGetError(); if (!mWindow) { //SDL_Log("Failed to create window: %s", SDL_GetError()); return false; } //// Create SDL renderer mRenderer = SDL_CreateRenderer( mWindow, // Window to create renderer for -1, // Usually -1 SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC ); if (!mRenderer) { //SDL_Log("Failed to create renderer: %s", SDL_GetError()); return false; } LoadData();//画像データ読み込み return true; } void Game::LoadData() { //プレイヤーを初期化 mShip = new Ship(this); mShip->SetPosition(Vector2(100,100)); mShip->SetScale(1.5f); //惑星をランダム生成 const int numAsteroids = 20;//生成数 for(int i = 0; i < numAsteroids; i++) { new Asteroid(this); } } //メインゲームループ void Game::RunLoop() { while (mIsRunning) { ProcessInput(); UpdateGame(); GenerateOutput(); } } void Game::AddAsteroid(Asteroid* ast) { mAsteroids.emplace_back(ast); } void Game::RemoveAsteroid(Asteroid* ast) { auto iter = std::find(mAsteroids.begin(),mAsteroids.end(),ast); if(iter != mAsteroids.end()) { mAsteroids.erase(iter); } } //キー入力 void Game::ProcessInput() { SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { // If we get an SDL_QUIT event, end loop case SDL_QUIT: mIsRunning = false; break; } } // Get state of keyboard const Uint8* keyState = SDL_GetKeyboardState(NULL); mUpdatingActors = true; for(auto actor : mActors) { actor->ProcessInput(keyState); } mUpdatingActors = false; // If escape is pressed, also end loop if (keyState[SDL_SCANCODE_ESCAPE]) { mIsRunning = false; } } //計算 void Game::UpdateGame() { //フレームレートを制御 while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)); float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f; if (deltaTime > 0.016f){ deltaTime = 0.016f; } mTicksCount = SDL_GetTicks(); mUpdatingActors = true;//すべてのアクターを更新 for(auto actor : mActors) { actor->Update(deltaTime); } mUpdatingActors = false; //待ちになっていたアクターをmActorsに移動 for(auto pending : mPendingActors) { mActors.emplace_back(pending); } mPendingActors.clear(); std::vector<Actor*> deadActors; for(auto actor : mActors) { if(actor->GetState() == Actor::EDead) { deadActors.emplace_back(actor); } } //死んだアクターを消す(mActorsから削除される) for(auto actor : deadActors) { delete actor; } } //レンダリング void Game::GenerateOutput() { //SDL_SetRenderDrawColor(mRenderer,0,0,255,255);//背景色を青に設定 //SDL_RenderClear(mRenderer);//バックバッファをクリア glClearColor(0.86f,0.68f,0.86f,1.0f); glClear(GL_COLOR_BUFFER_BIT); // 全てのスプライトをバックバッファに書き込む for (auto sprite : mSprites) { sprite->Draw(mRenderer); } //SDL_RenderPresent(mRenderer);//レンダーに渡す SDL_GL_SwapWindow(mWindow);//レンダーに渡す } //Actorを追加 void Game::AddActor(Actor* actor) { //アクターが更新中なら待ちに追加 if(mUpdatingActors) { mPendingActors.emplace_back(actor); }else { mActors.emplace_back(actor); } } void Game::AddSprite(SpriteComponent* sprite) { //ソート済みの配列で挿入点を見つける //それは自分より順位の高い最初の要素の位置です。 int myDrawOrder = sprite->GetDrawOrder(); auto iter = mSprites.begin(); for (; iter != mSprites.end(); ++iter) { if (myDrawOrder < (*iter)->GetDrawOrder()) { break; } } // Inserts element before position of iterator mSprites.insert(iter, sprite); } void Game::RemoveSprite(SpriteComponent* sprite) { // (We can't swap because it ruins ordering) auto iter = std::find(mSprites.begin(), mSprites.end(), sprite); mSprites.erase(iter); } //SDL_Texture* Game::GetTexture(const std::string& fileName) SDL_Texture* Game::GetTexture(const std::string& fileName) { SDL_Texture* tex = nullptr; // Is the texture already in the map? auto iter = mTextures.find(fileName); if (iter != mTextures.end()) { tex = iter->second; } else { // Load from file SDL_Surface* surf = IMG_Load(fileName.c_str()); if (!surf) { SDL_Log("Failed to load texture file %s", fileName.c_str()); return nullptr; } // Create texture from surface tex = SDL_CreateTextureFromSurface(mRenderer, surf); SDL_FreeSurface(surf); if (!tex) { SDL_Log("Failed to convert surface to texture for %s", fileName.c_str()); return nullptr; } mTextures.emplace(fileName.c_str(), tex); } return tex; } void Game::RemoveActor(Actor* actor) { auto iter = std::find(mPendingActors.begin(),mPendingActors.end(),actor); if(iter != mPendingActors.end()) { std::iter_swap(iter,mPendingActors.end() -1); mPendingActors.pop_back(); } iter = std::find(mActors.begin(),mActors.end(),actor); if(iter != mActors.end()) { std::iter_swap(iter,mActors.end() -1); mActors.pop_back(); } } //画像を読み込んでそのポインターを返す。 SDL_Texture* Game::LoadTexture(std::string file) { SDL_Surface *image = IMG_Load(file.c_str());//画像を読み込み if(image != NULL) { SDL_Texture *text = SDL_CreateTextureFromSurface(mRenderer,image);//Surfaceからテクスチャに変換 SDL_FreeSurface(image);//使わなくなったSurfaceをメモリ開放 if(text != NULL) { return text;//成功すればポインターを返す }else { //エラー処理 printf("Surfaceをテクスチャ変換にに失敗: %s\n",file); exit(1); } }else{ //エラー処理 printf("ファイルロードに失敗: %s\n",file); exit(1); } return NULL; } void Game::Shutdown() { SDL_DestroyRenderer(mRenderer); SDL_GL_DeleteContext(mContext);//opengl SDL_DestroyWindow(mWindow); SDL_Quit(); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

opengl側のlibファイルの指定が抜けていました。自己解決です。
https://qiita.com/babiron_i/items/57f3fd5e45bbdb01319f

投稿2020/08/06 08:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問