c++ - 收到此警告,“NSWindow 在 Xcode C++ 中检测到过多的实时窗口计数为 101”
问题描述
我正在尝试使用 SDL2 在 C++ 中使用 Xcode 制作游戏。我收到了不同的错误,但这是最新的
[窗口] 警告:NSWindow 检测到超过 101 的实时窗口计数。在超过 100 的阈值后创建了类“SDLWindow”的窗口 0x5679。这个窗口不一定是原因,每个窗口类只会显示一次此警告. ( 0 AppKit 0x00007fff2d5a821c -[NSWindow _setWindowNumber:] + 800 1 AppKit 0x00007fff2d5d5bbe _NSCreateWindowWithOpaqueShape2 + 435 2 AppKit 0x00007fff2d5d40b8 -[NSWindow _commonAwake] + 1121 3 AppKit 0x00007fff2d5a72f8 -[NSWindow _commonInitFrame:styleMask:backing:defer:] + 800 4 AppKit 0x00007fff2d5a6ae2 -[ NSWindow _initContent:styleMask:backing:defer:contentView:
这是我的代码
主文件
#include <iostream>
#include "Game.h"
Game *game = 0;
int main(int argc, const char * argv[])
{
game = new Game;
while(game->init())
{
game->run();
}
delete game;
return 0;
}
游戏.h
#ifndef Game_h
#define Game_h
#include "SDL2/SDL.h"
#include "SDL2_image/SDL_image.h"
#define FPS_DELAY 500
#include "Robin.h"
class Game
{
public:
Game();
~Game(){};
bool init();
void run();
private:
SDL_Window* window;
SDL_Renderer* renderer;
SDL_Texture* texture;
bool running;
Robin* robin;
//Snevil* snevil;
//Level* level;
unsigned int lastTick, fpsTick, fps, frameCount;
void handleEvents();
void update(float delta);
void render(float delta);
void clean();
void NewGame();
};
#endif /* Game_h */
游戏.cpp
#include <stdio.h>
#include <iostream>
#include "Game.h"
Game::Game()
{
window = 0;
renderer = 0;
}
bool Game::init()
{
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("Big Trouble in Little Birthday", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
if(!window)
{
std::cout << "Error creating window:" << SDL_GetError() << std::endl;
return false;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if(!renderer)
{
std::cout << "Error creating renderer:" << SDL_GetError() << std::endl;
return false;
}
SDL_Surface* surface = IMG_Load("FILL");
texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
lastTick = SDL_GetTicks();
fpsTick = lastTick;
fps = 0;
frameCount = 0;
return true;
}
void Game::run()
{
robin = new Robin(renderer);
while(running)
{
handleEvents();
unsigned int curTick = SDL_GetTicks();
float delta = (curTick - lastTick) / 1000.0f;
if(curTick - fpsTick >= FPS_DELAY)
{
fps = frameCount * (1000.0f / (curTick - fpsTick));
fpsTick = curTick;
frameCount = 0;
char buf[100];
std::snprintf(buf, 100, "Big Trouble in Little Birthday (fps: %u)", fps);
SDL_SetWindowTitle(window, buf);
}
else
{
frameCount++;
}
lastTick = curTick;
update(delta);
render(delta);
}
delete robin;
clean();
SDL_Quit();
}
void Game::handleEvents()
{
SDL_Event event;
if(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
SDL_Quit();
break;
default:
break;
}
}
}
void Game::update(float delta)
{
robin->update(delta);
}
void Game::render(float delta)
{
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
robin->update(delta);
SDL_RenderPresent(renderer);
}
void Game::clean()
{
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
SDL_Quit();
}
void Game::NewGame()
{
}
实体.h
#ifndef Entity_h
#define Entity_h
#include "SDL2/SDL.h"
#include "SDL2_image/SDL_image.h"
class Entity
{
public:
Entity(SDL_Renderer* renderer);
virtual ~Entity(){}
float x, y, width, height;
virtual void update(float delta);
virtual void render(float delta);
bool Collides(Entity* other);
protected:
SDL_Renderer* renderer;
};
#endif /* Entity_h */
实体.cpp
#include <stdio.h>
#include "Entity.h"
Entity::Entity(SDL_Renderer* renderer)
{
this->renderer = renderer;
x = 0;
y = 0;
width = 1;
height = 1;
}
void Entity::update(float delta)
{
}
void Entity::render(float delta)
{
}
bool Entity::Collides(Entity* other)
{
if(x + width > other ->x && x < other->x + other->width && y + height > other->y && y < other->y + other->height)
{
return true;
}
return false;
}
罗宾.h
#ifndef Robin_h
#define Robin_h
#include "Entity.h"
class Robin : public Entity
{
public:
Robin(SDL_Renderer* renderer);
~Robin();
void update(float delta);
void render(float delta);
private:
SDL_Texture* texture;
};
#endif /* Robin_h */
罗宾.cpp
#include <stdio.h>
#include "Robin.h"
Robin::Robin(SDL_Renderer* renderer) : Entity(renderer)
{
SDL_Surface* surface = IMG_Load("/Users/noah/Desktop/BTLB/assets/Robin.png");
texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
width = 16;
height = 16;
}
Robin::~Robin()
{
SDL_DestroyTexture(texture);
}
void Robin::update(float delta)
{
}
void Robin::render(float delta)
{
SDL_Rect rect;
rect.x = (int)(x + 0.5f);
rect.y = (int)(y + 0.5f);
rect.w = width;
rect.h = height;
SDL_RenderCopy(renderer, texture, 0, &rect);
}
解决方案
推荐阅读
- python - 如何索引未选择的选项
- jenkins-groovy - 将变量从 shell 脚本传递到 groovy
- aws-lambda - 使用 Terraform 的 AWS API Gateway 中启用 CORS 的端点
- python - 如何合并两个 pandas DataFrame 并正确处理“已删除”的重复值?
- java - Android:如何将图像的尺寸调整为适合 ImageView?
- java - 可重入锁条件
- javascript - 为什么我不能在登录后控制台记录 Facebook accessToken 并在之后重定向到 URL?
- kubernetes - Minikube 失去对节点的跟踪
- mysql - MySQL 从一个表中选择唯一记录,其中两个选择查询使用 NOT IN
- python - 为什么我的 ARIMA 预测远小于实际值?