環境は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(); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。