对象属性(CategoryProperties)
属性(Property)是一种可以在运行时通过名称创建和获取的变量。
所有属性都属于一个属性组(属性组ID:SDL_PropertiesID)。
属性组可通过 SDL_CreateProperties 函数创建,通过 SDL_DestroyProperties 函数销毁。
可通过以下函数向属性组添加/获取属性:
- SDL_SetPointerProperty / SDL_GetPointerProperty:操作
void*指针类型 - SDL_SetStringProperty / SDL_GetStringProperty:操作字符串类型
- SDL_SetNumberProperty / SDL_GetNumberProperty:操作有符号64位整数类型
- SDL_SetFloatProperty / SDL_GetFloatProperty:操作浮点类型
- SDL_SetBooleanProperty / SDL_GetBooleanProperty:操作布尔类型
可通过 SDL_ClearProperty 从属性组中移除属性。
函数/类型/枚举/宏 翻译 + 简要说明
| 英文名称 | 中文翻译 | 简要说明 |
|---|---|---|
| SDL_ClearProperty | 清除属性 | 从属性组中移除指定名称的属性 |
| SDL_CopyProperties | 复制属性 | 将一个属性组的所有属性复制到另一个属性组 |
| SDL_CreateProperties | 创建属性组 | 新建一个空的属性组并返回其ID |
| SDL_DestroyProperties | 销毁属性组 | 释放属性组及其所有属性占用的内存 |
| SDL_EnumerateProperties | 枚举属性 | 遍历属性组中所有属性并调用回调函数 |
| SDL_GetBooleanProperty | 获取布尔属性 | 从属性组中读取布尔类型属性值 |
| SDL_GetFloatProperty | 获取浮点属性 | 从属性组中读取浮点类型属性值 |
| SDL_GetGlobalProperties | 获取全局属性组 | 获取SDL全局属性组的ID |
| SDL_GetNumberProperty | 获取数值属性 | 从属性组中读取64位有符号整数属性值 |
| SDL_GetPointerProperty | 获取指针属性 | 从属性组中读取指针类型属性值 |
| SDL_GetPropertyType | 获取属性类型 | 获取指定属性的类型(SDL_PropertyType) |
| SDL_GetStringProperty | 获取字符串属性 | 从属性组中读取字符串类型属性值 |
| SDL_HasProperty | 检查属性存在性 | 判断属性组中是否存在指定名称的属性 |
| SDL_LockProperties | 锁定属性组 | 加锁属性组以保证线程安全 |
| SDL_SetBooleanProperty | 设置布尔属性 | 向属性组写入布尔类型属性值 |
| SDL_SetFloatProperty | 设置浮点属性 | 向属性组写入浮点类型属性值 |
| SDL_SetNumberProperty | 设置数值属性 | 向属性组写入64位有符号整数属性值 |
| SDL_SetPointerProperty | 设置指针属性 | 向属性组写入指针类型属性值 |
| SDL_SetPointerPropertyWithCleanup | 设置带清理的指针属性 | 写入指针属性并指定清理回调函数 |
| SDL_SetStringProperty | 设置字符串属性 | 向属性组写入字符串类型属性值 |
| SDL_UnlockProperties | 解锁属性组 | 释放属性组的线程锁 |
| SDL_CleanupPropertyCallback | 属性清理回调函数类型 | 释放指针属性时的回调函数类型定义 |
| SDL_EnumeratePropertiesCallback | 属性枚举回调函数类型 | 枚举属性时的回调函数类型定义 |
| SDL_PropertiesID | 属性组ID类型 | 标识属性组的唯一ID类型 |
| SDL_PropertyType | 属性类型枚举 | 定义所有支持的属性类型(指针/字符串/数值等) |
| SDL_PROP_NAME_STRING | 属性名字符串宏 | 用于标准化属性名称的宏定义 |
FreeBASIC 示例代码
' 编译前需确保已链接SDL2库
' 编译命令示例:fbc -s console -lSDL2 properties_demo.bas
#include "SDL.bi"
' 错误检查宏
#define CHECK_ERROR(ret, msg) if (ret <> 0) then print msg & " 失败,错误:" & *SDL_GetError() : goto cleanup
Sub DemoProperties()
Dim As SDL_PropertiesID props = SDL_CreateProperties()
If (props = 0) Then
Print "创建属性组失败,错误:" & *SDL_GetError()
Return
End If
Print "成功创建属性组,ID:" & props
' 1. 设置/获取字符串属性
Dim As Integer ret = SDL_SetStringProperty(props, "window.title", "SDL属性示例")
CHECK_ERROR(ret, "设置字符串属性")
Dim As ZString Ptr title = SDL_GetStringProperty(props, "window.title", "默认标题")
Print "读取窗口标题:" & *title
' 2. 设置/获取数值属性(64位整数)
ret = SDL_SetNumberProperty(props, "window.width", 800)
CHECK_ERROR(ret, "设置数值属性")
Dim As Int64 width = SDL_GetNumberProperty(props, "window.width", 640)
Print "读取窗口宽度:" & width
' 3. 设置/获取布尔属性
ret = SDL_SetBooleanProperty(props, "fullscreen", SDL_TRUE)
CHECK_ERROR(ret, "设置布尔属性")
Dim As SDL_bool fullscreen = SDL_GetBooleanProperty(props, "fullscreen", SDL_FALSE)
Print "读取全屏状态:" & IIf(fullscreen = SDL_TRUE, "开启", "关闭")
' 4. 检查属性是否存在
If (SDL_HasProperty(props, "window.height") = SDL_FALSE) Then
Print "属性 window.height 不存在,设置默认值 600"
ret = SDL_SetNumberProperty(props, "window.height", 600)
CHECK_ERROR(ret, "设置默认高度")
End If
' 5. 枚举所有属性(自定义回调函数)
Print vbCrLf & "枚举所有属性:"
Sub EnumerateCallback cdecl (ByVal userdata As Any Ptr, ByVal name As Const ZString Ptr, ByVal type_ As SDL_PropertyType) As SDL_bool
Print "属性名:" & *name & ",类型:" & type_
Return SDL_TRUE ' 继续枚举
End Sub
SDL_EnumerateProperties(props, @EnumerateCallback, Null)
' 6. 清除单个属性
ret = SDL_ClearProperty(props, "fullscreen")
CHECK_ERROR(ret, "清除全屏属性")
If (SDL_HasProperty(props, "fullscreen") = SDL_FALSE) Then
Print vbCrLf & "已成功清除 fullscreen 属性"
End If
cleanup:
' 销毁属性组
If (props <> 0) Then
SDL_DestroyProperties(props)
Print vbCrLf & "已销毁属性组"
End If
End Sub
' 主程序
SDL_Init(SDL_INIT_VIDEO)
DemoProperties()
SDL_Quit()
Print vbCrLf & "按任意键退出..."
Sleep
评论一下?