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

2023-12-17 15:20

本文主要是介绍第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;}//输出窗口IDcout << 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_INCLUDEDnamespace 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

这篇关于第15章 《乐趣》Page305~311犯的错误,窗口GetID()为0的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504857

相关文章

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动