第15章 《乐趣》Page305~311(代码简化版)犯的错误,窗口GetID()为0的问题

Page305~311, 第一遍

//main.cpp
#include <iostream>
#include <SDL2/SDL.h>
#include "sdl_initiator.hpp"
#include "sdl_error.hpp"
#include "sdl_window.hpp"

using namespace std;

int main(int argc, char* argv[])
{
    sdl2::Initiator::Instance().Init(SDL_INIT_VIDEO
                                     | SDL_INIT_AUDIO
                                     | SDL_INIT_EVENTS
                                     | SDL_INIT_TIMER);

    if(!sdl2::Initiator::Instance())//重载转换符
    {
        cerr << "初始化就出错,没得玩了!"
             << sdl2::last_error() << endl;
        return -1;
    }

    //创建并居中显示宽640高480的游戏窗口
    sdl2::Window wnd("hello sdl"
                     , sdl2::WindowPosition().Centered(true, true)
                     , 640, 480
                     //使用空的特性标志
                     , sdl2::WindowFlags());
    if(!wnd)
    {
        cerr << sdl2::last_error() << endl;
        return -1;
    }
    //输出窗口ID
    cout << wnd.GetID() << endl;

    wnd.SetOpacity(0.5); //设置不透明度0.5,也就是相当于一半的透明度
    SDL_Delay(3000);
    wnd.Hide();
    SDL_Delay(1000);
    wnd.Show();
    SDL_Delay(1000);

    return 0;
}
//sdl_window.hpp
#ifndef SDL_WINDOW_HPP_INCLUDED
#define SDL_WINDOW_HPP_INCLUDED
#include <SDL2/SDL.h>

namespace sdl2
{

struct WindowPosition
{
    WindowPosition() //默认构造,_x,_y都使用系统默认位置
        : _x(SDL_WINDOWPOS_UNDEFINED), _y(SDL_WINDOWPOS_UNDEFINED)//SDL_WINDOWPOS_UNDEFINED会将窗口放到中间
    {

    }

    //设置为居中,注意返回当前对象的引用
    WindowPosition& Centered(bool x_centered = true
                             , bool y_centered = true)
    {
        if(x_centered)
            _x = SDL_WINDOWPOS_CENTERED;
        if(y_centered)
            _y = SDL_WINDOWPOS_CENTERED;
    }

    int _x, _y;
};

struct WindowFlags
{
    WindowFlags() //默认构造,用于构建一个没有指定任何特性的普通窗口
        : _flags(0)
    {

    }

    Uint32 _flags;
};

struct Window
{
public:
    Window(char const* title
           , WindowPosition const& win_position
           , int w, int h
           , WindowFlags const& win_flags)
    {
        _window = SDL_CreateWindow(title
                                   , win_position._x, win_position._y
                                   , w, h
                                   , win_flags._flags);
    }

    ~Window()
    {
        if(_window) //_window不是空指针
        {
            SDL_DestroyWindow(_window);
        }
    }

    explicit operator bool() const
    {
//        return 0 != _window;
        return _window != nullptr;
    }

    Uint32 GetID()
    {
        return SDL_GetWindowID(_window);
    }

    bool SetOpacity(float opacity)
    {
        return 0 == SDL_SetWindowOpacity(_window, opacity);
    }

    void Hide()
    {
        SDL_HideWindow(_window);
    }

    void Show()
    {
        SDL_ShowWindow(_window);
    }

    SDL_Window* _window;
};

}//sdl2

#endif // SDL_WINDOW_HPP_INCLUDED
//sdl_initiator.hpp
#ifndef SDL_INITIATOR_HPP_INCLUDED
#define SDL_INITIATOR_HPP_INCLUDED

namespace sdl2
{

struct Initiator
{
private:
    Initiator()//默认构造
        : _init_result(-1)
    {

    }
public:
    static Initiator& Instance()
    {
        static Initiator Instance;
        return Instance;
    }
    ~Initiator()
    {
        if(_init_result == 0)
        {
            SDL_Quit();
        }
    }

    void GetVersion(Uint8& major, Uint8& minor, Uint8& patch)
    {
        SDL_version ver;
        SDL_GetVersion(&ver);

        major = ver.major;
        minor = ver.minor;
        patch = ver.patch;
    }

    bool Init(Uint32 flags = SDL_INIT_EVERYTHING)
    {
        _init_result = SDL_Init(flags);
        return 0 == _init_result;
    }

//    bool operator bool()
    explicit operator bool() const
    {
        return _init_result == 0;
    }

private:
    int _init_result;
};//Initiator

}//sdl2

#endif // SDL_INITIATOR_HPP_INCLUDED
//sdl_error.hpp
#ifndef SDL_ERROR_HPP_INCLUDED
#define SDL_ERROR_HPP_INCLUDED
#include <SDL2/SDL.h>

namespace sdl2
{
char const* last_error();
}


#endif // SDL_ERROR_HPP_INCLUDED
//sdl_error.cpp
#include "sdl_error.hpp"

namespace sdl2
{

char const* last_error()
{
    return SDL_GetError();
}

}//sdl2

第二遍犯得的错误,见代码注释,第56行

//sdl_window.hpp
#ifndef SDL_WINDOW_HPP_INCLUDED
#define SDL_WINDOW_HPP_INCLUDED

#include <SDL2/SDL.h>

namespace sdl2
{

struct WindowPosition
{
    WindowPosition()//默认构造
        : _x(SDL_WINDOWPOS_UNDEFINED), _y(SDL_WINDOWPOS_UNDEFINED)
    {

    }

    WindowPosition(int x, int y)//常规构造
        : _x(x), _y(y)
    {

    }

    WindowPosition& Centered(bool x_centered = true , bool y_centered = true)
    {
        if(x_centered)
        {
            _x = SDL_WINDOWPOS_CENTERED;
        }
        if(y_centered)
        {
            _y = SDL_WINDOWPOS_CENTERED;
        }
    }
    int _x, _y;
};

struct WindowFlags
{
    WindowFlags()
        : _flags(0)
    {

    }

    Uint32 _flags;
};

struct Window
{
    Window(char const* title
           , WindowPosition const& win_position
           , int w, int h
           , WindowFlags const& win_flags)
    {
//        SDL_CreateWindow(title  //没有为_window赋值,将导致后面获取ID,等一系列的操作失效
        _window = SDL_CreateWindow(title
                           , win_position._x, win_position._y
                           , w, h
                           , win_flags._flags);
    }

    ~Window()
    {
        if(_window)
        {
            SDL_DestroyWindow(_window);
        }
    }

    explicit operator bool () const
    {
        return _window != nullptr;
    }

    Uint32 GetID()
    {
        SDL_assert(_window != nullptr);
        return SDL_GetWindowID(_window);
    }

    void SetOpacity(float opacity)
    {
        SDL_assert(_window != nullptr);
        SDL_SetWindowOpacity(_window, opacity);
    }

    void Hide()
    {
        SDL_HideWindow(_window);
    }
    void Show()
    {
        SDL_ShowWindow(_window);
    }

    SDL_Window* _window;

};//Window

}//sdl2

#endif // SDL_WINDOW_HPP_INCLUDED

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值