首页 > 解决方案 > 收到此警告,“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);
}

标签: c++xcodenswindow

解决方案


推荐阅读