Files
makefile_cpp/SDL/SDL.html
Admin 18c273768f SDL
2023-09-03 15:44:34 +08:00

5320 lines
488 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="style.css">
<title>Simple DirectMedia Layer</title>
<style>
@font-face {
font-family: octicons-link;
src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff');
}
.markdown-body .octicon {
display: inline-block;
fill: currentColor;
vertical-align: text-bottom;
}
.markdown-body .anchor {
float: left;
line-height: 1;
margin-left: -20px;
padding-right: 4px;
}
.markdown-body .anchor:focus {
outline: none;
}
.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
color: #1b1f23;
vertical-align: middle;
visibility: hidden;
}
.markdown-body h1:hover .anchor,
.markdown-body h2:hover .anchor,
.markdown-body h3:hover .anchor,
.markdown-body h4:hover .anchor,
.markdown-body h5:hover .anchor,
.markdown-body h6:hover .anchor {
text-decoration: none;
}
.markdown-body h1:hover .anchor .octicon-link,
.markdown-body h2:hover .anchor .octicon-link,
.markdown-body h3:hover .anchor .octicon-link,
.markdown-body h4:hover .anchor .octicon-link,
.markdown-body h5:hover .anchor .octicon-link,
.markdown-body h6:hover .anchor .octicon-link {
visibility: visible;
}
.markdown-body {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
color: #24292e;
line-height: 1.5;
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;
font-size: 16px;
line-height: 1.5;
word-wrap: break-word;
}
.markdown-body .pl-c {
color: #6a737d;
}
.markdown-body .pl-c1,
.markdown-body .pl-s .pl-v {
color: #005cc5;
}
.markdown-body .pl-e,
.markdown-body .pl-en {
color: #6f42c1;
}
.markdown-body .pl-s .pl-s1,
.markdown-body .pl-smi {
color: #24292e;
}
.markdown-body .pl-ent {
color: #22863a;
}
.markdown-body .pl-k {
color: #d73a49;
}
.markdown-body .pl-pds,
.markdown-body .pl-s,
.markdown-body .pl-s .pl-pse .pl-s1,
.markdown-body .pl-sr,
.markdown-body .pl-sr .pl-cce,
.markdown-body .pl-sr .pl-sra,
.markdown-body .pl-sr .pl-sre {
color: #032f62;
}
.markdown-body .pl-smw,
.markdown-body .pl-v {
color: #e36209;
}
.markdown-body .pl-bu {
color: #b31d28;
}
.markdown-body .pl-ii {
background-color: #b31d28;
color: #fafbfc;
}
.markdown-body .pl-c2 {
background-color: #d73a49;
color: #fafbfc;
}
.markdown-body .pl-c2:before {
content: "^M";
}
.markdown-body .pl-sr .pl-cce {
color: #22863a;
font-weight: 700;
}
.markdown-body .pl-ml {
color: #735c0f;
}
.markdown-body .pl-mh,
.markdown-body .pl-mh .pl-en,
.markdown-body .pl-ms {
color: #005cc5;
font-weight: 700;
}
.markdown-body .pl-mi {
color: #24292e;
font-style: italic;
}
.markdown-body .pl-mb {
color: #24292e;
font-weight: 700;
}
.markdown-body .pl-md {
background-color: #ffeef0;
color: #b31d28;
}
.markdown-body .pl-mi1 {
background-color: #f0fff4;
color: #22863a;
}
.markdown-body .pl-mc {
background-color: #ffebda;
color: #e36209;
}
.markdown-body .pl-mi2 {
background-color: #005cc5;
color: #f6f8fa;
}
.markdown-body .pl-mdr {
color: #6f42c1;
font-weight: 700;
}
.markdown-body .pl-ba {
color: #586069;
}
.markdown-body .pl-sg {
color: #959da5;
}
.markdown-body .pl-corl {
color: #032f62;
text-decoration: underline;
}
.markdown-body details {
display: block;
}
.markdown-body summary {
display: list-item;
}
.markdown-body a {
background-color: transparent;
}
.markdown-body a:active,
.markdown-body a:hover {
outline-width: 0;
}
.markdown-body strong {
font-weight: inherit;
font-weight: bolder;
}
.markdown-body h1 {
font-size: 2em;
margin: .67em 0;
}
.markdown-body img {
border-style: none;
}
.markdown-body code,
.markdown-body kbd,
.markdown-body pre {
font-family: monospace,monospace;
font-size: 1em;
}
.markdown-body hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
.markdown-body input {
font: inherit;
margin: 0;
}
.markdown-body input {
overflow: visible;
}
.markdown-body [type=checkbox] {
box-sizing: border-box;
padding: 0;
}
.markdown-body * {
box-sizing: border-box;
}
.markdown-body input {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
.markdown-body a {
color: #0366d6;
text-decoration: none;
}
.markdown-body a:hover {
text-decoration: underline;
}
.markdown-body strong {
font-weight: 600;
}
.markdown-body hr {
background: transparent;
border: 0;
border-bottom: 1px solid #dfe2e5;
height: 0;
margin: 15px 0;
overflow: hidden;
}
.markdown-body hr:before {
content: "";
display: table;
}
.markdown-body hr:after {
clear: both;
content: "";
display: table;
}
.markdown-body table {
border-collapse: collapse;
border-spacing: 0;
}
.markdown-body td,
.markdown-body th {
padding: 0;
}
.markdown-body details summary {
cursor: pointer;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
margin-bottom: 0;
margin-top: 0;
}
.markdown-body h1 {
font-size: 32px;
}
.markdown-body h1,
.markdown-body h2 {
font-weight: 600;
}
.markdown-body h2 {
font-size: 24px;
}
.markdown-body h3 {
font-size: 20px;
}
.markdown-body h3,
.markdown-body h4 {
font-weight: 600;
}
.markdown-body h4 {
font-size: 16px;
}
.markdown-body h5 {
font-size: 14px;
}
.markdown-body h5,
.markdown-body h6 {
font-weight: 600;
}
.markdown-body h6 {
font-size: 12px;
}
.markdown-body p {
margin-bottom: 10px;
margin-top: 0;
}
.markdown-body blockquote {
margin: 0;
}
.markdown-body ol,
.markdown-body ul {
margin-bottom: 0;
margin-top: 0;
padding-left: 0;
}
.markdown-body ol ol,
.markdown-body ul ol {
list-style-type: lower-roman;
}
.markdown-body ol ol ol,
.markdown-body ol ul ol,
.markdown-body ul ol ol,
.markdown-body ul ul ol {
list-style-type: lower-alpha;
}
.markdown-body dd {
margin-left: 0;
}
.markdown-body code,
.markdown-body pre {
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
font-size: 12px;
}
.markdown-body pre {
margin-bottom: 0;
margin-top: 0;
}
.markdown-body input::-webkit-inner-spin-button,
.markdown-body input::-webkit-outer-spin-button {
-webkit-appearance: none;
appearance: none;
margin: 0;
}
.markdown-body .border {
border: 1px solid #e1e4e8!important;
}
.markdown-body .border-0 {
border: 0!important;
}
.markdown-body .border-bottom {
border-bottom: 1px solid #e1e4e8!important;
}
.markdown-body .rounded-1 {
border-radius: 3px!important;
}
.markdown-body .bg-white {
background-color: #fff!important;
}
.markdown-body .bg-gray-light {
background-color: #fafbfc!important;
}
.markdown-body .text-gray-light {
color: #6a737d!important;
}
.markdown-body .mb-0 {
margin-bottom: 0!important;
}
.markdown-body .my-2 {
margin-bottom: 8px!important;
margin-top: 8px!important;
}
.markdown-body .pl-0 {
padding-left: 0!important;
}
.markdown-body .py-0 {
padding-bottom: 0!important;
padding-top: 0!important;
}
.markdown-body .pl-1 {
padding-left: 4px!important;
}
.markdown-body .pl-2 {
padding-left: 8px!important;
}
.markdown-body .py-2 {
padding-bottom: 8px!important;
padding-top: 8px!important;
}
.markdown-body .pl-3,
.markdown-body .px-3 {
padding-left: 16px!important;
}
.markdown-body .px-3 {
padding-right: 16px!important;
}
.markdown-body .pl-4 {
padding-left: 24px!important;
}
.markdown-body .pl-5 {
padding-left: 32px!important;
}
.markdown-body .pl-6 {
padding-left: 40px!important;
}
.markdown-body .f6 {
font-size: 12px!important;
}
.markdown-body .lh-condensed {
line-height: 1.25!important;
}
.markdown-body .text-bold {
font-weight: 600!important;
}
.markdown-body:before {
content: "";
display: table;
}
.markdown-body:after {
clear: both;
content: "";
display: table;
}
.markdown-body>:first-child {
margin-top: 0!important;
}
.markdown-body>:last-child {
margin-bottom: 0!important;
}
.markdown-body a:not([href]) {
color: inherit;
text-decoration: none;
}
.markdown-body blockquote,
.markdown-body dl,
.markdown-body ol,
.markdown-body p,
.markdown-body pre,
.markdown-body table,
.markdown-body ul {
margin-bottom: 16px;
margin-top: 0;
}
.markdown-body hr {
background-color: #e1e4e8;
border: 0;
height: .25em;
margin: 24px 0;
padding: 0;
}
.markdown-body blockquote {
border-left: .25em solid #dfe2e5;
color: #6a737d;
padding: 0 1em;
}
.markdown-body blockquote>:first-child {
margin-top: 0;
}
.markdown-body blockquote>:last-child {
margin-bottom: 0;
}
.markdown-body kbd {
background-color: #fafbfc;
border: 1px solid #c6cbd1;
border-bottom-color: #959da5;
border-radius: 3px;
box-shadow: inset 0 -1px 0 #959da5;
color: #444d56;
display: inline-block;
font-size: 11px;
line-height: 10px;
padding: 3px 5px;
vertical-align: middle;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
font-weight: 600;
line-height: 1.25;
margin-bottom: 16px;
margin-top: 24px;
}
.markdown-body h1 {
font-size: 2em;
}
.markdown-body h1,
.markdown-body h2 {
border-bottom: 1px solid #eaecef;
padding-bottom: .3em;
}
.markdown-body h2 {
font-size: 1.5em;
}
.markdown-body h3 {
font-size: 1.25em;
}
.markdown-body h4 {
font-size: 1em;
}
.markdown-body h5 {
font-size: .875em;
}
.markdown-body h6 {
color: #6a737d;
font-size: .85em;
}
.markdown-body ol,
.markdown-body ul {
padding-left: 2em;
}
.markdown-body ol ol,
.markdown-body ol ul,
.markdown-body ul ol,
.markdown-body ul ul {
margin-bottom: 0;
margin-top: 0;
}
.markdown-body li {
word-wrap: break-all;
}
.markdown-body li>p {
margin-top: 16px;
}
.markdown-body li+li {
margin-top: .25em;
}
.markdown-body dl {
padding: 0;
}
.markdown-body dl dt {
font-size: 1em;
font-style: italic;
font-weight: 600;
margin-top: 16px;
padding: 0;
}
.markdown-body dl dd {
margin-bottom: 16px;
padding: 0 16px;
}
.markdown-body table {
display: block;
overflow: auto;
width: 100%;
}
.markdown-body table th {
font-weight: 600;
}
.markdown-body table td,
.markdown-body table th {
border: 1px solid #dfe2e5;
padding: 6px 13px;
}
.markdown-body table tr {
background-color: #fff;
border-top: 1px solid #c6cbd1;
}
.markdown-body table tr:nth-child(2n) {
background-color: #f6f8fa;
}
.markdown-body img {
background-color: #fff;
box-sizing: content-box;
max-width: 100%;
}
.markdown-body img[align=right] {
padding-left: 20px;
}
.markdown-body img[align=left] {
padding-right: 20px;
}
.markdown-body code {
background-color: rgba(27,31,35,.05);
border-radius: 3px;
font-size: 85%;
margin: 0;
padding: .2em .4em;
}
.markdown-body pre {
word-wrap: normal;
}
.markdown-body pre>code {
background: transparent;
border: 0;
font-size: 100%;
margin: 0;
padding: 0;
white-space: pre;
word-break: normal;
}
.markdown-body .highlight {
margin-bottom: 16px;
}
.markdown-body .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.markdown-body .highlight pre,
.markdown-body pre {
background-color: #f6f8fa;
border-radius: 3px;
font-size: 85%;
line-height: 1.45;
overflow: auto;
padding: 16px;
}
.markdown-body pre code {
background-color: transparent;
border: 0;
display: inline;
line-height: inherit;
margin: 0;
max-width: auto;
overflow: visible;
padding: 0;
word-wrap: normal;
}
.markdown-body .commit-tease-sha {
color: #444d56;
display: inline-block;
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
font-size: 90%;
}
.markdown-body .blob-wrapper {
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
overflow-x: auto;
overflow-y: hidden;
}
.markdown-body .blob-wrapper-embedded {
max-height: 240px;
overflow-y: auto;
}
.markdown-body .blob-num {
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
color: rgba(27,31,35,.3);
cursor: pointer;
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
font-size: 12px;
line-height: 20px;
min-width: 50px;
padding-left: 10px;
padding-right: 10px;
text-align: right;
user-select: none;
vertical-align: top;
white-space: nowrap;
width: 1%;
}
.markdown-body .blob-num:hover {
color: rgba(27,31,35,.6);
}
.markdown-body .blob-num:before {
content: attr(data-line-number);
}
.markdown-body .blob-code {
line-height: 20px;
padding-left: 10px;
padding-right: 10px;
position: relative;
vertical-align: top;
}
.markdown-body .blob-code-inner {
color: #24292e;
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
font-size: 12px;
overflow: visible;
white-space: pre;
word-wrap: normal;
}
.markdown-body .pl-token.active,
.markdown-body .pl-token:hover {
background: #ffea7f;
cursor: pointer;
}
.markdown-body kbd {
background-color: #fafbfc;
border: 1px solid #d1d5da;
border-bottom-color: #c6cbd1;
border-radius: 3px;
box-shadow: inset 0 -1px 0 #c6cbd1;
color: #444d56;
display: inline-block;
font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
line-height: 10px;
padding: 3px 5px;
vertical-align: middle;
}
.markdown-body :checked+.radio-label {
border-color: #0366d6;
position: relative;
z-index: 1;
}
.markdown-body .tab-size[data-tab-size="1"] {
-moz-tab-size: 1;
tab-size: 1;
}
.markdown-body .tab-size[data-tab-size="2"] {
-moz-tab-size: 2;
tab-size: 2;
}
.markdown-body .tab-size[data-tab-size="3"] {
-moz-tab-size: 3;
tab-size: 3;
}
.markdown-body .tab-size[data-tab-size="4"] {
-moz-tab-size: 4;
tab-size: 4;
}
.markdown-body .tab-size[data-tab-size="5"] {
-moz-tab-size: 5;
tab-size: 5;
}
.markdown-body .tab-size[data-tab-size="6"] {
-moz-tab-size: 6;
tab-size: 6;
}
.markdown-body .tab-size[data-tab-size="7"] {
-moz-tab-size: 7;
tab-size: 7;
}
.markdown-body .tab-size[data-tab-size="8"] {
-moz-tab-size: 8;
tab-size: 8;
}
.markdown-body .tab-size[data-tab-size="9"] {
-moz-tab-size: 9;
tab-size: 9;
}
.markdown-body .tab-size[data-tab-size="10"] {
-moz-tab-size: 10;
tab-size: 10;
}
.markdown-body .tab-size[data-tab-size="11"] {
-moz-tab-size: 11;
tab-size: 11;
}
.markdown-body .tab-size[data-tab-size="12"] {
-moz-tab-size: 12;
tab-size: 12;
}
.markdown-body .task-list-item {
list-style-type: none;
}
.markdown-body .task-list-item+.task-list-item {
margin-top: 3px;
}
.markdown-body .task-list-item input {
margin: 0 .2em .25em -1.6em;
vertical-align: middle;
}
.markdown-body hr {
border-bottom-color: #eee;
}
.markdown-body .pl-0 {
padding-left: 0!important;
}
.markdown-body .pl-1 {
padding-left: 4px!important;
}
.markdown-body .pl-2 {
padding-left: 8px!important;
}
.markdown-body .pl-3 {
padding-left: 16px!important;
}
.markdown-body .pl-4 {
padding-left: 24px!important;
}
.markdown-body .pl-5 {
padding-left: 32px!important;
}
.markdown-body .pl-6 {
padding-left: 40px!important;
}
.markdown-body .pl-7 {
padding-left: 48px!important;
}
.markdown-body .pl-8 {
padding-left: 64px!important;
}
.markdown-body .pl-9 {
padding-left: 80px!important;
}
.markdown-body .pl-10 {
padding-left: 96px!important;
}
.markdown-body .pl-11 {
padding-left: 112px!important;
}
.markdown-body .pl-12 {
padding-left: 128px!important;
}
/*# sourceURL=webpack://./node_modules/github-markdown-css/github-markdown.css */
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9naXRodWItbWFya2Rvd24tY3NzL2dpdGh1Yi1tYXJrZG93bi5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSwwQkFBMEI7RUFDMUIsMkRBQXF0RTtBQUN2dEU7O0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsa0JBQWtCO0VBQ2xCLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGFBQWE7QUFDZjs7QUFFQTs7Ozs7O0VBTUUsY0FBYztFQUNkLHNCQUFzQjtFQUN0QixrQkFBa0I7QUFDcEI7O0FBRUE7Ozs7OztFQU1FLHFCQUFxQjtBQUN2Qjs7QUFFQTs7Ozs7O0VBTUUsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsMEJBQTBCO0VBQzFCLDhCQUE4QjtFQUM5QixjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLGtJQUFrSTtFQUNsSSxlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLHFCQUFxQjtBQUN2Qjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7O0VBRUUsY0FBYztBQUNoQjs7QUFFQTs7RUFFRSxjQUFjO0FBQ2hCOztBQUVBOztFQUVFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTs7Ozs7OztFQU9FLGNBQWM7QUFDaEI7O0FBRUE7O0VBRUUsY0FBYztBQUNoQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsY0FBYztBQUNoQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7OztFQUdFLGNBQWM7RUFDZCxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixjQUFjO0FBQ2hCOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsY0FBYztBQUNoQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsY0FBYztFQUNkLDBCQUEwQjtBQUM1Qjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSw2QkFBNkI7QUFDL0I7O0FBRUE7O0VBRUUsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0Usb0JBQW9CO0VBQ3BCLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxlQUFlO0FBQ2pCOztBQUVBO0VBQ0Usa0JBQWtCO0FBQ3BCOztBQUVBOzs7RUFHRSxnQ0FBZ0M7RUFDaEMsY0FBYztBQUNoQjs7QUFFQTtFQUNFLHVCQUF1QjtFQUN2QixTQUFTO0VBQ1QsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsYUFBYTtFQUNiLFNBQVM7QUFDWDs7QUFFQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixVQUFVO0FBQ1o7O0FBRUE7RUFDRSxzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxvQkFBb0I7RUFDcEIsa0JBQWtCO0VBQ2xCLG9CQUFvQjtBQUN0Qjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSwwQkFBMEI7QUFDNUI7O0FBRUE7RUFDRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx1QkFBdUI7RUFDdkIsU0FBUztFQUNULGdDQUFnQztFQUNoQyxTQUFTO0VBQ1QsY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsV0FBVztFQUNYLFdBQVc7RUFDWCxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLGlCQUFpQjtBQUNuQjs7QUFFQTs7RUFFRSxVQUFVO0FBQ1o7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBOzs7Ozs7RUFNRSxnQkFBZ0I7RUFDaEIsYUFBYTtBQUNmOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTs7RUFFRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTs7RUFFRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTs7RUFFRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLGFBQWE7QUFDZjs7QUFFQTtFQUNFLFNBQVM7QUFDWDs7QUFFQTs7RUFFRSxnQkFBZ0I7RUFDaEIsYUFBYTtFQUNiLGVBQWU7QUFDakI7O0FBRUE7O0VBRUUsNEJBQTRCO0FBQzlCOztBQUVBOzs7O0VBSUUsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTs7RUFFRSw0RUFBNEU7RUFDNUUsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixhQUFhO0FBQ2Y7O0FBRUE7O0VBRUUsd0JBQXdCO0VBQ3hCLGdCQUFnQjtFQUNoQixTQUFTO0FBQ1g7O0FBRUE7RUFDRSxtQ0FBbUM7QUFDckM7O0FBRUE7RUFDRSxtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSwwQ0FBMEM7QUFDNUM7O0FBRUE7RUFDRSw0QkFBNEI7QUFDOUI7O0FBRUE7RUFDRSxnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRSxtQ0FBbUM7QUFDckM7O0FBRUE7RUFDRSx3QkFBd0I7QUFDMUI7O0FBRUE7RUFDRSwwQkFBMEI7QUFDNUI7O0FBRUE7RUFDRSw0QkFBNEI7RUFDNUIseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UsMkJBQTJCO0VBQzNCLHdCQUF3QjtBQUMxQjs7QUFFQTtFQUNFLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLDZCQUE2QjtFQUM3QiwwQkFBMEI7QUFDNUI7O0FBRUE7O0VBRUUsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UsMkJBQTJCO0FBQzdCOztBQUVBO0VBQ0UsMEJBQTBCO0FBQzVCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsV0FBVztFQUNYLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSwwQkFBMEI7QUFDNUI7O0FBRUE7RUFDRSxjQUFjO0VBQ2QscUJBQXFCO0FBQ3ZCOztBQUVBOzs7Ozs7O0VBT0UsbUJBQW1CO0VBQ25CLGFBQWE7QUFDZjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixTQUFTO0VBQ1QsYUFBYTtFQUNiLGNBQWM7RUFDZCxVQUFVO0FBQ1o7O0FBRUE7RUFDRSxnQ0FBZ0M7RUFDaEMsY0FBYztFQUNkLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIseUJBQXlCO0VBQ3pCLDRCQUE0QjtFQUM1QixrQkFBa0I7RUFDbEIsa0NBQWtDO0VBQ2xDLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCOztBQUVBOzs7Ozs7RUFNRSxnQkFBZ0I7RUFDaEIsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBOztFQUVFLGdDQUFnQztFQUNoQyxvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTs7RUFFRSxpQkFBaUI7QUFDbkI7O0FBRUE7Ozs7RUFJRSxnQkFBZ0I7RUFDaEIsYUFBYTtBQUNmOztBQUVBO0VBQ0Usb0JBQW9CO0FBQ3RCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0UsY0FBYztFQUNkLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGNBQWM7RUFDZCxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxnQkFBZ0I7QUFDbEI7O0FBRUE7O0VBRUUseUJBQXlCO0VBQ3pCLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0Qiw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSx5QkFBeUI7QUFDM0I7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsdUJBQXVCO0VBQ3ZCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxvQ0FBb0M7RUFDcEMsa0JBQWtCO0VBQ2xCLGNBQWM7RUFDZCxTQUFTO0VBQ1Qsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsdUJBQXVCO0VBQ3ZCLFNBQVM7RUFDVCxlQUFlO0VBQ2YsU0FBUztFQUNULFVBQVU7RUFDVixnQkFBZ0I7RUFDaEIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtBQUNwQjs7QUFFQTs7RUFFRSx5QkFBeUI7RUFDekIsa0JBQWtCO0VBQ2xCLGNBQWM7RUFDZCxpQkFBaUI7RUFDakIsY0FBYztFQUNkLGFBQWE7QUFDZjs7QUFFQTtFQUNFLDZCQUE2QjtFQUM3QixTQUFTO0VBQ1QsZUFBZTtFQUNmLG9CQUFvQjtFQUNwQixTQUFTO0VBQ1QsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixVQUFVO0VBQ1YsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsY0FBYztFQUNkLHFCQUFxQjtFQUNyQiw0RUFBNEU7RUFDNUUsY0FBYztBQUNoQjs7QUFFQTtFQUNFLDhCQUE4QjtFQUM5QiwrQkFBK0I7RUFDL0IsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6Qix3QkFBd0I7RUFDeEIsZUFBZTtFQUNmLDRFQUE0RTtFQUM1RSxlQUFlO0VBQ2YsaUJBQWlCO0VBQ2pCLGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGlCQUFpQjtFQUNqQixpQkFBaUI7RUFDakIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixTQUFTO0FBQ1g7O0FBRUE7RUFDRSx3QkFBd0I7QUFDMUI7O0FBRUE7RUFDRSwrQkFBK0I7QUFDakM7O0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsY0FBYztFQUNkLDRFQUE0RTtFQUM1RSxlQUFlO0VBQ2YsaUJBQWlCO0VBQ2pCLGdCQUFnQjtFQUNoQixpQkFBaUI7QUFDbkI7O0FBRUE7O0VBRUUsbUJBQW1CO0VBQ25CLGVBQWU7QUFDakI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIseUJBQXlCO0VBQ3pCLDRCQUE0QjtFQUM1QixrQkFBa0I7RUFDbEIsa0NBQWtDO0VBQ2xDLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIsMEVBQTBFO0VBQzFFLGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLGtCQUFrQjtFQUNsQixVQUFVO0FBQ1o7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsV0FBVztBQUNiOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsV0FBVztBQUNiOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsV0FBVztBQUNiOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsWUFBWTtBQUNkOztBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLFlBQVk7QUFDZDs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsMkJBQTJCO0VBQzNCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLDZCQUE2QjtBQUMvQjs7QUFFQTtFQUNFLDZCQUE2QjtBQUMvQiIsInNvdXJjZVJvb3QiOiIifQ== */
</style>
<style>
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.token.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
/* This background color was intended by the author of this theme. */
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
/*# sourceURL=webpack://./node_modules/prismjs/themes/prism.css */
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9wcmlzbWpzL3RoZW1lcy9wcmlzbS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7RUFJRTs7QUFFRjs7Q0FFQyxZQUFZO0NBQ1osZ0JBQWdCO0NBQ2hCLHdCQUF3QjtDQUN4QixzRUFBc0U7Q0FDdEUsY0FBYztDQUNkLGdCQUFnQjtDQUNoQixnQkFBZ0I7Q0FDaEIsb0JBQW9CO0NBQ3BCLGtCQUFrQjtDQUNsQixpQkFBaUI7Q0FDakIsZ0JBQWdCOztDQUVoQixnQkFBZ0I7Q0FDaEIsY0FBYztDQUNkLFdBQVc7O0NBRVgscUJBQXFCO0NBQ3JCLGtCQUFrQjtDQUNsQixpQkFBaUI7Q0FDakIsYUFBYTtBQUNkOztBQUVBOztDQUVDLGlCQUFpQjtDQUNqQixtQkFBbUI7QUFDcEI7O0FBRUE7O0NBRUMsaUJBQWlCO0NBQ2pCLG1CQUFtQjtBQUNwQjs7QUFFQTtDQUNDOztFQUVDLGlCQUFpQjtDQUNsQjtBQUNEOztBQUVBLGdCQUFnQjtBQUNoQjtDQUNDLFlBQVk7Q0FDWixjQUFjO0NBQ2QsY0FBYztBQUNmOztBQUVBOztDQUVDLG1CQUFtQjtBQUNwQjs7QUFFQSxnQkFBZ0I7QUFDaEI7Q0FDQyxhQUFhO0NBQ2IsbUJBQW1CO0NBQ25CLG1CQUFtQjtBQUNwQjs7QUFFQTs7OztDQUlDLGdCQUFnQjtBQUNqQjs7QUFFQTtDQUNDLFdBQVc7QUFDWjs7QUFFQTtDQUNDLFdBQVc7QUFDWjs7QUFFQTs7Ozs7OztDQU9DLFdBQVc7QUFDWjs7QUFFQTs7Ozs7O0NBTUMsV0FBVztBQUNaOztBQUVBOzs7OztDQUtDLGNBQWM7Q0FDZCxvRUFBb0U7Q0FDcEUsaUNBQWlDO0FBQ2xDOztBQUVBOzs7Q0FHQyxXQUFXO0FBQ1o7O0FBRUE7O0NBRUMsY0FBYztBQUNmOztBQUVBOzs7Q0FHQyxXQUFXO0FBQ1o7O0FBRUE7O0NBRUMsaUJBQWlCO0FBQ2xCO0FBQ0E7Q0FDQyxrQkFBa0I7QUFDbkI7O0FBRUE7Q0FDQyxZQUFZO0FBQ2IiLCJzb3VyY2VSb290IjoiIn0= */
</style>
<style>
</style>
<style>
.markdown-body {
font-family: -apple-system,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;
box-sizing: border-box;
min-width: 200px;
max-width: 980px;
margin: 0 auto;
padding: 45px;
}
@media not print {
.markdown-body {
padding: 45px;
}
@media (max-width: 767px) {
.markdown-body {
padding: 15px;
}
}
}
.hf-container {
color: #24292e;
line-height: 1.3;
}
.markdown-body .highlight pre,
.markdown-body pre {
white-space: pre-wrap;
}
.markdown-body table {
display: table;
}
.markdown-body img[data-align="center"] {
display: block;
margin: 0 auto;
}
.markdown-body img[data-align="right"] {
display: block;
margin: 0 0 0 auto;
}
.markdown-body li.task-list-item {
list-style-type: none;
}
.markdown-body li > [type=checkbox] {
margin: 0 0 0 -1.3em;
}
.markdown-body input[type="checkbox"] ~ p {
margin-top: 0;
display: inline-block;
}
.markdown-body ol ol,
.markdown-body ul ol {
list-style-type: decimal;
}
.markdown-body ol ol ol,
.markdown-body ol ul ol,
.markdown-body ul ol ol,
.markdown-body ul ul ol {
list-style-type: decimal;
}
</style>
<style>.markdown-body a.footnote-ref {
text-decoration: none;
}
.footnotes {
font-size: .85em;
opacity: .8;
}
.footnotes li[role="doc-endnote"] {
position: relative;
}
.footnotes .footnote-back {
position: absolute;
font-family: initial;
top: .2em;
right: 1em;
text-decoration: none;
}
.inline-math.invalid,
.multiple-math.invalid {
color: rgb(255, 105, 105);
}
.toc-container {
width: 100%;
}
.toc-container .toc-title {
font-weight: 700;
font-size: 1.2em;
margin-bottom: 0;
}
.toc-container li,
.toc-container ul,
.toc-container ul li {
list-style: none !important;
}
.toc-container > ul {
padding-left: 0;
}
.toc-container ul li span {
display : flex;
}
.toc-container ul li span a {
color: inherit;
text-decoration: none;
}
.toc-container ul li span a:hover {
color: inherit;
text-decoration: none;
}
.toc-container ul li span span.dots {
flex: 1;
height: 0.65em;
margin: 0 10px;
border-bottom: 2px dotted black;
}
/*# sourceURL=webpack://./src/muya/lib/assets/styles/exportStyle.css */
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL3NyYy9tdXlhL2xpYi9hc3NldHMvc3R5bGVzL2V4cG9ydFN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLHFCQUFxQjtBQUN2Qjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsb0JBQW9CO0VBQ3BCLFNBQVM7RUFDVCxVQUFVO0VBQ1YscUJBQXFCO0FBQ3ZCOztBQUVBOztFQUVFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0FBQ2xCOztBQUVBOzs7RUFHRSwyQkFBMkI7QUFDN0I7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxxQkFBcUI7QUFDdkI7QUFDQTtFQUNFLGNBQWM7RUFDZCxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxPQUFPO0VBQ1AsY0FBYztFQUNkLGNBQWM7RUFDZCwrQkFBK0I7QUFDakMiLCJzb3VyY2VSb290IjoiIn0= */</style>
<style>.markdown-body{}pre.front-matter{display:none!important;}</style>
</head>
<body>
<article class="markdown-body"><div class="toc-container"><p class="toc-title">目录</p><ul class="toc-list"><li><span><a class="toc-h1" href="#预备知识">预备知识</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#sdl是什么">SDL是什么</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#环境准备">环境准备</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#ubuntu">Ubuntu</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#windows">Windows</a><span class="dots"></span></span><ul><li><span><a class="toc-h4" href="#mingw">MinGW</a><span class="dots"></span></span></li><li><span><a class="toc-h4" href="#visual-studio">Visual Studio</a><span class="dots"></span></span></li><li><span><a class="toc-h4" href="#windows上动态链接库找不到的解决办法">Windows上动态链接库找不到的解决办法</a><span class="dots"></span></span></li></ul></li></ul></li></ul></li><li><span><a class="toc-h1" href="#sdl基础应用示例">SDL基础应用示例</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#sdl环境初始化与退出">SDL环境初始化与退出</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#窗口显示">窗口显示</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#事件循环">事件循环</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#图形绘制">图形绘制</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#图片显示">图片显示</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#像素点操作">像素点操作</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#渲染">渲染</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#渲染器创建与清屏">渲染器创建与清屏</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#绘制点、线">绘制点、线</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#绘制、填充矩形区域">绘制、填充矩形区域</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#图片渲染">图片渲染</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#图片缩放、旋转">图片缩放、旋转</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h2" href="#代码结构整理">代码结构整理</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#窗口事件">窗口事件</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#鼠标事件">鼠标事件</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#移动">移动</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#按键">按键</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h2" href="#键盘事件">键盘事件</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#碰撞以及范围检测">碰撞以及范围检测</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#播放声音">播放声音</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#动画帧率">动画帧率</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#其他模块使用">其他模块使用</a><span class="dots"></span></span></li><li><span><a class="toc-h2" href="#多线程操作">多线程操作</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h1" href="#sdl常用函数、结构体、枚举、宏定义">SDL常用函数、结构体、枚举、宏定义</a><span class="dots"></span></span><ul><li><span><a class="toc-h2" href="#函数">函数</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#sdl_init">SDL_Init</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_quit">SDL_Quit</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_createwindow">SDL_CreateWindow</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_destroywindow">SDL_DestroyWindow</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_delay">SDL_Delay</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_log">SDL_Log</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_geterror">SDL_GetError</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_getwindowsurface">SDL_GetWindowSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_freesurface">SDL_FreeSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_fillrect">SDL_FillRect</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_updatewindowsurface">SDL_UpdateWindowSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_maprgb">SDL_MapRGB</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_maprgba">SDL_MapRGBA</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_loadbmp">SDL_LoadBMP</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_blitsurface">SDL_BlitSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_blitscaled">SDL_BlitScaled</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_creatergbsurface">SDL_CreateRGBSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_creatergbsurfacewithformat">SDL_CreateRGBSurfaceWithFormat</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_creatergbsurfacefrom">SDL_CreateRGBSurfaceFrom</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_creatergbsurfacewithformatfrom">SDL_CreateRGBSurfaceWithFormatFrom</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_locksurface">SDL_LockSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_unlocksurface">SDL_UnlockSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_createrenderer">SDL_CreateRenderer</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_destroyrenderer">SDL_DestroyRenderer</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_setrenderdrawcolor">SDL_SetRenderDrawColor</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderclear">SDL_RenderClear</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderpresent">SDL_RenderPresent</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_setrenderdrawblendmode">SDL_SetRenderDrawBlendMode</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderdrawpoint">SDL_RenderDrawPoint</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderdrawpoints">SDL_RenderDrawPoints</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderdrawline">SDL_RenderDrawLine</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderdrawlines">SDL_RenderDrawLines</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderdrawrect">SDL_RenderDrawRect</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderdrawrects">SDL_RenderDrawRects</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderfillrect">SDL_RenderFillRect</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_renderfillrects">SDL_RenderFillRects</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_rendersetscale">SDL_RenderSetScale</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_createtexturefromsurface">SDL_CreateTextureFromSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_destroytexture">SDL_DestroyTexture</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_rendercopy">SDL_RenderCopy</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_rendercopyex">SDL_RenderCopyEx</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_settexturealphamod">SDL_SetTextureAlphaMod</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_settextureblendmode">SDL_SetTextureBlendMode</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_updatetexture">SDL_UpdateTexture</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_updateyuvtexture">SDL_UpdateYUVTexture</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_updatenvtexture">SDL_UpdateNVTexture</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_locktexture">SDL_LockTexture</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_locktexturetosurface">SDL_LockTextureToSurface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_unlocktexture">SDL_UnlockTexture</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_pointinrect">SDL_PointInRect</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_rectempty">SDL_RectEmpty</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_rectequals">SDL_RectEquals</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_hasintersection">SDL_HasIntersection</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_intersectrect">SDL_IntersectRect</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_unionrect">SDL_UnionRect</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_loadwav">SDL_LoadWAV</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_freewav">SDL_FreeWAV</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_openaudiodevice">SDL_OpenAudioDevice</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_pauseaudiodevice">SDL_PauseAudioDevice</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_getaudiodevicename">SDL_GetAudioDeviceName</a><span class="dots"></span></span></li></ul></li><li><span><a class="toc-h2" href="#结构体、枚举、宏定义">结构体、枚举、宏定义</a><span class="dots"></span></span><ul><li><span><a class="toc-h3" href="#sdl_bool">SDL_bool</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_point">SDL_Point</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_rect">SDL_Rect</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_surface">SDL_Surface</a><span class="dots"></span></span></li><li><span><a class="toc-h3" href="#sdl_audiospec">SDL_AudioSpec</a><span class="dots"></span></span></li></ul></li></ul></li><li><span><a class="toc-h1" href="#unknown">Unknown</a><span class="dots"></span></span></li><li><span><a class="toc-h1" href="#cpp多线程">CPP多线程</a><span class="dots"></span></span></li></ul></div><h1 class="atx" id="预备知识">预备知识</h1>
<h2 class="atx" id="sdl是什么">SDL是什么</h2>
<p>一个C语言媒体库可用于音视频播放、游戏制作等媒体层。</p>
<h2 class="atx" id="环境准备">环境准备</h2>
<h3 class="atx" id="ubuntu">Ubuntu</h3>
<p><strong>前置条件</strong></p>
<p>已安装gcc/g++/make如果没安装可用下列命令安装</p>
<pre><code class="fenced-code-block language-shell"><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> gcc g++ <span class="token function">make</span></code></pre>
<p>&nbsp;</p>
<p>再通过以下命令安装SDL开发环境</p>
<pre><code class="fenced-code-block language-shell"><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> libsdl2-dev</code></pre>
<p><code>Makefile</code></p>
<pre><code class="fenced-code-block language-makefile">LDLIBS <span class="token operator">+=</span> -lSDL2
<span class="token target symbol">main</span><span class="token punctuation">:</span> main.o <span class="token comment"># 源文件为main.cpp</span>
<span class="token variable">$</span><span class="token punctuation">(</span>CXX<span class="token punctuation">)</span> <span class="token variable">$^</span> -o <span class="token variable">$@</span> <span class="token variable">$</span><span class="token punctuation">(</span>LDFLAGS<span class="token punctuation">)</span> <span class="token variable">$</span><span class="token punctuation">(</span>LDLIBS<span class="token punctuation">)</span>
<span class="token builtin-target builtin">.PHONY</span><span class="token punctuation">:</span> run clean
<span class="token target symbol">run</span><span class="token punctuation">:</span> main
./<span class="token variable">$&lt;</span>
<span class="token target symbol">clean</span><span class="token punctuation">:</span>
<span class="token variable">$</span><span class="token punctuation">(</span>RM<span class="token punctuation">)</span> main *.o</code></pre>
<h3 class="atx" id="windows">Windows</h3>
<p><strong>SDL官网地址</strong><a href="http://www.libsdl.org/">http://www.libsdl.org/</a></p>
<p><strong>SDL GitHub地址</strong><a href="https://github.com/libsdl-org">https://github.com/libsdl-org</a></p>
<h4 class="atx" id="mingw">MinGW</h4>
<p><strong>编译器</strong> MinGW用的w64devkit包gcc/g++/make </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://www.mingw-w64.org/">https://www.mingw-w64.org/</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://github.com/skeeto/w64devkit/releases">https://github.com/skeeto/w64devkit/releases</a></p>
<p><strong>代码编辑器</strong> VSCode</p>
<p><strong>构建方式</strong>手动写Makefile编译构建</p>
<p>所以下载的库为这个版本</p>
<p>解压到指定位置之后准备C语言文件main.c测试用先不用理解是啥</p>
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;stdlib.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;time.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">WIDTH</span> <span class="token expression"><span class="token number">1000</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">HEIGHT</span> <span class="token expression"><span class="token number">600</span></span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init Failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span>
<span class="token string">"TestWindow"</span><span class="token punctuation">,</span>
SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
WIDTH<span class="token punctuation">,</span> HEIGHT<span class="token punctuation">,</span>
SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>renderer <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">srand</span><span class="token punctuation">(</span><span class="token function">time</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Uint8 r <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
Uint8 g <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
Uint8 b <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
<span class="token class-name">int8_t</span> dx <span class="token operator">=</span> <span class="token number">8</span><span class="token punctuation">;</span>
<span class="token class-name">int8_t</span> dy <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> x <span class="token operator">=</span> rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> y <span class="token operator">=</span> rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>renderer<span class="token punctuation">)</span><span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>x <span class="token operator">+=</span> dx<span class="token punctuation">;</span>
x <span class="token operator">=</span> rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w <span class="token operator">&gt;=</span> WIDTH <span class="token operator">||</span> rect<span class="token punctuation">.</span>x <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dx <span class="token operator">=</span> <span class="token operator">-</span>dx<span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>y <span class="token operator">+=</span> dy<span class="token punctuation">;</span>
y <span class="token operator">=</span> rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h <span class="token operator">&gt;=</span> HEIGHT <span class="token operator">||</span> rect<span class="token punctuation">.</span>y <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dy <span class="token operator">=</span> <span class="token operator">-</span>dy<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
r <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">;</span>
g <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">;</span>
b <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> rect<span class="token punctuation">.</span>x<span class="token punctuation">;</span> i <span class="token operator">&lt;</span> rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> rect<span class="token punctuation">.</span>y<span class="token punctuation">;</span> j <span class="token operator">&lt;</span> rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>i <span class="token operator">-</span> x<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>i <span class="token operator">-</span> x<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> y<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> y<span class="token punctuation">)</span> <span class="token operator">&gt;</span> rect<span class="token punctuation">.</span>w <span class="token operator">*</span> rect<span class="token punctuation">.</span>h <span class="token operator">/</span> <span class="token number">4</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_RenderDrawPoint</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> i<span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>renderer<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>renderer<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>写如下Makefile</p>
<p><code>Windows版本Makefile</code></p>
<pre><code class="fenced-code-block language-makefile">CXXFLAGS <span class="token operator">+=</span> -ID<span class="token punctuation">:</span>/CPP/Libs/SDL2-2.26.5/<span class="token keyword">include</span> <span class="token comment">#改成你电脑上的include路径</span>
<span class="token comment"># CXXFLAGS += -fexec-charset=GBK -finput-charset=UTF-8</span>
LDFLAGS <span class="token operator">+=</span> -LD<span class="token punctuation">:</span>/CPP/Libs/SDL2-2.26.5/lib <span class="token comment"># 改成你电脑上的lib路径</span>
CXXFLAGS <span class="token operator">+=</span> -std<span class="token operator">=</span>c++23
<span class="token comment"># 如果不用特别新的C++特性,上面这行不用写</span>
LDLIBS <span class="token operator">+=</span> -lSDL2
LDLIBS <span class="token operator">+=</span> -mwindows <span class="token comment"># 用于去除运行时命令行窗口</span>
<span class="token target symbol">main.exe</span><span class="token punctuation">:</span> main.o
<span class="token variable">$</span><span class="token punctuation">(</span>CXX<span class="token punctuation">)</span> <span class="token variable">$^</span> -o <span class="token variable">$</span><span class="token punctuation">(</span><span class="token function">basename</span> <span class="token variable">$@</span><span class="token punctuation">)</span> <span class="token variable">$</span><span class="token punctuation">(</span>LDFLAGS<span class="token punctuation">)</span> <span class="token variable">$</span><span class="token punctuation">(</span>LDLIBS<span class="token punctuation">)</span>
<span class="token builtin-target builtin">.PHONY</span><span class="token punctuation">:</span> run clean
<span class="token target symbol">run</span><span class="token punctuation">:</span> main.exe
<span class="token variable">$&lt;</span>
<span class="token target symbol">clean</span><span class="token punctuation">:</span>
<span class="token variable">$</span><span class="token punctuation">(</span>RM<span class="token punctuation">)</span> *.exe *.o</code></pre>
<p>完成之后用下列命令编译运行,正常即可</p>
<pre><code class="fenced-code-block language-shell"><span class="token function">make</span> run</code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h4 class="atx" id="visual-studio">Visual Studio</h4>
<p>如果是用其他IDE则需要自行配置SDL的头文件和库文件引用位置。例如Visual Studio则需要下载<code>SDL2-devel-2.28.2-VC.zip</code>这个版本的库文件,解压到指定位置后再进行配置。</p>
<p>新建一个Visual Studio的项目添加main.c文件内容如下</p>
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;stdlib.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;time.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">WIDTH</span> <span class="token expression"><span class="token number">1000</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">HEIGHT</span> <span class="token expression"><span class="token number">600</span></span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init Failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span>
<span class="token string">"TestWindow"</span><span class="token punctuation">,</span>
SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
WIDTH<span class="token punctuation">,</span> HEIGHT<span class="token punctuation">,</span>
SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>renderer <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">srand</span><span class="token punctuation">(</span><span class="token function">time</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Uint8 r <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
Uint8 g <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
Uint8 b <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
<span class="token class-name">int8_t</span> dx <span class="token operator">=</span> <span class="token number">8</span><span class="token punctuation">;</span>
<span class="token class-name">int8_t</span> dy <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> x <span class="token operator">=</span> rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> y <span class="token operator">=</span> rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>renderer<span class="token punctuation">)</span><span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>x <span class="token operator">+=</span> dx<span class="token punctuation">;</span>
x <span class="token operator">=</span> rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w <span class="token operator">&gt;=</span> WIDTH <span class="token operator">||</span> rect<span class="token punctuation">.</span>x <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dx <span class="token operator">=</span> <span class="token operator">-</span>dx<span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>y <span class="token operator">+=</span> dy<span class="token punctuation">;</span>
y <span class="token operator">=</span> rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h <span class="token operator">&gt;=</span> HEIGHT <span class="token operator">||</span> rect<span class="token punctuation">.</span>y <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dy <span class="token operator">=</span> <span class="token operator">-</span>dy<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
r <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">;</span>
g <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">;</span>
b <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> rect<span class="token punctuation">.</span>x<span class="token punctuation">;</span> i <span class="token operator">&lt;</span> rect<span class="token punctuation">.</span>x <span class="token operator">+</span> rect<span class="token punctuation">.</span>w<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> rect<span class="token punctuation">.</span>y<span class="token punctuation">;</span> j <span class="token operator">&lt;</span> rect<span class="token punctuation">.</span>y <span class="token operator">+</span> rect<span class="token punctuation">.</span>h<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>i <span class="token operator">-</span> x<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>i <span class="token operator">-</span> x<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> y<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> y<span class="token punctuation">)</span> <span class="token operator">&gt;</span> rect<span class="token punctuation">.</span>w <span class="token operator">*</span> rect<span class="token punctuation">.</span>h <span class="token operator">/</span> <span class="token number">4</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_RenderDrawPoint</span><span class="token punctuation">(</span>renderer<span class="token punctuation">,</span> i<span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>renderer<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>renderer<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>再配置静态库引用位置头文件引用位置。最后编译运行测试如果正常输出信息则配置正确。其他IDE也是类似配置好库文件、头文件即可。</p>
<p><strong>Visual Studio 2022配置SDL2开发环境</strong></p>
<ol>
<li><p>鼠标右键项目--&gt;属性(Properties)打开属性配置面板)</p>
<p><img alt="" src="./img/vs_1.png"></p>
</li>
<li><p>路径配置:</p>
<p>配置(Configuration)选择所有配置(All Configuration),平台(Platform)选择x64(也可以选择Win32需要与后续配置的库对应上)。点击VC++目录(VC++ Directories)分别配置包含目录(Include Directories)和库目录(Library Directories)</p>
<p><img alt="" src="./img/vs_2.png"></p>
<p>包含目录配置将解压后的SDL中的include目录添加进来点击确定(OK)。</p>
<p><img alt="" src="./img/vs_3.png"></p>
<p>库目录配置将解压后的SDL中的lib\x64(如果选的平台是Win32则选x86)目录添加进来,点击确定(OK)。</p>
<p><img alt="" src="./img/vs_4.png"></p>
</li>
<li><p>链接库配置:点击链接器(Linker),编辑添加依赖项(Additional Dependencies)</p>
<p><img alt="" src="./img/vs_5.png"></p>
<p>输入SDL2.lib点击确定。</p>
<p><img alt="" src="./img/vs_6.png"></p>
</li>
</ol>
<h4 class="atx" id="windows上动态链接库找不到的解决办法">Windows上动态链接库找不到的解决办法</h4>
<ol>
<li><p>将SDL2.dll文件复制到C:\Windows\System32目录下</p>
</li>
<li><p>将SDL2.dll所在的目录添加到环境变量</p>
</li>
<li><p>将SDL2.dll复制到当前项目生成的.exe文件同级目录</p>
</li>
</ol>
<h1 class="atx" id="sdl基础应用示例">SDL基础应用示例</h1>
<h2 class="atx" id="sdl环境初始化与退出">SDL环境初始化与退出</h2>
<p>每次使用SDL都需要进行初始化使用结束之后需要退出。用到的函数为</p>
<p><code>初始化与退出</code> </p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// 初始化</span>
<span class="token keyword">int</span> <span class="token function">SDL_Init</span><span class="token punctuation">(</span>Uint32 flags<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 退出</span>
<span class="token keyword">void</span> <span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>初始化成功则返回0失败则返回一个负数。</p>
<p><code>flags</code>的取值见下表宏定义</p>
<p>例如</p>
<pre><code class="fenced-code-block language-c"></code></pre>
<p>使用SDL的C语言文件结构一般如下</p>
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main </span><span class="token comment">// 加上这句防止一些奇怪的报错</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 一些操作</span>
<span class="token comment">// ....</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="窗口显示">窗口显示</h2>
<p><code>窗口创建与销毁函数</code></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// 创建函数成功则返回窗口指针失败则返回NULL</span>
SDL_Window <span class="token operator">*</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>title<span class="token punctuation">,</span> <span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">,</span> <span class="token keyword">int</span> w<span class="token punctuation">,</span> <span class="token keyword">int</span> h<span class="token punctuation">,</span> Uint32 flags<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 销毁</span>
<span class="token keyword">void</span> <span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>SDL_Window <span class="token operator">*</span> window<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">title</td>
<td align="center">窗口标题UTF-8编码</td>
</tr>
<tr>
<td align="center">x</td>
<td align="center">窗口起始位置x坐标 通常为居中SDL_WINDOWPOS_CENTERED或未定义SDL_WINDOWPOS_UNDEFINED</td>
</tr>
<tr>
<td align="center">y</td>
<td align="center">窗口起始位置y坐标 通常为居中SDL_WINDOWPOS_CENTERED或未定义SDL_WINDOWPOS_UNDEFINED</td>
</tr>
<tr>
<td align="center">w</td>
<td align="center">窗口宽度</td>
</tr>
<tr>
<td align="center">h</td>
<td align="center">窗口高度</td>
</tr>
<tr>
<td align="center">flags</td>
<td align="center">窗口显示标志可以是0或者是多个其他标志组合</td>
</tr>
<tr>
<td align="center">window</td>
<td align="center">由SDL_CreateWindow创建返回的窗口指针</td>
</tr>
</tbody></table>
<p><code>flags</code>常用可取值定义在SDL_video.h中多个值时用<kbd>|</kbd>连接</p>
<pre><code class="fenced-code-block language-c"></code></pre>
<p><code>延迟(阻塞)函数</code></p>
<pre><code class="fenced-code-block language-c"><span class="token keyword">void</span> <span class="token function">SDL_Delay</span><span class="token punctuation">(</span>Uint32 ms<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>让程序暂停指定的时间,单位为毫秒</p>
<p><strong>完整窗口显示示例</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main </span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span>
<span class="token string">"Hello SDL"</span><span class="token punctuation">,</span>
SDL_WINDOWPOS_UNDEFINED<span class="token punctuation">,</span> SDL_WINDOWPOS_UNDEFINED<span class="token punctuation">,</span>
<span class="token number">600</span><span class="token punctuation">,</span> <span class="token number">400</span><span class="token punctuation">,</span>
SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">5000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="事件循环">事件循环</h2>
<p>直接用SDL_Delay阻塞程序的话无法响应事件所以需要加入事件循环进行事件监听。通常做法是把事件循环单独写到一个函数当中此时SDL程序结构如下</p>
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">WIDTH</span> <span class="token expression"><span class="token number">640</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">HEIGHT</span> <span class="token expression"><span class="token number">480</span></span></span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_AUDIO <span class="token operator">|</span> SDL_INIT_VIDEO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>window <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span>
<span class="token string">"SDLWindow"</span><span class="token punctuation">,</span>
SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
WIDTH<span class="token punctuation">,</span> HEIGHT<span class="token punctuation">,</span>
SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> window<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><code>结构体SDL_Event</code></p>
<p>定义于文件 <em>SDL_Events.h</em>中,以下为一些常用成员,如需了解更多请到<em>SDL_Events.h</em>文件中查看</p>
<pre><code class="fenced-code-block language-c"><span class="token keyword">typedef</span> <span class="token keyword">union</span> SDL_Event
<span class="token punctuation">{</span>
Uint32 type<span class="token punctuation">;</span> <span class="token comment">// 事件类型,见下</span>
SDL_CommonEvent common<span class="token punctuation">;</span> <span class="token comment">/**&lt; Common event data */</span>
SDL_DisplayEvent display<span class="token punctuation">;</span> <span class="token comment">/**&lt; Display event data */</span>
SDL_WindowEvent window<span class="token punctuation">;</span> <span class="token comment">/**&lt; Window event data */</span>
SDL_KeyboardEvent key<span class="token punctuation">;</span> <span class="token comment">/**&lt; Keyboard event data */</span>
SDL_TextEditingEvent edit<span class="token punctuation">;</span> <span class="token comment">/**&lt; Text editing event data */</span>
SDL_TextEditingExtEvent editExt<span class="token punctuation">;</span> <span class="token comment">/**&lt; Extended text editing event data */</span>
SDL_TextInputEvent text<span class="token punctuation">;</span> <span class="token comment">/**&lt; Text input event data */</span>
SDL_MouseMotionEvent motion<span class="token punctuation">;</span> <span class="token comment">/**&lt; Mouse motion event data */</span>
SDL_MouseButtonEvent button<span class="token punctuation">;</span> <span class="token comment">/**&lt; Mouse button event data */</span>
SDL_MouseWheelEvent wheel<span class="token punctuation">;</span> <span class="token comment">/**&lt; Mouse wheel event data */</span>
SDL_AudioDeviceEvent adevice<span class="token punctuation">;</span> <span class="token comment">/**&lt; Audio device event data */</span>
SDL_SensorEvent sensor<span class="token punctuation">;</span> <span class="token comment">/**&lt; Sensor event data */</span>
SDL_QuitEvent quit<span class="token punctuation">;</span> <span class="token comment">/**&lt; Quit request event data */</span>
SDL_UserEvent user<span class="token punctuation">;</span> <span class="token comment">/**&lt; Custom event data */</span>
SDL_SysWMEvent syswm<span class="token punctuation">;</span> <span class="token comment">/**&lt; System dependent window event data */</span>
SDL_TouchFingerEvent tfinger<span class="token punctuation">;</span> <span class="token comment">/**&lt; Touch finger event data */</span>
SDL_MultiGestureEvent mgesture<span class="token punctuation">;</span> <span class="token comment">/**&lt; Gesture event data */</span>
SDL_DollarGestureEvent dgesture<span class="token punctuation">;</span> <span class="token comment">/**&lt; Gesture event data */</span>
SDL_DropEvent drop<span class="token punctuation">;</span> <span class="token comment">/**&lt; Drag and drop event data */</span>
<span class="token comment">// ....更多内容请查阅SDL_Events.h文件</span>
<span class="token punctuation">}</span> SDL_Event<span class="token punctuation">;</span></code></pre>
<p><code>枚举类型SDL_EventType</code></p>
<p>事件类型,定义于文件 <em>SDL_Events.h</em>中,以下为一些常用成员,如需了解更多请查阅 <em>SDL_Events.h</em>文件</p>
<pre><code class="fenced-code-block language-c"><span class="token keyword">typedef</span> <span class="token keyword">enum</span>
<span class="token punctuation">{</span>
SDL_QUIT <span class="token operator">=</span> <span class="token number">0x100</span><span class="token punctuation">,</span> <span class="token comment">// 用户请求 退出</span>
<span class="token comment">/* 键盘事件 */</span>
SDL_KEYDOWN <span class="token operator">=</span> <span class="token number">0x300</span><span class="token punctuation">,</span> <span class="token comment">// 键盘按下</span>
SDL_KEYUP<span class="token punctuation">,</span> <span class="token comment">// 键盘弹起</span>
SDL_TEXTEDITING<span class="token punctuation">,</span> <span class="token comment">// </span>
SDL_TEXTINPUT<span class="token punctuation">,</span> <span class="token comment">// 文字输入</span>
<span class="token comment">/* 鼠标事件 */</span>
SDL_MOUSEMOTION <span class="token operator">=</span> <span class="token number">0x400</span><span class="token punctuation">,</span> <span class="token comment">// 鼠标运动</span>
SDL_MOUSEBUTTONDOWN<span class="token punctuation">,</span> <span class="token comment">// 鼠标键按下</span>
SDL_MOUSEBUTTONUP<span class="token punctuation">,</span> <span class="token comment">// 鼠标键松开</span>
SDL_MOUSEWHEEL<span class="token punctuation">,</span> <span class="token comment">// 鼠标滚轮滚动</span>
<span class="token comment">// .... 更多事件类型请到SDL_Events.h文件查看</span>
<span class="token punctuation">}</span> SDL_EventType<span class="token punctuation">;</span></code></pre>
<p><code>事件检测函数</code></p>
<pre><code class="fenced-code-block language-c"><span class="token keyword">int</span> <span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span>SDL_Event <span class="token operator">*</span> event<span class="token punctuation">)</span></code></pre>
<p>检测是否有等待处理的事件。如果队列中有事件则把里面的第一个事件从事件队列中移除保存到event这个指针中并返回1。如果已经没有事件则返回0。</p>
<p><code>event</code>用于接收事件队列中下一事件的指针如果没有等待的事件则用NULL填充。</p>
<h2 class="atx" id="图形绘制">图形绘制</h2>
<p>在屏幕上绘制一个矩形需要用到如下三个函数</p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// 获取与对应window关联的SDL surface失败则返回NULL</span>
SDL_Surface <span class="token operator">*</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>SDL_Window <span class="token operator">*</span> window<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 在SDL surface上画一个矩形区域成功返回0 失败返回负数</span>
<span class="token keyword">int</span> <span class="token function">SDL_FillRect</span><span class="token punctuation">(</span>SDL_Surface <span class="token operator">*</span> dst<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> rect<span class="token punctuation">,</span> Uint32 color<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 将surface的内容更新到屏幕上成功返回0 失败返回负数</span>
<span class="token keyword">int</span> <span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>SDL_Window <span class="token operator">*</span> window<span class="token punctuation">)</span></code></pre>
<p><strong>color</strong>为4个字节无符号整数为4通道颜色值ARGB其中第一个字节为Alpha通道即透明度通道R为红色分量通道G为绿色分量通道B为蓝色分量通道。通常用十六进制表示例如0xff00aa8c。用这种方式绘制图形时透明通道是不生效的所以颜色值可以只写三个字节RGB分量例如0xff00bb。</p>
<p>如果不习惯将颜色值写成一整个十六进制数值,可以将各个通道值分开写,则需要用到如下函数进行转换:</p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// 将RG B三个通道分量转换为一个整数值。三个分量取值范围均为0~255</span>
Uint32 <span class="token function">SDL_MapRGB</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_PixelFormat <span class="token operator">*</span> format<span class="token punctuation">,</span> Uint8 r<span class="token punctuation">,</span> Uint8 g<span class="token punctuation">,</span> Uint8 b<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 将R, G B, A四个通道分量转为一个整数值。四个分量取值范围均为0~255</span>
Uint32 SDLCALL <span class="token function">SDL_MapRGBA</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_PixelFormat <span class="token operator">*</span> format<span class="token punctuation">,</span>
Uint8 r<span class="token punctuation">,</span> Uint8 g<span class="token punctuation">,</span> Uint8 b<span class="token punctuation">,</span>
Uint8 a<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>SDL_PixelFormat</strong>由以下方式获得与释放</p>
<pre><code class="fenced-code-block language-c">SDL_PixelFormat <span class="token operator">*</span> format <span class="token operator">=</span> <span class="token function">SDL_AllocFormat</span><span class="token punctuation">(</span>SDL_PIXELFORMAT_BGRA32<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeFormat</span><span class="token punctuation">(</span>format<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p> SDL_AllocFormat的参数为枚举类型SDL_PixelFormatEnum定义在<em>SDL_pixels.h</em>里,常用的有:</p>
<ul>
<li>三通道SDL_PIXELFORMAT_RGB24SDL_PIXELFORMAT_BGR24</li>
<li>四通道SDL_PIXELFORMAT_ARGB32SDL_PIXELFORMAT_BGRA32</li>
</ul>
<p>小端存储的用BGR这个顺序的大端存储的用RGB这个顺序的如果无法判断用哪个可每个顺序试一下看是否能达到想要的效果即可。</p>
<p>完整颜色转换示例:</p>
<pre><code class="fenced-code-block language-c">SDL_PixelFormat <span class="token operator">*</span> format <span class="token operator">=</span> <span class="token function">SDL_AllocFormat</span><span class="token punctuation">(</span>SDL_PIXELFORMAT_BGR24<span class="token punctuation">)</span><span class="token punctuation">;</span>
Uint32 color <span class="token operator">=</span> <span class="token function">SDL_MapRGB</span><span class="token punctuation">(</span>format<span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">111</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeFormat</span><span class="token punctuation">(</span>format<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><code>SDL_Rect</code></p>
<p><strong>在屏幕上绘制矩形</strong></p>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">1200</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">800</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 在窗口上绘制一个矩形</span>
<span class="token comment">// 1. 获取与窗口关联的Surface</span>
SDL_Surface <span class="token operator">*</span>surf <span class="token operator">=</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_GetWindowSurface failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 2. 定义一个区域</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 在Surface上进行绘制</span>
<span class="token comment">// SDL_FillRect(surf, &amp;rect, SDL_MapRGB(surf-&gt;format, 0, 255, 0));</span>
<span class="token function">SDL_FillRect</span><span class="token punctuation">(</span>surf<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">,</span> <span class="token number">0x00ff00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 4. 将绘制的内容更新到屏幕上</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_FillRect</span><span class="token punctuation">(</span>surf<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">,</span> <span class="token number">0x000000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>x <span class="token operator">+=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token function">SDL_FillRect</span><span class="token punctuation">(</span>surf<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">,</span> <span class="token number">0x00ff00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 4. 释放Surface</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="图片显示">图片显示</h2>
<p>SDL核心库只支持BMP图片的操作。如需操作更多格式的图片需要SDL2_image库添加与使用方式与SDL核心库一样。头文件为#include &lt;SDL2/SDL_image.h&gt;库文件为SDL2_image。这里为了简便不再引入SDL2_image库直接使用BMP图片进行操作。</p>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">1200</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">800</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 显示BMP图片</span>
<span class="token comment">// 1. 获取与窗口关联的Surface</span>
SDL_Surface <span class="token operator">*</span>surf <span class="token operator">=</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_GetWindowSurface failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 2. 导入BMP图片</span>
SDL_Surface <span class="token operator">*</span>img_surf <span class="token operator">=</span> <span class="token function">SDL_LoadBMP</span><span class="token punctuation">(</span><span class="token string">"8.bmp"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> img_surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_LoadBMP failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 3. 将图片Surface复制到窗口Surface上</span>
<span class="token function">SDL_BlitSurface</span><span class="token punctuation">(</span>img_surf<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> surf<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 4. 将绘制的内容更新到屏幕上</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 4. 释放Surface</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>img_surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="像素点操作">像素点操作</h2>
<p><strong>修改像素点的颜色值</strong></p>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">600</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">400</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 操作像素点</span>
<span class="token comment">// 1. 获取与窗口关联的Surface</span>
SDL_Surface <span class="token operator">*</span>surf <span class="token operator">=</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_GetWindowSurface failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 2. 修改像素点颜色值</span>
Uint32 <span class="token operator">*</span>px <span class="token operator">=</span> <span class="token punctuation">(</span>Uint32 <span class="token operator">*</span><span class="token punctuation">)</span>surf<span class="token operator">-&gt;</span>pixels<span class="token punctuation">;</span>
px<span class="token punctuation">[</span><span class="token number">20000</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0xffffff</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 将绘制的内容更新到屏幕上</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 4. 释放Surface</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><strong>随机像素点显示照片</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;random&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main </span></span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">tagARGB</span> <span class="token punctuation">{</span>
Uint8 b<span class="token punctuation">;</span>
Uint8 g<span class="token punctuation">;</span>
Uint8 r<span class="token punctuation">;</span>
Uint8 a<span class="token punctuation">;</span>
<span class="token punctuation">}</span> ARGB<span class="token punctuation">;</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">tagRGB</span> <span class="token punctuation">{</span>
Uint8 b<span class="token punctuation">;</span>
Uint8 g<span class="token punctuation">;</span>
Uint8 r<span class="token punctuation">;</span>
<span class="token punctuation">}</span> RGB<span class="token punctuation">;</span>
<span class="token keyword">void</span> <span class="token function">swap_value</span><span class="token punctuation">(</span>Uint32 <span class="token operator">*</span>ptr1<span class="token punctuation">,</span> Uint32 <span class="token operator">*</span>ptr2<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
Uint32 tmp <span class="token operator">=</span> <span class="token operator">*</span>ptr1<span class="token punctuation">;</span>
<span class="token operator">*</span>ptr1 <span class="token operator">=</span> <span class="token operator">*</span>ptr2<span class="token punctuation">;</span>
<span class="token operator">*</span>ptr2 <span class="token operator">=</span> tmp<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">shuffle_array</span><span class="token punctuation">(</span>Uint32 arr<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> Uint32 count<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
std<span class="token operator">::</span>random_device rdv<span class="token punctuation">;</span>
std<span class="token operator">::</span>default_random_engine <span class="token function">rdn</span><span class="token punctuation">(</span><span class="token function">rdv</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
std<span class="token operator">::</span>uniform_int_distribution<span class="token operator">&lt;</span><span class="token operator">&gt;</span> <span class="token function">distrib</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
Uint32 j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>Uint32 i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
j <span class="token operator">=</span> <span class="token function">distrib</span><span class="token punctuation">(</span>rdn<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">!=</span> j<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">swap_value</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>arr<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Surface <span class="token operator">*</span>bmpimg <span class="token operator">=</span> <span class="token function">SDL_LoadBMP</span><span class="token punctuation">(</span><span class="token string">"1684826393041.bmp"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span>
<span class="token string">"像素显示图片"</span><span class="token punctuation">,</span>
SDL_WINDOWPOS_UNDEFINED<span class="token punctuation">,</span> SDL_WINDOWPOS_UNDEFINED<span class="token punctuation">,</span>
bmpimg<span class="token operator">-&gt;</span>w<span class="token punctuation">,</span> bmpimg<span class="token operator">-&gt;</span>h<span class="token punctuation">,</span>
SDL_WINDOW_SHOWN <span class="token operator">|</span> SDL_WINDOW_RESIZABLE<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Surface <span class="token operator">*</span>surf <span class="token operator">=</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
ARGB <span class="token operator">*</span>px <span class="token operator">=</span> <span class="token punctuation">(</span>ARGB <span class="token operator">*</span><span class="token punctuation">)</span>surf<span class="token operator">-&gt;</span>pixels<span class="token punctuation">;</span>
Uint32 index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
Uint32 max_num <span class="token operator">=</span> surf<span class="token operator">-&gt;</span>w <span class="token operator">*</span> surf<span class="token operator">-&gt;</span>h<span class="token punctuation">;</span>
Uint32 <span class="token operator">*</span>index_arr <span class="token operator">=</span> <span class="token punctuation">(</span>Uint32 <span class="token operator">*</span><span class="token punctuation">)</span><span class="token function">malloc</span><span class="token punctuation">(</span>max_num <span class="token operator">*</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>Uint32<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>Uint32 i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> max_num<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">shuffle_array</span><span class="token punctuation">(</span>index_arr<span class="token punctuation">,</span> max_num<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> max_num <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&gt;=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
px<span class="token punctuation">[</span>index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
px<span class="token punctuation">[</span>index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>RGB <span class="token operator">*</span><span class="token punctuation">)</span>bmpimg<span class="token operator">-&gt;</span>pixels<span class="token punctuation">)</span><span class="token punctuation">[</span>index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>r<span class="token punctuation">;</span>
px<span class="token punctuation">[</span>index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>g <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>RGB <span class="token operator">*</span><span class="token punctuation">)</span>bmpimg<span class="token operator">-&gt;</span>pixels<span class="token punctuation">)</span><span class="token punctuation">[</span>index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>g<span class="token punctuation">;</span>
px<span class="token punctuation">[</span>index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>RGB <span class="token operator">*</span><span class="token punctuation">)</span>bmpimg<span class="token operator">-&gt;</span>pixels<span class="token punctuation">)</span><span class="token punctuation">[</span>index_arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>b<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">%</span> <span class="token number">200</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">free</span><span class="token punctuation">(</span>index_arr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>bmpimg<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p><strong>绘制玫瑰</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;math.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token comment">// 定义全局变量</span>
<span class="token keyword">int</span> rosesize <span class="token operator">=</span> <span class="token number">500</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> h <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">250</span><span class="token punctuation">;</span>
<span class="token comment">// 定义结构体</span>
<span class="token keyword">struct</span> <span class="token class-name">DOT</span>
<span class="token punctuation">{</span>
<span class="token keyword">double</span> x<span class="token punctuation">;</span>
<span class="token keyword">double</span> y<span class="token punctuation">;</span>
<span class="token keyword">double</span> z<span class="token punctuation">;</span>
<span class="token keyword">double</span> r<span class="token punctuation">;</span> <span class="token comment">// 红色</span>
<span class="token keyword">double</span> g<span class="token punctuation">;</span> <span class="token comment">// 绿色</span>
<span class="token comment">// b(蓝色) 通过 r 计算</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// 计算点</span>
bool <span class="token function">calc</span><span class="token punctuation">(</span><span class="token keyword">double</span> a<span class="token punctuation">,</span> <span class="token keyword">double</span> b<span class="token punctuation">,</span> <span class="token keyword">double</span> c<span class="token punctuation">,</span> DOT <span class="token operator">&amp;</span>d<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">double</span> j<span class="token punctuation">,</span> n<span class="token punctuation">,</span> o<span class="token punctuation">,</span> w<span class="token punctuation">,</span> z<span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>c <span class="token operator">&gt;</span> <span class="token number">60</span><span class="token punctuation">)</span> <span class="token comment">// 花柄</span>
<span class="token punctuation">{</span>
d<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token function">sin</span><span class="token punctuation">(</span>a <span class="token operator">*</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">13</span> <span class="token operator">+</span> <span class="token number">5</span> <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token number">0.2</span> <span class="token operator">+</span> <span class="token function">pow</span><span class="token punctuation">(</span>b <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">sin</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">50</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>y <span class="token operator">=</span> b <span class="token operator">*</span> rosesize <span class="token operator">+</span> <span class="token number">50</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token number">625</span> <span class="token operator">+</span> <span class="token function">cos</span><span class="token punctuation">(</span>a <span class="token operator">*</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">13</span> <span class="token operator">+</span> <span class="token number">5</span> <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token number">0.2</span> <span class="token operator">+</span> <span class="token function">pow</span><span class="token punctuation">(</span>b <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> b <span class="token operator">*</span> <span class="token number">400</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>r <span class="token operator">=</span> a <span class="token operator">*</span> <span class="token number">1</span> <span class="token operator">-</span> b <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>g <span class="token operator">=</span> a<span class="token punctuation">;</span>
<span class="token keyword">return</span> true<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">double</span> A <span class="token operator">=</span> a <span class="token operator">*</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">double</span> B <span class="token operator">=</span> b <span class="token operator">*</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>A <span class="token operator">*</span> A <span class="token operator">+</span> B <span class="token operator">*</span> B <span class="token operator">&lt;</span> <span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>c <span class="token operator">&gt;</span> <span class="token number">37</span><span class="token punctuation">)</span> <span class="token comment">// 叶</span>
<span class="token punctuation">{</span>
j <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
n <span class="token operator">=</span> j <span class="token operator">?</span> <span class="token number">6</span> <span class="token operator">:</span> <span class="token number">4</span><span class="token punctuation">;</span>
o <span class="token operator">=</span> <span class="token number">0.5</span> <span class="token operator">/</span> <span class="token punctuation">(</span>a <span class="token operator">+</span> <span class="token number">0.01</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">cos</span><span class="token punctuation">(</span>b <span class="token operator">*</span> <span class="token number">125</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token operator">-</span> a <span class="token operator">*</span> <span class="token number">300</span><span class="token punctuation">;</span>
w <span class="token operator">=</span> b <span class="token operator">*</span> h<span class="token punctuation">;</span>
d<span class="token punctuation">.</span>x <span class="token operator">=</span> o <span class="token operator">*</span> <span class="token function">cos</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token operator">+</span> w <span class="token operator">*</span> <span class="token function">sin</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token operator">+</span> j <span class="token operator">*</span> <span class="token number">610</span> <span class="token operator">-</span> <span class="token number">390</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>y <span class="token operator">=</span> o <span class="token operator">*</span> <span class="token function">sin</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token operator">-</span> w <span class="token operator">*</span> <span class="token function">cos</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">550</span> <span class="token operator">-</span> j <span class="token operator">*</span> <span class="token number">350</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token number">1180</span> <span class="token operator">+</span> <span class="token function">cos</span><span class="token punctuation">(</span>B <span class="token operator">+</span> A<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">99</span> <span class="token operator">-</span> j <span class="token operator">*</span> <span class="token number">300</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token number">0.4</span> <span class="token operator">-</span> a <span class="token operator">*</span> <span class="token number">0.1</span> <span class="token operator">+</span> <span class="token function">pow</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> B <span class="token operator">*</span> B<span class="token punctuation">,</span> <span class="token operator">-</span>h <span class="token operator">*</span> <span class="token number">6</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">0.15</span> <span class="token operator">-</span> a <span class="token operator">*</span> b <span class="token operator">*</span> <span class="token number">0.4</span> <span class="token operator">+</span> <span class="token function">cos</span><span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">5</span> <span class="token operator">+</span> <span class="token function">pow</span><span class="token punctuation">(</span><span class="token function">cos</span><span class="token punctuation">(</span><span class="token punctuation">(</span>o <span class="token operator">*</span> <span class="token punctuation">(</span>a <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>B <span class="token operator">&gt;</span> <span class="token number">0</span> <span class="token operator">?</span> w <span class="token operator">:</span> <span class="token operator">-</span>w<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">0.1</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> B <span class="token operator">*</span> B<span class="token punctuation">)</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>g <span class="token operator">=</span> o <span class="token operator">/</span> <span class="token number">1000</span> <span class="token operator">+</span> <span class="token number">0.7</span> <span class="token operator">-</span> o <span class="token operator">*</span> w <span class="token operator">*</span> <span class="token number">0.000003</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> true<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>c <span class="token operator">&gt;</span> <span class="token number">32</span><span class="token punctuation">)</span> <span class="token comment">// 花萼</span>
<span class="token punctuation">{</span>
c <span class="token operator">=</span> c <span class="token operator">*</span> <span class="token number">1.16</span> <span class="token operator">-</span> <span class="token number">0.15</span><span class="token punctuation">;</span>
o <span class="token operator">=</span> a <span class="token operator">*</span> <span class="token number">45</span> <span class="token operator">-</span> <span class="token number">20</span><span class="token punctuation">;</span>
w <span class="token operator">=</span> b <span class="token operator">*</span> b <span class="token operator">*</span> h<span class="token punctuation">;</span>
z <span class="token operator">=</span> o <span class="token operator">*</span> <span class="token function">sin</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">+</span> w <span class="token operator">*</span> <span class="token function">cos</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">620</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>x <span class="token operator">=</span> o <span class="token operator">*</span> <span class="token function">cos</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">-</span> w <span class="token operator">*</span> <span class="token function">sin</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token number">28</span> <span class="token operator">+</span> <span class="token function">cos</span><span class="token punctuation">(</span>B <span class="token operator">*</span> <span class="token number">0.5</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">99</span> <span class="token operator">-</span> b <span class="token operator">*</span> b <span class="token operator">*</span> b <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">-</span> z <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> h<span class="token punctuation">;</span>
d<span class="token punctuation">.</span>z <span class="token operator">=</span> z<span class="token punctuation">;</span>
d<span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token punctuation">(</span>b <span class="token operator">*</span> b <span class="token operator">*</span> <span class="token number">0.3</span> <span class="token operator">+</span> <span class="token function">pow</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> <span class="token punctuation">(</span>A <span class="token operator">*</span> A<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">0.15</span> <span class="token operator">+</span> <span class="token number">0.3</span><span class="token punctuation">)</span> <span class="token operator">*</span> b<span class="token punctuation">;</span>
d<span class="token punctuation">.</span>g <span class="token operator">=</span> b <span class="token operator">*</span> <span class="token number">0.7</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> true<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 花</span>
o <span class="token operator">=</span> A <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">-</span> b<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">80</span> <span class="token operator">-</span> c <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
w <span class="token operator">=</span> <span class="token number">99</span> <span class="token operator">-</span> <span class="token function">cos</span><span class="token punctuation">(</span>A<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">120</span> <span class="token operator">-</span> <span class="token function">cos</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token operator">-</span>h <span class="token operator">-</span> c <span class="token operator">*</span> <span class="token number">4.9</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">cos</span><span class="token punctuation">(</span><span class="token function">pow</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> b<span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">50</span> <span class="token operator">+</span> c <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">;</span>
z <span class="token operator">=</span> o <span class="token operator">*</span> <span class="token function">sin</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">+</span> w <span class="token operator">*</span> <span class="token function">cos</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">700</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>x <span class="token operator">=</span> o <span class="token operator">*</span> <span class="token function">cos</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">-</span> w <span class="token operator">*</span> <span class="token function">sin</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>y <span class="token operator">=</span> B <span class="token operator">*</span> <span class="token number">99</span> <span class="token operator">-</span> <span class="token function">cos</span><span class="token punctuation">(</span><span class="token function">pow</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">50</span> <span class="token operator">-</span> c <span class="token operator">/</span> <span class="token number">3</span> <span class="token operator">-</span> z <span class="token operator">/</span> <span class="token number">1.35</span> <span class="token operator">+</span> <span class="token number">450</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>z <span class="token operator">=</span> z<span class="token punctuation">;</span>
d<span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> b <span class="token operator">/</span> <span class="token number">1.2</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">0.9</span> <span class="token operator">+</span> a <span class="token operator">*</span> <span class="token number">0.1</span><span class="token punctuation">;</span>
d<span class="token punctuation">.</span>g <span class="token operator">=</span> <span class="token function">pow</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> b<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">0.05</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> true<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> false<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">short</span> <span class="token operator">*</span>zBuffer<span class="token punctuation">;</span>
<span class="token keyword">int</span> x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> z<span class="token punctuation">,</span> zBufferIndex<span class="token punctuation">;</span>
DOT dot<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init Failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span>
<span class="token string">"花花"</span><span class="token punctuation">,</span>
SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
<span class="token number">640</span><span class="token punctuation">,</span> <span class="token number">480</span><span class="token punctuation">,</span>
SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Window create failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Surface <span class="token operator">*</span>win_surface <span class="token operator">=</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> win_surface<span class="token operator">-&gt;</span>w<span class="token punctuation">,</span> win_surface<span class="token operator">-&gt;</span>h<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">SDL_FillRect</span><span class="token punctuation">(</span>win_surface<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">,</span> <span class="token number">0xffffffff</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 初始化 z-buffer</span>
zBuffer <span class="token operator">=</span> new <span class="token keyword">short</span><span class="token punctuation">[</span>rosesize <span class="token operator">*</span> rosesize<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token function">memset</span><span class="token punctuation">(</span>zBuffer<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">short</span><span class="token punctuation">)</span> <span class="token operator">*</span> rosesize <span class="token operator">*</span> rosesize<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">1000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">calc</span><span class="token punctuation">(</span><span class="token keyword">double</span><span class="token punctuation">(</span><span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">/</span> RAND_MAX<span class="token punctuation">,</span> <span class="token keyword">double</span><span class="token punctuation">(</span><span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">/</span> RAND_MAX<span class="token punctuation">,</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">46</span> <span class="token operator">/</span> <span class="token number">0.74</span><span class="token punctuation">,</span> dot<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
z <span class="token operator">=</span> <span class="token keyword">int</span><span class="token punctuation">(</span>dot<span class="token punctuation">.</span>z <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
x <span class="token operator">=</span> <span class="token keyword">int</span><span class="token punctuation">(</span>dot<span class="token punctuation">.</span>x <span class="token operator">*</span> rosesize <span class="token operator">/</span> z <span class="token operator">-</span> h <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
y <span class="token operator">=</span> <span class="token keyword">int</span><span class="token punctuation">(</span>dot<span class="token punctuation">.</span>y <span class="token operator">*</span> rosesize <span class="token operator">/</span> z <span class="token operator">-</span> h <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>y <span class="token operator">&gt;=</span> rosesize<span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span>
zBufferIndex <span class="token operator">=</span> y <span class="token operator">*</span> rosesize <span class="token operator">+</span> x<span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>zBuffer<span class="token punctuation">[</span>zBufferIndex<span class="token punctuation">]</span> <span class="token operator">||</span> zBuffer<span class="token punctuation">[</span>zBufferIndex<span class="token punctuation">]</span> <span class="token operator">&gt;</span> z<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
zBuffer<span class="token punctuation">[</span>zBufferIndex<span class="token punctuation">]</span> <span class="token operator">=</span> z<span class="token punctuation">;</span>
<span class="token comment">// 画点</span>
<span class="token keyword">int</span> r <span class="token operator">=</span> <span class="token operator">~</span><span class="token keyword">int</span><span class="token punctuation">(</span><span class="token punctuation">(</span>dot<span class="token punctuation">.</span>r <span class="token operator">*</span> h<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>r <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> r <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>r <span class="token operator">&gt;</span> <span class="token number">255</span><span class="token punctuation">)</span> r <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> g <span class="token operator">=</span> <span class="token operator">~</span><span class="token keyword">int</span><span class="token punctuation">(</span><span class="token punctuation">(</span>dot<span class="token punctuation">.</span>g <span class="token operator">*</span> h<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>g <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> g <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>g <span class="token operator">&gt;</span> <span class="token number">255</span><span class="token punctuation">)</span> g <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> b <span class="token operator">=</span> <span class="token operator">~</span><span class="token keyword">int</span><span class="token punctuation">(</span><span class="token punctuation">(</span>dot<span class="token punctuation">.</span>r <span class="token operator">*</span> dot<span class="token punctuation">.</span>r <span class="token operator">*</span> <span class="token operator">-</span><span class="token number">80</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>b <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> b <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>b <span class="token operator">&gt;</span> <span class="token number">255</span><span class="token punctuation">)</span> b <span class="token operator">=</span> <span class="token number">255</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> index <span class="token operator">=</span> <span class="token punctuation">(</span>x <span class="token operator">+</span> <span class="token number">50</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>y <span class="token operator">-</span> <span class="token number">20</span><span class="token punctuation">)</span> <span class="token operator">*</span> win_surface<span class="token operator">-&gt;</span>w<span class="token punctuation">;</span>
<span class="token punctuation">(</span><span class="token punctuation">(</span>Uint32 <span class="token operator">*</span><span class="token punctuation">)</span>win_surface<span class="token operator">-&gt;</span>pixels<span class="token punctuation">)</span><span class="token punctuation">[</span>index<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">SDL_MapRGB</span><span class="token punctuation">(</span>win_surface<span class="token operator">-&gt;</span>format<span class="token punctuation">,</span> r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
delete <span class="token punctuation">[</span><span class="token punctuation">]</span>zBuffer<span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>win_surface<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2 class="atx" id="渲染">渲染</h2>
<h3 class="atx" id="渲染器创建与清屏">渲染器创建与清屏</h3>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">800</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">600</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器与清屏</span>
<span class="token comment">// 1. 创建渲染器</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 2. 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 4. 渲染呈现 </span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 5. 销毁渲染器</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h3 class="atx" id="绘制点、线">绘制点、线</h3>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;deque&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">800</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">600</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器与清屏</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染点、线</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderDrawPoint</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">200</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">300</span><span class="token punctuation">;</span> i<span class="token operator">+=</span><span class="token number">5</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_RenderDrawPoint</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_RenderDrawLine</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">250</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Point pt<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">250</span><span class="token punctuation">,</span> <span class="token number">190</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderDrawLines</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> pt<span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 练习绘制一个19*19的围棋棋盘</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 销毁渲染器</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h3 class="atx" id="绘制、填充矩形区域">绘制、填充矩形区域</h3>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">800</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">600</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器与清屏</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawBlendMode</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> SDL_BLENDMODE_BLEND<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染矩形</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// SDL_RenderDrawRect(rdr, &amp;rect);</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 练习:思考一下如何实现贪吃蛇一条蛇移动的效果</span>
<span class="token comment">// 可以借助一下vector/deque等容器</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token comment">// SDL_RenderClear(rdr);</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>x <span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token comment">// SDL_RenderDrawRect(rdr, &amp;rect);</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 销毁渲染器</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h3 class="atx" id="图片渲染">图片渲染</h3>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">1369</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">768</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器与清屏</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染图片</span>
<span class="token comment">// 1. 导入图片</span>
SDL_Surface <span class="token operator">*</span>img_surf <span class="token operator">=</span> <span class="token function">SDL_LoadBMP</span><span class="token punctuation">(</span><span class="token string">"../SDL/img/2.bmp"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1296*864</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> img_surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_LoadBMP failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_SetWindowSize</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> img_surf<span class="token operator">-&gt;</span>w<span class="token punctuation">,</span> img_surf<span class="token operator">-&gt;</span>h<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 2. 创建Texture</span>
SDL_Texture <span class="token operator">*</span>texture <span class="token operator">=</span> <span class="token function">SDL_CreateTextureFromSurface</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> img_surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> texture<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateTextureFromSurface failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">648</span><span class="token punctuation">,</span> <span class="token number">432</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 复制Texture</span>
<span class="token function">SDL_RenderCopy</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> texture<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 5. 销毁Texture</span>
<span class="token function">SDL_DestroyTexture</span><span class="token punctuation">(</span>texture<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>img_surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h3 class="atx" id="图片缩放、旋转">图片缩放、旋转</h3>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">1369</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">768</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器与清屏</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染图片</span>
<span class="token comment">// 1. 导入图片</span>
SDL_Surface <span class="token operator">*</span>img_surf <span class="token operator">=</span> <span class="token function">SDL_LoadBMP</span><span class="token punctuation">(</span><span class="token string">"../SDL/img/2.bmp"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1296*864</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> img_surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_LoadBMP failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_SetWindowSize</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> img_surf<span class="token operator">-&gt;</span>w<span class="token punctuation">,</span> img_surf<span class="token operator">-&gt;</span>h<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 2. 创建Texture</span>
SDL_Texture <span class="token operator">*</span>texture <span class="token operator">=</span> <span class="token function">SDL_CreateTextureFromSurface</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> img_surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> texture<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateTextureFromSurface failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">648</span><span class="token punctuation">,</span> <span class="token number">432</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
SDL_Point pt <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 复制Texture</span>
<span class="token function">SDL_RenderCopyEx</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> texture<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">,</span> <span class="token number">90</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> SDL_FLIP_NONE<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> SDL_QUIT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// 5. 销毁Texture</span>
<span class="token function">SDL_DestroyTexture</span><span class="token punctuation">(</span>texture<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>img_surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="代码结构整理">代码结构整理</h2>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">720</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">640</span></span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="窗口事件">窗口事件</h2>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">720</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">640</span></span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_WINDOWEVENT<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>window<span class="token punctuation">.</span>event <span class="token operator">==</span> SDL_WINDOWEVENT_SIZE_CHANGED<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="鼠标事件">鼠标事件</h2>
<h3 class="atx" id="移动">移动</h3>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">720</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">640</span></span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_WINDOWEVENT<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>window<span class="token punctuation">.</span>event <span class="token operator">==</span> SDL_WINDOWEVENT_SIZE_CHANGED<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEMOTION<span class="token operator">:</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"x = %d, y = %d"</span><span class="token punctuation">,</span> event<span class="token punctuation">.</span>motion<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>motion<span class="token punctuation">.</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>x <span class="token operator">=</span> event<span class="token punctuation">.</span>motion<span class="token punctuation">.</span>x <span class="token operator">-</span> <span class="token number">100</span><span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>y <span class="token operator">=</span> event<span class="token punctuation">.</span>motion<span class="token punctuation">.</span>y <span class="token operator">-</span> <span class="token number">50</span><span class="token punctuation">;</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h3 class="atx" id="按键">按键</h3>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">720</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">640</span></span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Point pt<span class="token punctuation">;</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_WINDOWEVENT<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>window<span class="token punctuation">.</span>event <span class="token operator">==</span> SDL_WINDOWEVENT_SIZE_CHANGED<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEMOTION<span class="token operator">:</span>
<span class="token comment">// SDL_Log("x = %d, y = %d", event.motion.x, event.motion.y);</span>
<span class="token comment">// rect.x = event.motion.x - 100;</span>
<span class="token comment">// rect.y = event.motion.y - 50;</span>
<span class="token comment">// draw();</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONDOWN<span class="token operator">:</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_MOUSEBUTTONDOWN x = %d, y = %d, button = %d, clicks = %d"</span><span class="token punctuation">,</span>
event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>button<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>clicks<span class="token punctuation">)</span><span class="token punctuation">;</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONUP<span class="token operator">:</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_MOUSEBUTTONUP x = %d, y = %d, button = %d, clicks = %d"</span><span class="token punctuation">,</span>
event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>button<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>clicks<span class="token punctuation">)</span><span class="token punctuation">;</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="键盘事件">键盘事件</h2>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">720</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">640</span></span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> dx <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Point pt<span class="token punctuation">;</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_WINDOWEVENT<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>window<span class="token punctuation">.</span>event <span class="token operator">==</span> SDL_WINDOWEVENT_SIZE_CHANGED<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEMOTION<span class="token operator">:</span>
<span class="token comment">// SDL_Log("x = %d, y = %d", event.motion.x, event.motion.y);</span>
<span class="token comment">// rect.x = event.motion.x - 100;</span>
<span class="token comment">// rect.y = event.motion.y - 50;</span>
<span class="token comment">// draw();</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONDOWN<span class="token operator">:</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_MOUSEBUTTONDOWN x = %d, y = %d, button = %d, clicks = %d"</span><span class="token punctuation">,</span>
event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>button<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>clicks<span class="token punctuation">)</span><span class="token punctuation">;</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONUP<span class="token operator">:</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_MOUSEBUTTONUP x = %d, y = %d, button = %d, clicks = %d"</span><span class="token punctuation">,</span>
event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>button<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>clicks<span class="token punctuation">)</span><span class="token punctuation">;</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_KEYDOWN<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_UP<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"UP"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_DOWN<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"DOWN"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_LEFT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"LEFT"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_RIGHT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"RIGHT"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_KEYUP<span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_TEXTEDITING<span class="token operator">:</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Edit %s"</span><span class="token punctuation">,</span> event<span class="token punctuation">.</span>edit<span class="token punctuation">.</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_TEXTINPUT<span class="token operator">:</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Input %s"</span><span class="token punctuation">,</span> event<span class="token punctuation">.</span>text<span class="token punctuation">.</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
rect<span class="token punctuation">.</span>x <span class="token operator">+=</span> dx<span class="token punctuation">;</span>
rect<span class="token punctuation">.</span>y <span class="token operator">+=</span> dy<span class="token punctuation">;</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="碰撞以及范围检测">碰撞以及范围检测</h2>
<h2 class="atx" id="播放声音">播放声音</h2>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">1027</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">761</span></span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> dx <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
Uint8 <span class="token operator">*</span>audio_buf<span class="token punctuation">;</span>
Uint32 audio_len<span class="token punctuation">;</span>
Uint32 audio_pos <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
SDL_AudioDeviceID device_id<span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_CloseAudioDevice</span><span class="token punctuation">(</span>device_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeWAV</span><span class="token punctuation">(</span>audio_buf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Surface <span class="token operator">*</span>surf <span class="token operator">=</span> <span class="token function">SDL_LoadBMP</span><span class="token punctuation">(</span><span class="token string">"10.bmp"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Texture <span class="token operator">*</span>texture <span class="token operator">=</span> <span class="token function">SDL_CreateTextureFromSurface</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderCopy</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> texture<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyTexture</span><span class="token punctuation">(</span>texture<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Point pt<span class="token punctuation">;</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_WINDOWEVENT<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>window<span class="token punctuation">.</span>event <span class="token operator">==</span> SDL_WINDOWEVENT_SIZE_CHANGED<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEMOTION<span class="token operator">:</span>
<span class="token comment">// SDL_Log("x = %d, y = %d", event.motion.x, event.motion.y);</span>
<span class="token comment">// rect.x = event.motion.x - 100;</span>
<span class="token comment">// rect.y = event.motion.y - 50;</span>
<span class="token comment">// draw();</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONDOWN<span class="token operator">:</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONUP<span class="token operator">:</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_KEYDOWN<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_UP<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dy <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_DOWN<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dy <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_LEFT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dx <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_RIGHT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dx <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_KEYUP<span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_TEXTEDITING<span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_TEXTINPUT<span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// draw();</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> Uint8 <span class="token operator">*</span> stream<span class="token punctuation">,</span> <span class="token keyword">int</span> len<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">int</span> remain <span class="token operator">=</span> audio_len <span class="token operator">-</span> audio_pos<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>remain <span class="token operator">&gt;</span> len<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_memcpy</span><span class="token punctuation">(</span>stream<span class="token punctuation">,</span> audio_buf <span class="token operator">+</span> audio_pos<span class="token punctuation">,</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span>
audio_pos <span class="token operator">+=</span> len<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">else</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_memcpy</span><span class="token punctuation">(</span>stream<span class="token punctuation">,</span> audio_buf <span class="token operator">+</span> audio_pos<span class="token punctuation">,</span> remain<span class="token punctuation">)</span><span class="token punctuation">;</span>
audio_pos <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">play_wav</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_AudioSpec audio_spec<span class="token punctuation">;</span>
<span class="token comment">// 1. 导入WAV文件</span>
<span class="token function">SDL_LoadWAV</span><span class="token punctuation">(</span><span class="token string">"1.wav"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_spec<span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_buf<span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_len<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 2. 定义播放回调函数</span>
audio_spec<span class="token punctuation">.</span>userdata <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span><span class="token string">"这是外部传进来的数据"</span><span class="token punctuation">;</span>
audio_spec<span class="token punctuation">.</span>callback <span class="token operator">=</span> callback<span class="token punctuation">;</span>
<span class="token comment">// 3. 打开音频设备</span>
device_id <span class="token operator">=</span> <span class="token function">SDL_OpenAudioDevice</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_spec<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 4. 开始播放</span>
<span class="token function">SDL_PauseAudioDevice</span><span class="token punctuation">(</span>device_id<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 5. 释放资源 关闭设备</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">play_wav</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="动画帧率">动画帧率</h2>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">1280</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">720</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">FR</span> <span class="token expression"><span class="token number">25</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">FT</span> <span class="token expression"><span class="token number">1000</span> <span class="token operator">/</span> FR</span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> dx <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
Uint8 <span class="token operator">*</span>audio_buf<span class="token punctuation">;</span>
Uint32 audio_len<span class="token punctuation">;</span>
Uint32 audio_pos <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
SDL_AudioDeviceID device_id<span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_FreeWAV</span><span class="token punctuation">(</span>audio_buf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_CloseAudioDevice</span><span class="token punctuation">(</span>device_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 设置渲染颜色</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 清除屏幕</span>
<span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">char</span> file<span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>index <span class="token operator">&gt;</span> <span class="token number">1736</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_snprintf</span><span class="token punctuation">(</span>file<span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token string">"img/%d.bmp"</span><span class="token punctuation">,</span> index<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Surface <span class="token operator">*</span>surf <span class="token operator">=</span> <span class="token function">SDL_LoadBMP</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>
SDL_Texture <span class="token operator">*</span>texture <span class="token operator">=</span> <span class="token function">SDL_CreateTextureFromSurface</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderCopy</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> texture<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyTexture</span><span class="token punctuation">(</span>texture<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
Uint64 start<span class="token punctuation">,</span> end<span class="token punctuation">;</span>
<span class="token keyword">int</span> delay<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
start <span class="token operator">=</span> <span class="token function">SDL_GetTicks64</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Point pt<span class="token punctuation">;</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_WINDOWEVENT<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>window<span class="token punctuation">.</span>event <span class="token operator">==</span> SDL_WINDOWEVENT_SIZE_CHANGED<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEMOTION<span class="token operator">:</span>
<span class="token comment">// SDL_Log("x = %d, y = %d", event.motion.x, event.motion.y);</span>
<span class="token comment">// rect.x = event.motion.x - 100;</span>
<span class="token comment">// rect.y = event.motion.y - 50;</span>
<span class="token comment">// draw();</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONDOWN<span class="token operator">:</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_MOUSEBUTTONUP<span class="token operator">:</span>
pt <span class="token operator">=</span> <span class="token punctuation">{</span>event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>x<span class="token punctuation">,</span> event<span class="token punctuation">.</span>button<span class="token punctuation">.</span>y<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pt<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>rdr<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 渲染呈现</span>
<span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_KEYDOWN<span class="token operator">:</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_UP<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dy <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_DOWN<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dy <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
dx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_LEFT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dx <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key<span class="token punctuation">.</span>keysym<span class="token punctuation">.</span>sym <span class="token operator">==</span> SDLK_RIGHT<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
dx <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_KEYUP<span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_TEXTEDITING<span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SDL_TEXTINPUT<span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
end <span class="token operator">=</span> <span class="token function">SDL_GetTicks64</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
delay <span class="token operator">=</span> FT <span class="token operator">-</span> <span class="token punctuation">(</span>end <span class="token operator">-</span>start<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>delay <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span>delay<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> Uint8 <span class="token operator">*</span> stream<span class="token punctuation">,</span> <span class="token keyword">int</span> len<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">int</span> remain <span class="token operator">=</span> audio_len <span class="token operator">-</span> audio_pos<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>remain <span class="token operator">&gt;</span> len<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_memcpy</span><span class="token punctuation">(</span>stream<span class="token punctuation">,</span> audio_buf <span class="token operator">+</span> audio_pos<span class="token punctuation">,</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span>
audio_pos <span class="token operator">+=</span> len<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">else</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_memcpy</span><span class="token punctuation">(</span>stream<span class="token punctuation">,</span> audio_buf <span class="token operator">+</span> audio_pos<span class="token punctuation">,</span> remain<span class="token punctuation">)</span><span class="token punctuation">;</span>
audio_pos <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">play_wav</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_AudioSpec audio_spec<span class="token punctuation">;</span>
<span class="token comment">// 1. 导入WAV文件</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_LoadWAV</span><span class="token punctuation">(</span><span class="token string">"2.wav"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_spec<span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_buf<span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_len<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_LoadWAV failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 2. 定义播放回调函数</span>
audio_spec<span class="token punctuation">.</span>callback <span class="token operator">=</span> callback<span class="token punctuation">;</span>
audio_spec<span class="token punctuation">.</span>userdata <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span><span class="token string">"这是外部传进来的数据"</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 打开音频设备</span>
device_id <span class="token operator">=</span> <span class="token function">SDL_OpenAudioDevice</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_spec<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 4. 开始播放</span>
<span class="token function">SDL_PauseAudioDevice</span><span class="token punctuation">(</span>device_id<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 5. 释放资源 关闭设备</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">play_wav</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h2 class="atx" id="其他模块使用">其他模块使用</h2>
<p>其他模块的使用方式同核心模块一样,下载对应的库文件,将头文件、库文件合并到核心库的安装目录,在配置中添加对应的库即可。</p>
<pre><code class="fenced-code-block language-Makefile">CXXFLAGS += -IC:/Users/YAN/Desktop/SDL/lib/SDL2-devel-2.28.2-mingw/SDL2-2.28.2/x86_64-w64-mingw32/include #改成你电脑上的include路径
# CXXFLAGS += -fexec-charset=GBK -finput-charset=UTF-8
LDFLAGS += -LC:/Users/YAN/Desktop/SDL/lib/SDL2-devel-2.28.2-mingw/SDL2-2.28.2/x86_64-w64-mingw32/lib
CXXFLAGS += -std=c++23
LDLIBS += -lSDL2 -lSDL2_ttf # 链接库时加上对应的模块
LDLIBS += -mwindows
main.exe: main.o
$(CXX) $^ -o $(basename $@) $(LDFLAGS) $(LDLIBS)
.PHONY: run clean
run: main.exe
$&lt;
clean:
$(RM) *.exe *.o</code></pre>
<p>文字模块示例</p>
<pre><code class="fenced-code-block language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;SDL2/SDL_ttf.h&gt;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">W</span> <span class="token expression"><span class="token number">1280</span></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">H</span> <span class="token expression"><span class="token number">720</span></span></span>
SDL_Window <span class="token operator">*</span>win <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
SDL_Renderer <span class="token operator">*</span>rdr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
win <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
W<span class="token punctuation">,</span> H<span class="token punctuation">,</span> SDL_WINDOW_RESIZABLE <span class="token operator">|</span> SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> win<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 创建渲染器</span>
rdr <span class="token operator">=</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>win<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> rdr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateRenderer failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 销毁</span>
<span class="token function">SDL_FreeWAV</span><span class="token punctuation">(</span>audio_buf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_CloseAudioDevice</span><span class="token punctuation">(</span>device_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>rdr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Event event<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token function">SDL_PollEvent</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>event<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_Point pt<span class="token punctuation">;</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">case</span> SDL_QUIT<span class="token operator">:</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">draw_text</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment">// 1. 初始化TTF</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">TTF_Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"TTF_Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">TTF_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 2. 打开字体</span>
TTF_Font <span class="token operator">*</span>font <span class="token operator">=</span> <span class="token function">TTF_OpenFont</span><span class="token punctuation">(</span><span class="token string">"C:\\Windows\\Fonts\\simfang.ttf"</span><span class="token punctuation">,</span> <span class="token number">48</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>font<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"TTF_OpenFont failed: %s"</span><span class="token punctuation">,</span> <span class="token function">TTF_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 3. 渲染字体</span>
SDL_Surface <span class="token operator">*</span>txt_surf <span class="token operator">=</span> <span class="token function">TTF_RenderUTF8_LCD</span><span class="token punctuation">(</span>font<span class="token punctuation">,</span> <span class="token string">"你好Hello"</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>txt_surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"TTF_RenderText_Solid failed: %s"</span><span class="token punctuation">,</span> <span class="token function">TTF_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 4. 获取与窗口关联的Surface</span>
SDL_Surface <span class="token operator">*</span>surf <span class="token operator">=</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>surf<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_GetWindowSurface failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 5. 将字体Surface复制到窗口Surface上</span>
SDL_Rect rect <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">500</span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">,</span> txt_surf<span class="token operator">-&gt;</span>w<span class="token punctuation">,</span> txt_surf<span class="token operator">-&gt;</span>h<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">SDL_BlitSurface</span><span class="token punctuation">(</span>txt_surf<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> surf<span class="token punctuation">,</span> <span class="token operator">&amp;</span>rect<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 6. 更新窗口</span>
<span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>win<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 7. 释放与销毁资源</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>txt_surf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">TTF_CloseFont</span><span class="token punctuation">(</span>font<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">TTF_Quit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">main</span></span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">draw_text</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">event_loop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">deinit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>关于文字渲染的几种类型:
<code>*_Solid</code>: 使用纯色填充,速度快,文字渲染质量不佳
<code>*_Shaded</code>: 使用纯色填充,添加一定阴影效果
<code>*_Blended</code>: 使用抗锯齿算法高质量渲染
<code>*_LCD</code>: 针对LCD显示器优化渲染</p>
<h2 class="atx" id="多线程操作">多线程操作</h2>
<h1 class="atx" id="sdl常用函数、结构体、枚举、宏定义">SDL常用函数、结构体、枚举、宏定义</h1>
<h2 class="atx" id="函数">函数</h2>
<h3 class="atx" id="sdl_init">SDL_Init</h3>
<p><strong>声明</strong> </p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_Init</span><span class="token punctuation">(</span>Uint32 flags<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>初始化SDL库子系统</p>
<p><strong>参数</strong></p>
<p>接收参数为宏定义,见下表</p>
<table>
<thead>
<tr>
<th align="center">flags取值</th>
<th align="center">初始化系统</th>
</tr>
</thead>
<tbody><tr>
<td align="center">SDL_INIT_VIDEO</td>
<td align="center">视频子系统,会自动初始化事件子系统</td>
</tr>
<tr>
<td align="center">SDL_INIT_AUDIO</td>
<td align="center">音频子系统</td>
</tr>
<tr>
<td align="center">SDL_INIT_TIMER</td>
<td align="center">定时器子系统</td>
</tr>
<tr>
<td align="center">SDL_INIT_EVENTS</td>
<td align="center">事件子系统</td>
</tr>
<tr>
<td align="center">SDL_INIT_JOYSTICK</td>
<td align="center">操纵杆子系统,自动初始化事件子系统</td>
</tr>
<tr>
<td align="center">SDL_INIT_HAPTIC</td>
<td align="center">触觉子系统</td>
</tr>
<tr>
<td align="center">SDL_INIT_GAMECONTROLLER</td>
<td align="center">控制子系统,自动初始化操纵杆子系统</td>
</tr>
<tr>
<td align="center">SDL_INIT_EVERYTHING</td>
<td align="center">初始化所有子系统</td>
</tr>
</tbody></table>
<p>上述定义可以只初始化其中一个子系统,也可以多个一起初始化,多个时用<kbd>|</kbd>连接。</p>
<p><strong>返回值</strong></p>
<p>初始化成功返回0失败返回一个负数错误代码</p>
<p><strong>用法示例</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 只初始化视频子系统</span>
<span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_VIDEO <span class="token operator">|</span> SDL_INIT_AUDIO<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 初始化视频与音频子系统</span>
<span class="token comment">// 在初始化的同时进行是否成功判断</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_Init</span><span class="token punctuation">(</span>SDL_INIT_AUDIO <span class="token operator">|</span> SDL_INIT_VIDEO<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_Init failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_quit">SDL_Quit</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_Quit</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>清除(退出)所有已初始化的子系统。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_createwindow">SDL_CreateWindow</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_video.h</span>
SDL_Window <span class="token operator">*</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>title<span class="token punctuation">,</span> <span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">,</span> <span class="token keyword">int</span> w<span class="token punctuation">,</span><span class="token keyword">int</span> h<span class="token punctuation">,</span> Uint32 flags<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">title</td>
<td align="center">窗口标题UTF-8编码</td>
</tr>
<tr>
<td align="center">x</td>
<td align="center">窗口起始位置x坐标 通常为居中<font color="blue">SDL_WINDOWPOS_CENTERED</font>或未定义<font color="blue">SDL_WINDOWPOS_UNDEFINED</font></td>
</tr>
<tr>
<td align="center">y</td>
<td align="center">窗口起始位置y坐标 通常为居中<font color="blue">SDL_WINDOWPOS_CENTERED</font>或未定义<font color="blue">SDL_WINDOWPOS_UNDEFINED</font></td>
</tr>
<tr>
<td align="center">w</td>
<td align="center">窗口宽度</td>
</tr>
<tr>
<td align="center">h</td>
<td align="center">窗口高度</td>
</tr>
<tr>
<td align="center">flags</td>
<td align="center">窗口显示标志可以是0或者是枚举类型SDL_WindowFlags中多个标志组合</td>
</tr>
</tbody></table>
<p><code>flags</code>可取值为枚举类型SDL_WindowFlags定义在SDL_video.h中多个值时用<kbd>|</kbd>连接,一些常用值如下</p>
<pre><code class="fenced-code-block language-c"><span class="token keyword">typedef</span> <span class="token keyword">enum</span>
<span class="token punctuation">{</span>
SDL_WINDOW_FULLSCREEN <span class="token operator">=</span> <span class="token number">0x00000001</span><span class="token punctuation">,</span> <span class="token comment">// 全屏显示</span>
SDL_WINDOW_OPENGL <span class="token operator">=</span> <span class="token number">0x00000002</span><span class="token punctuation">,</span> <span class="token comment">// 使用OpenGL</span>
SDL_WINDOW_SHOWN <span class="token operator">=</span> <span class="token number">0x00000004</span><span class="token punctuation">,</span> <span class="token comment">// 显示窗口</span>
SDL_WINDOW_HIDDEN <span class="token operator">=</span> <span class="token number">0x00000008</span><span class="token punctuation">,</span> <span class="token comment">// 隐藏窗口</span>
SDL_WINDOW_BORDERLESS <span class="token operator">=</span> <span class="token number">0x00000010</span><span class="token punctuation">,</span> <span class="token comment">// 窗口无边框</span>
SDL_WINDOW_RESIZABLE <span class="token operator">=</span> <span class="token number">0x00000020</span><span class="token punctuation">,</span> <span class="token comment">// 窗口大小可变</span>
SDL_WINDOW_MINIMIZED <span class="token operator">=</span> <span class="token number">0x00000040</span><span class="token punctuation">,</span> <span class="token comment">// 窗口最大化</span>
SDL_WINDOW_MAXIMIZED <span class="token operator">=</span> <span class="token number">0x00000080</span><span class="token punctuation">,</span> <span class="token comment">// 窗口最小化</span>
SDL_WINDOW_MOUSE_GRABBED <span class="token operator">=</span> <span class="token number">0x00000100</span><span class="token punctuation">,</span>
SDL_WINDOW_INPUT_FOCUS <span class="token operator">=</span> <span class="token number">0x00000200</span><span class="token punctuation">,</span>
SDL_WINDOW_MOUSE_FOCUS <span class="token operator">=</span> <span class="token number">0x00000400</span><span class="token punctuation">,</span>
SDL_WINDOW_FULLSCREEN_DESKTOP <span class="token operator">=</span> <span class="token punctuation">(</span> SDL_WINDOW_FULLSCREEN <span class="token operator">|</span> <span class="token number">0x00001000</span> <span class="token punctuation">)</span><span class="token punctuation">,</span>
SDL_WINDOW_FOREIGN <span class="token operator">=</span> <span class="token number">0x00000800</span><span class="token punctuation">,</span>
SDL_WINDOW_ALLOW_HIGHDPI <span class="token operator">=</span> <span class="token number">0x00002000</span><span class="token punctuation">,</span>
SDL_WINDOW_MOUSE_CAPTURE <span class="token operator">=</span> <span class="token number">0x00004000</span><span class="token punctuation">,</span>
SDL_WINDOW_ALWAYS_ON_TOP <span class="token operator">=</span> <span class="token number">0x00008000</span><span class="token punctuation">,</span> <span class="token comment">// 窗口保持在最顶层</span>
SDL_WINDOW_SKIP_TASKBAR <span class="token operator">=</span> <span class="token number">0x00010000</span><span class="token punctuation">,</span>
SDL_WINDOW_UTILITY <span class="token operator">=</span> <span class="token number">0x00020000</span><span class="token punctuation">,</span>
SDL_WINDOW_TOOLTIP <span class="token operator">=</span> <span class="token number">0x00040000</span><span class="token punctuation">,</span>
SDL_WINDOW_POPUP_MENU <span class="token operator">=</span> <span class="token number">0x00080000</span><span class="token punctuation">,</span>
SDL_WINDOW_KEYBOARD_GRABBED <span class="token operator">=</span> <span class="token number">0x00100000</span><span class="token punctuation">,</span> <span class="token comment">//</span>
SDL_WINDOW_VULKAN <span class="token operator">=</span> <span class="token number">0x10000000</span><span class="token punctuation">,</span>
SDL_WINDOW_METAL <span class="token operator">=</span> <span class="token number">0x20000000</span><span class="token punctuation">,</span>
SDL_WINDOW_INPUT_GRABBED <span class="token operator">=</span> SDL_WINDOW_MOUSE_GRABBED
<span class="token punctuation">}</span> SDL_WindowFlags<span class="token punctuation">;</span></code></pre>
<p><strong>返回值</strong></p>
<p>窗口创建成功则返回对应窗口指针失败则返回NULL。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_destroywindow">SDL_DestroyWindow</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_video.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>SDL_Window <span class="token operator">*</span> window<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>销毁由SDL_CreateWindow创建的窗口。</p>
<p><strong>用法示例</strong></p>
<pre><code class="fenced-code-block language-c">SDL_Window <span class="token operator">*</span>window <span class="token operator">=</span> <span class="token function">SDL_CreateWindow</span><span class="token punctuation">(</span>
<span class="token string">"SDLWindow"</span><span class="token punctuation">,</span>
SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span> SDL_WINDOWPOS_CENTERED<span class="token punctuation">,</span>
WIDTH<span class="token punctuation">,</span> HEIGHT<span class="token punctuation">,</span>
SDL_WINDOW_SHOWN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">NULL</span> <span class="token operator">==</span> window<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"SDL_CreateWindow failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">SDL_Delay</span><span class="token punctuation">(</span><span class="token number">5000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_DestroyWindow</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_delay">SDL_Delay</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_timer.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_Delay</span><span class="token punctuation">(</span>Uint32 ms<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>让程序暂停(阻塞)指定时间,单位为毫秒。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_log">SDL_Log</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_log.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>fmt<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span></code></pre>
<p><strong>功能</strong></p>
<p>向控制台输出信息用法与C语言中printf一样。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_geterror">SDL_GetError</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_error.h</span>
<span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>获取最后一次发生错误对应的错误信息。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_getwindowsurface">SDL_GetWindowSurface</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_video.h</span>
SDL_Surface <span class="token operator">*</span> <span class="token function">SDL_GetWindowSurface</span><span class="token punctuation">(</span>SDL_Window <span class="token operator">*</span> window<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>获取与window关联的SDL_Surface指针。</p>
<p><strong>返回值</strong></p>
<p>成功则返回<a href="#sdlsurface">SDL_Surface</a>指针失败则返回NULL。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_freesurface">SDL_FreeSurface</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_surface.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_FreeSurface</span><span class="token punctuation">(</span>SDL_Surface <span class="token operator">*</span> surface<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>释放SDL_Surface指针。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_fillrect">SDL_FillRect</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_surface.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_FillRect</span><span class="token punctuation">(</span>SDL_Surface <span class="token operator">*</span> dst<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> rect<span class="token punctuation">,</span> Uint32 color<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>在指定的surface上绘制填充一个指定区域的矩形。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">dst</td>
<td align="center">需要在上面进行绘制的surface指针</td>
</tr>
<tr>
<td align="center">rect</td>
<td align="center">需要绘制的区域</td>
</tr>
<tr>
<td align="center">color</td>
<td align="center">4字节无符号整型表示颜色通常用十六进制表示例如0xFF32BACD。每两个字符表示一个通道分别人ARGB通道。但在本函数中透明通道A不会生效所以可以只写RGB三个字节即0x32BACD</td>
</tr>
</tbody></table>
<p>区域结构体见<a href="#sdlrect">SDL_Rect</a></p>
<p><strong>返回值</strong></p>
<p>填充成功返回0失败返回负数错误代码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_updatewindowsurface">SDL_UpdateWindowSurface</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_video.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_UpdateWindowSurface</span><span class="token punctuation">(</span>SDL_Window <span class="token operator">*</span> window<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>将Surface的数据更新到屏幕上</p>
<p><strong>返回值</strong></p>
<p>更新成功返回0失败返回负数错误代码</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_maprgb">SDL_MapRGB</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_pixels.h</span>
Uint32 <span class="token function">SDL_MapRGB</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_PixelFormat <span class="token operator">*</span> format<span class="token punctuation">,</span>Uint8 r<span class="token punctuation">,</span> Uint8 g<span class="token punctuation">,</span> Uint8 b<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>使用指定的像素格式将r, g, b三个通道的颜色分量转为一个颜色值。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">format</td>
<td align="center">描述像素格式的结构体</td>
</tr>
<tr>
<td align="center">r</td>
<td align="center">红色通道分量值0~255</td>
</tr>
<tr>
<td align="center">g</td>
<td align="center">绿色通道分量值, 0~255</td>
</tr>
<tr>
<td align="center">b</td>
<td align="center">蓝色通道分量值, 0~255</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>由三个分量合并成的像素颜色值。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_maprgba">SDL_MapRGBA</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_pixels.h</span>
Uint32 <span class="token function">SDL_MapRGBA</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_PixelFormat <span class="token operator">*</span> format<span class="token punctuation">,</span>Uint8 r<span class="token punctuation">,</span> Uint8 g<span class="token punctuation">,</span> Uint8 b<span class="token punctuation">,</span> Uint8 a<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>使用指定的像素格式将r, g, b, a 四个通道的颜色分量转为一个颜色值。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">format</td>
<td align="center">描述像素格式的结构体</td>
</tr>
<tr>
<td align="center">r</td>
<td align="center">红色通道分量值0~255</td>
</tr>
<tr>
<td align="center">g</td>
<td align="center">绿色通道分量值, 0~255</td>
</tr>
<tr>
<td align="center">b</td>
<td align="center">蓝色通道分量值, 0~255</td>
</tr>
<tr>
<td align="center">a</td>
<td align="center">透明通道分量值, 0~255</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>由三个分量合并成的像素颜色值。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_loadbmp">SDL_LoadBMP</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_surface.h</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">SDL_LoadBMP</span><span class="token expression"><span class="token punctuation">(</span>file<span class="token punctuation">)</span> <span class="token function">SDL_LoadBMP_RW</span><span class="token punctuation">(</span><span class="token function">SDL_RWFromFile</span><span class="token punctuation">(</span>file<span class="token punctuation">,</span> </span><span class="token string">"rb"</span><span class="token expression"><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span></span></span>
<span class="token comment">// SDL_LoadBMP的声明是一个宏定义其效果等同于下面的写法</span>
SDL_Surface <span class="token operator">*</span> <span class="token function">SDL_LoadBMP_RW</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span> file<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>导入BMP图片数据。</p>
<p><strong>参数</strong></p>
<p>file: 文件名</p>
<p><strong>返回值</strong></p>
<p>导入成功返回一个指向<a href="#sdlsurface">SDL_Surface</a>的指针导入失败则返回NULL。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_blitsurface">SDL_BlitSurface</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_surface.h</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">SDL_BlitSurface</span> <span class="token expression">SDL_UpperBlit</span></span>
<span class="token keyword">int</span> <span class="token function">SDL_UpperBlit</span><span class="token punctuation">(</span>SDL_Surface <span class="token operator">*</span> src<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> srcrect<span class="token punctuation">,</span>SDL_Surface <span class="token operator">*</span> dst<span class="token punctuation">,</span> SDL_Rect <span class="token operator">*</span> dstrect<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>将一个surface的内容复制到另一个surface当中。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">src</td>
<td align="center">源surface</td>
</tr>
<tr>
<td align="center">srcrect</td>
<td align="center">源surface需要复制的区域</td>
</tr>
<tr>
<td align="center">dst</td>
<td align="center">目标surface</td>
</tr>
<tr>
<td align="center">dstrect</td>
<td align="center">目标surface的区域不生效</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>复制成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_blitscaled">SDL_BlitScaled</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_surface.h</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">SDL_BlitScaled</span> <span class="token expression">SDL_UpperBlitScaled</span></span>
<span class="token keyword">int</span> <span class="token function">SDL_UpperBlitScaled</span><span class="token punctuation">(</span>SDL_Surface <span class="token operator">*</span> src<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> srcrect<span class="token punctuation">,</span>SDL_Surface <span class="token operator">*</span> dst<span class="token punctuation">,</span> SDL_Rect <span class="token operator">*</span> dstrect<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>将一个surface的内容复制到另一个surface当中。两个区域大小不一致时进行缩放。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">src</td>
<td align="center">源surface</td>
</tr>
<tr>
<td align="center">srcrect</td>
<td align="center">源surface需要复制的区域</td>
</tr>
<tr>
<td align="center">dst</td>
<td align="center">目标surface</td>
</tr>
<tr>
<td align="center">dstrect</td>
<td align="center">目标surface的区域</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>复制成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_creatergbsurface">SDL_CreateRGBSurface</h3>
<h3 class="atx" id="sdl_creatergbsurfacewithformat">SDL_CreateRGBSurfaceWithFormat</h3>
<h3 class="atx" id="sdl_creatergbsurfacefrom">SDL_CreateRGBSurfaceFrom</h3>
<h3 class="atx" id="sdl_creatergbsurfacewithformatfrom">SDL_CreateRGBSurfaceWithFormatFrom</h3>
<h3 class="atx" id="sdl_locksurface">SDL_LockSurface</h3>
<h3 class="atx" id="sdl_unlocksurface">SDL_UnlockSurface</h3>
<h3 class="atx" id="sdl_createrenderer">SDL_CreateRenderer</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
SDL_Renderer <span class="token operator">*</span> <span class="token function">SDL_CreateRenderer</span><span class="token punctuation">(</span>SDL_Window <span class="token operator">*</span> window<span class="token punctuation">,</span><span class="token keyword">int</span> index<span class="token punctuation">,</span> Uint32 flags<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>给指定窗口创建一个2D渲染环境。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">window</td>
<td align="center">需要创建渲染环境的窗口指针</td>
</tr>
<tr>
<td align="center">index</td>
<td align="center">初始化渲染驱动索引。通常为-1表示自动初始化第一个支持的驱动</td>
</tr>
<tr>
<td align="center">flags</td>
<td align="center">0或者SDL_RendererFlags一个或多个值的组合</td>
</tr>
</tbody></table>
<p><code>SDL_RendererFlags</code>为枚举类型,多个值时用<kbd>|</kbd>连接。如下</p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">enum</span>
<span class="token punctuation">{</span>
SDL_RENDERER_SOFTWARE <span class="token operator">=</span> <span class="token number">0x00000001</span><span class="token punctuation">,</span> <span class="token comment">// 软件(CPU)渲染</span>
SDL_RENDERER_ACCELERATED <span class="token operator">=</span> <span class="token number">0x00000002</span><span class="token punctuation">,</span> <span class="token comment">// 硬件加速</span>
SDL_RENDERER_PRESENTVSYNC <span class="token operator">=</span> <span class="token number">0x00000004</span><span class="token punctuation">,</span>
SDL_RENDERER_TARGETTEXTURE <span class="token operator">=</span> <span class="token number">0x00000008</span>
<span class="token punctuation">}</span> SDL_RendererFlags<span class="token punctuation">;</span></code></pre>
<p><strong>返回值</strong></p>
<p>成功返回渲染器指针失败返回NULL。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_destroyrenderer">SDL_DestroyRenderer</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_DestroyRenderer</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>销毁渲染环境并释放关联的texture</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_setrenderdrawcolor">SDL_SetRenderDrawColor</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_SetRenderDrawColor</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span>Uint8 r<span class="token punctuation">,</span> Uint8 g<span class="token punctuation">,</span> Uint8 b<span class="token punctuation">,</span>Uint8 a<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>设置绘制操作(绘制/填充矩形、线条、点以及清除屏幕)的颜色。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">render</td>
<td align="center">渲染器</td>
</tr>
<tr>
<td align="center">r</td>
<td align="center">红色通道值</td>
</tr>
<tr>
<td align="center">g</td>
<td align="center">绿色通道值</td>
</tr>
<tr>
<td align="center">b</td>
<td align="center">蓝色通道值</td>
</tr>
<tr>
<td align="center">a</td>
<td align="center">透明通道值</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>设置成功返回0失败返回负数错误代码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderclear">SDL_RenderClear</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderClear</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>利用<a href="#sdlsetrenderdrawcolor">SDL_SetRenderDrawColor</a>设置的颜色清除当前渲染目标。</p>
<p><strong>返回值</strong></p>
<p>清除成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderpresent">SDL_RenderPresent</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_RenderPresent</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>将渲染操作的数据更新到屏幕上。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_setrenderdrawblendmode">SDL_SetRenderDrawBlendMode</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_SetRenderDrawBlendMode</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span>SDL_BlendMode blendMode<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>为绘制操作设置颜色混合模式。</p>
<p><strong>参数</strong></p>
<p>混合模式为枚举类型SDL_BlendMode定义及常用值如下</p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_blendmode.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">enum</span>
<span class="token punctuation">{</span>
SDL_BLENDMODE_NONE <span class="token operator">=</span> <span class="token number">0x00000000</span><span class="token punctuation">,</span> <span class="token comment">// 默认模式。无混合,透明通道不生效</span>
SDL_BLENDMODE_BLEND <span class="token operator">=</span> <span class="token number">0x00000001</span><span class="token punctuation">,</span> <span class="token comment">// Alpha通道混合透明通道生效</span>
<span class="token comment">// 下面这些混合模式暂时不用管, 有兴趣可以自行研究一下</span>
SDL_BLENDMODE_ADD <span class="token operator">=</span> <span class="token number">0x00000002</span><span class="token punctuation">,</span>
SDL_BLENDMODE_MOD <span class="token operator">=</span> <span class="token number">0x00000004</span><span class="token punctuation">,</span>
SDL_BLENDMODE_MUL <span class="token operator">=</span> <span class="token number">0x00000008</span><span class="token punctuation">,</span>
SDL_BLENDMODE_INVALID <span class="token operator">=</span> <span class="token number">0x7FFFFFFF</span>
<span class="token punctuation">}</span> SDL_BlendMode<span class="token punctuation">;</span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderdrawpoint">SDL_RenderDrawPoint</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderDrawPoint</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>根据提供的坐标在当前渲染目标上绘制一个点。</p>
<p><strong>返回值</strong></p>
<p>绘制成功返回0失败返回负值错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderdrawpoints">SDL_RenderDrawPoints</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderDrawPoints</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span><span class="token keyword">const</span> SDL_Point <span class="token operator">*</span> points<span class="token punctuation">,</span><span class="token keyword">int</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>在当前渲染环境上绘制多个点。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">renderer</td>
<td align="center">当前渲染器指针</td>
</tr>
<tr>
<td align="center">points</td>
<td align="center">指向一个<a href="#sdlpoint">SDL_Point</a>数组的指针</td>
</tr>
<tr>
<td align="center">count</td>
<td align="center">点的数量</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>绘制成功则返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderdrawline">SDL_RenderDrawLine</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderDrawLine</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span><span class="token keyword">int</span> x1<span class="token punctuation">,</span> <span class="token keyword">int</span> y1<span class="token punctuation">,</span> <span class="token keyword">int</span> x2<span class="token punctuation">,</span> <span class="token keyword">int</span> y2<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>根据提供的两个点的坐标在当前渲染环境上绘制一条线。</p>
<p><strong>返回值</strong></p>
<p>绘制成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderdrawlines">SDL_RenderDrawLines</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> SDLCALL <span class="token function">SDL_RenderDrawLines</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span><span class="token keyword">const</span> SDL_Point <span class="token operator">*</span> points<span class="token punctuation">,</span><span class="token keyword">int</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>沿着提供的多个点绘制线段。</p>
<p><strong>参数</strong></p>
<p><a href="#sdlrenderdrawpoints">SDL_RenderDrawPoints</a>参数。</p>
<p><strong>返回值</strong></p>
<p>绘制成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderdrawrect">SDL_RenderDrawRect</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderDrawRect</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> rect<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>在当前渲染目标上指定区域绘制一个矩形。</p>
<p><strong>返回值</strong></p>
<p>绘制成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderdrawrects">SDL_RenderDrawRects</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderDrawRects</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> rects<span class="token punctuation">,</span> <span class="token keyword">int</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>根据提供的区域数组在当前渲染目标上绘制多个矩形。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">renderer</td>
<td align="center">渲染器指针</td>
</tr>
<tr>
<td align="center">rects</td>
<td align="center">指向<a href="#sdlrect">SDL_Rect</a>数组的指针</td>
</tr>
<tr>
<td align="center">count</td>
<td align="center">区域数量</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>绘制成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderfillrect">SDL_RenderFillRect</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderFillRect</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> rect<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>在当前渲染目标上指定区域填充一个矩形。</p>
<p><strong>返回值</strong></p>
<p>填充成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_renderfillrects">SDL_RenderFillRects</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderFillRects</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> rects<span class="token punctuation">,</span> <span class="token keyword">int</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>根据提供的区域数组在当前渲染目标上填充多个矩形。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">renderer</td>
<td align="center">渲染器指针</td>
</tr>
<tr>
<td align="center">rects</td>
<td align="center">指向<a href="#sdlrect">SDL_Rect</a>数组的指针</td>
</tr>
<tr>
<td align="center">count</td>
<td align="center">区域数量</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>填充成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_rendersetscale">SDL_RenderSetScale</h3>
<h3 class="atx" id="sdl_createtexturefromsurface">SDL_CreateTextureFromSurface</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
DL_Texture <span class="token operator">*</span> <span class="token function">SDL_CreateTextureFromSurface</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span> SDL_Surface <span class="token operator">*</span> surface<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>由已存在的Surface创建Texture。</p>
<p><strong>返回值</strong></p>
<p>创建成功返回对应SDL_Texture指针失败返回NULL。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_destroytexture">SDL_DestroyTexture</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_DestroyTexture</span><span class="token punctuation">(</span>SDL_Texture <span class="token operator">*</span> texture<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>销毁指定的Texture。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_rendercopy">SDL_RenderCopy</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_RenderCopy</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span> SDL_Texture <span class="token operator">*</span> texture<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> srcrect<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> dstrect<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>从Texture中复制指定部分到渲染目标中。当源区域与指定区域大小不一致时会进行相应缩放。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">renderer</td>
<td align="center">渲染器指针</td>
</tr>
<tr>
<td align="center">texture</td>
<td align="center">需要进行复制的texture</td>
</tr>
<tr>
<td align="center">srcrect</td>
<td align="center">需要进行复制的源区域NULL表示整个区域</td>
</tr>
<tr>
<td align="center">dstrect</td>
<td align="center">需要进行复制的目标区域NULL表示整个区域</td>
</tr>
</tbody></table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_rendercopyex">SDL_RenderCopyEx</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> SDLCALL <span class="token function">SDL_RenderCopyEx</span><span class="token punctuation">(</span>SDL_Renderer <span class="token operator">*</span> renderer<span class="token punctuation">,</span> SDL_Texture <span class="token operator">*</span> texture<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> srcrect<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> dstrect<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">double</span> angle<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Point <span class="token operator">*</span>center<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_RendererFlip flip<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>从Texture中复制指定部分到渲染目标中 同时可进行旋转和镜像翻转操作。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">render</td>
<td align="center">渲染器指针</td>
</tr>
<tr>
<td align="center">texture</td>
<td align="center">需要进行复制的Texture</td>
</tr>
<tr>
<td align="center">srcrect</td>
<td align="center">需要进行复制的源区域NULL表示整个区域</td>
</tr>
<tr>
<td align="center">dstrect</td>
<td align="center">复制去的目标区域NULL表示整个渲染目标区域</td>
</tr>
<tr>
<td align="center">angle</td>
<td align="center">旋转角度,顺时针方向旋转</td>
</tr>
<tr>
<td align="center">center</td>
<td align="center">旋转中心点为相对dstrect左上角的坐标。NULL表示围绕dstrect中心旋转</td>
</tr>
<tr>
<td align="center">flip</td>
<td align="center">镜像翻转。为枚举类型SDL_RendererFlip见下</td>
</tr>
</tbody></table>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">enum</span>
<span class="token punctuation">{</span>
SDL_FLIP_NONE <span class="token operator">=</span> <span class="token number">0x00000000</span><span class="token punctuation">,</span> <span class="token comment">// 不进行翻转</span>
SDL_FLIP_HORIZONTAL <span class="token operator">=</span> <span class="token number">0x00000001</span><span class="token punctuation">,</span> <span class="token comment">// 进行水平镜像翻转</span>
SDL_FLIP_VERTICAL <span class="token operator">=</span> <span class="token number">0x00000002</span> <span class="token comment">// 进行垂直镜像翻转</span>
<span class="token punctuation">}</span> SDL_RendererFlip<span class="token punctuation">;</span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_settexturealphamod">SDL_SetTextureAlphaMod</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_SetTextureAlphaMod</span><span class="token punctuation">(</span>SDL_Texture <span class="token operator">*</span> texture<span class="token punctuation">,</span> Uint8 alpha<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>为render copy设置透明度需要配合<a href="#sdlsettextureblendmode">SDL_SetTextureBlendMode</a>使用。</p>
<p><strong>返回值</strong></p>
<p>设置成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_settextureblendmode">SDL_SetTextureBlendMode</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_render.h</span>
<span class="token keyword">int</span> <span class="token function">SDL_SetTextureBlendMode</span><span class="token punctuation">(</span>SDL_Texture <span class="token operator">*</span> texture<span class="token punctuation">,</span> SDL_BlendMode blendMode<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p><a href="#sdlrendercopy">SDL_RenderCopy</a>设置颜色混合模式。</p>
<p><strong>参数</strong></p>
<p>SDL_BlendMode见<a href="#sdlsetrenderdrawblendmode">SDL_SetRenderDrawBlendMode</a>参数。</p>
<p><strong>返回值</strong></p>
<p>成功返回0失败返回负数错误码。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_updatetexture">SDL_UpdateTexture</h3>
<h3 class="atx" id="sdl_updateyuvtexture">SDL_UpdateYUVTexture</h3>
<h3 class="atx" id="sdl_updatenvtexture">SDL_UpdateNVTexture</h3>
<h3 class="atx" id="sdl_locktexture">SDL_LockTexture</h3>
<h3 class="atx" id="sdl_locktexturetosurface">SDL_LockTextureToSurface</h3>
<h3 class="atx" id="sdl_unlocktexture">SDL_UnlockTexture</h3>
<h3 class="atx" id="sdl_pointinrect">SDL_PointInRect</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
SDL_bool <span class="token function">SDL_PointInRect</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_Point <span class="token operator">*</span>p<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>判断一个点是否在一个区域中。</p>
<p><strong>参数</strong></p>
<p><a href="#sdlpoint">SDL_Point</a> </p>
<p><a href="#sdlrect">SDL_Rect</a></p>
<p><strong>返回值</strong></p>
<p><a href="#sdlbool">SDL_bool</a></p>
<p>点在区域内返回SDL_TRUE 点不在区域内返回SDL_FALSE。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_rectempty">SDL_RectEmpty</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
SDL_bool <span class="token function">SDL_RectEmpty</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>判断一个区域是否面积。</p>
<p><strong>参数</strong></p>
<p><a href="#sdlrect">SDL_Rect</a></p>
<p><strong>返回值</strong></p>
<p>如果r为NULL或者对应区域面积计算值小于或等于0则返回SDL_TRUE否则返回SDL_FALSE。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_rectequals">SDL_RectEquals</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
SDL_bool <span class="token function">SDL_RectEquals</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span>a<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>判断两个区域是否相同。</p>
<p><strong>参数</strong></p>
<p><a href="#sdlrect">SDL_Rect</a></p>
<p><strong>返回值</strong></p>
<p>如果两个SDL_Rect指针都不为NULL且左上角坐标相同、宽高也相同则返回SDL_TRUE否则返回SDL_FALSE。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_hasintersection">SDL_HasIntersection</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
SDL_bool <span class="token function">SDL_HasIntersection</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> A<span class="token punctuation">,</span><span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> B<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>判断两个矩形区域是否有相交部分。</p>
<p><strong>参数</strong></p>
<p><a href="#sdlrect">SDL_Rect</a></p>
<p><strong>返回值</strong></p>
<p>如果两个SDL_Rect指针都不为NULL且有相交部分则返回SDL_TRUE否则返回SDL_FALSE。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_intersectrect">SDL_IntersectRect</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
SDL_bool SDLCALL <span class="token function">SDL_IntersectRect</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> A<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> B<span class="token punctuation">,</span> SDL_Rect <span class="token operator">*</span> result<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>计算两个矩形区域相交部分。</p>
<p><strong>参数</strong></p>
<p>AB 需要计算的两个区域</p>
<p>result A与B相交的部分。</p>
<p><a href="#sdlrect">SDL_Rect</a></p>
<p><strong>返回值</strong></p>
<p>如果A、B有相交部分则返回SDL_TRUE否则返回SDL_FALSE。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_unionrect">SDL_UnionRect</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
<span class="token keyword">void</span> SDLCALL <span class="token function">SDL_UnionRect</span><span class="token punctuation">(</span><span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> A<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_Rect <span class="token operator">*</span> B<span class="token punctuation">,</span> SDL_Rect <span class="token operator">*</span> result<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>计算两个矩形区域的并集。如果A、B是两个分离开的区域则并为能将A、B两个区域包含在内的最小矩形区域。</p>
<p><strong>参数</strong></p>
<p>AB 需要计算的两个区域</p>
<p>result A与B并集。</p>
<p><a href="#sdlrect">SDL_Rect</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_loadwav">SDL_LoadWAV</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_audio.h</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">SDL_LoadWAV</span><span class="token expression"><span class="token punctuation">(</span>file<span class="token punctuation">,</span> spec<span class="token punctuation">,</span> audio_buf<span class="token punctuation">,</span> audio_len<span class="token punctuation">)</span> </span><span class="token punctuation">\</span>
<span class="token expression"><span class="token function">SDL_LoadWAV_RW</span><span class="token punctuation">(</span><span class="token function">SDL_RWFromFile</span><span class="token punctuation">(</span>file<span class="token punctuation">,</span> </span><span class="token string">"rb"</span><span class="token expression"><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span> spec<span class="token punctuation">,</span>audio_buf<span class="token punctuation">,</span>audio_len<span class="token punctuation">)</span></span></span>
SDL_AudioSpec <span class="token operator">*</span> <span class="token function">SDL_LoadWAV_RW</span><span class="token punctuation">(</span>SDL_RWops <span class="token operator">*</span> src<span class="token punctuation">,</span> <span class="token keyword">int</span> freesrc<span class="token punctuation">,</span> SDL_AudioSpec <span class="token operator">*</span> spec<span class="token punctuation">,</span> Uint8 <span class="token operator">*</span><span class="token operator">*</span> audio_buf<span class="token punctuation">,</span> Uint32 <span class="token operator">*</span> audio_len<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>导入WAV格式音频文件。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">file</td>
<td align="center">WAV文件名</td>
</tr>
<tr>
<td align="center">spec</td>
<td align="center">SDL_AudioSpec音频文件信息</td>
</tr>
<tr>
<td align="center">audio_buf</td>
<td align="center">音频文件数据指针</td>
</tr>
<tr>
<td align="center">audio_len</td>
<td align="center">音频文件长度(字节)指针</td>
</tr>
</tbody></table>
<p><a href="#sdlaudiospec">SDL_AudioSpec</a></p>
<p><strong>返回值</strong></p>
<p>成功返回SDL_AudioSpec指针失败返回NULL。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_freewav">SDL_FreeWAV</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_audio.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_FreeWAV</span><span class="token punctuation">(</span>Uint8 <span class="token operator">*</span> audio_buf<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>释放<a href="#sdlloadwav">SDL_LoadWAV</a>导入的音频数据。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_openaudiodevice">SDL_OpenAudioDevice</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_audio.h</span>
SDL_AudioDeviceID <span class="token function">SDL_OpenAudioDevice</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>device<span class="token punctuation">,</span> <span class="token keyword">int</span> iscapture<span class="token punctuation">,</span> <span class="token keyword">const</span> SDL_AudioSpec <span class="token operator">*</span>desired<span class="token punctuation">,</span> SDL_AudioSpec <span class="token operator">*</span>obtained<span class="token punctuation">,</span> <span class="token keyword">int</span> allowed_changes<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>打开指定的音频设备。</p>
<p><strong>参数</strong></p>
<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">含义</th>
</tr>
</thead>
<tbody><tr>
<td align="center">device</td>
<td align="center">设备名称,由<a href="#sdlgetaudiodevicename">SDL_GetAudioDeviceName</a>获得为NULL则请求能使用的默认设备</td>
</tr>
<tr>
<td align="center">iscapture</td>
<td align="center">是否是录音设备0表示播放设备非0表示录音设备</td>
</tr>
<tr>
<td align="center">desired</td>
<td align="center">期望输出格式。<a href="#sdlaudiospec">SDL_AudioSpec</a></td>
</tr>
<tr>
<td align="center">obtained</td>
<td align="center">实际输出格式。<a href="#sdlaudiospec">SDL_AudioSpec</a></td>
</tr>
<tr>
<td align="center">allowed_changes</td>
<td align="center">当硬件不支持时是否允许改变。通常为0</td>
</tr>
</tbody></table>
<p><strong>返回值</strong></p>
<p>成功则返回一个有效设备ID。失败返回0</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_pauseaudiodevice">SDL_PauseAudioDevice</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_audio.h</span>
<span class="token keyword">void</span> <span class="token function">SDL_PauseAudioDevice</span><span class="token punctuation">(</span>SDL_AudioDeviceID dev<span class="token punctuation">,</span> <span class="token keyword">int</span> pause_on<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>设置指定播放设备的暂停和播放。</p>
<p><strong>参数</strong></p>
<p>dev<a href="#sdlopenaudiodevice">SDL_OpenAudioDevice</a>打开的设备ID。</p>
<p>pause_on 暂停/播放0为播放非0为暂停。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_getaudiodevicename">SDL_GetAudioDeviceName</h3>
<p><strong>声明</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_audio.h</span>
<span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span> <span class="token function">SDL_GetAudioDeviceName</span><span class="token punctuation">(</span><span class="token keyword">int</span> index<span class="token punctuation">,</span> <span class="token keyword">int</span> iscapture<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p><strong>功能</strong></p>
<p>根据索引查询音频设备名称。</p>
<p><strong>参数</strong></p>
<p>index 设备索引</p>
<p>iscapture 是否为录音设备。0查询非录音设备非0查询录音设备。</p>
<p><strong>返回值</strong></p>
<p>查询到设备返回设备名称否则返回NULL。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2 class="atx" id="结构体、枚举、宏定义">结构体、枚举、宏定义</h2>
<h3 class="atx" id="sdl_bool">SDL_bool</h3>
<p><strong>定义</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_stdinc.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">enum</span>
<span class="token punctuation">{</span>
SDL_FALSE <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span>
SDL_TRUE <span class="token operator">=</span> <span class="token number">1</span>
<span class="token punctuation">}</span> SDL_bool<span class="token punctuation">;</span></code></pre>
<p><strong>描述</strong></p>
<p>定义布尔值。虽然也是1为真0为假但是这样定义之后在代码中使用这个定义可以增加可读性。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_point">SDL_Point</h3>
<p><strong>定义</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">SDL_Point</span>
<span class="token punctuation">{</span>
<span class="token keyword">int</span> x<span class="token punctuation">;</span> <span class="token comment">// 点的横坐标</span>
<span class="token keyword">int</span> y<span class="token punctuation">;</span> <span class="token comment">// 点的纵坐标</span>
<span class="token punctuation">}</span> SDL_Point<span class="token punctuation">;</span></code></pre>
<p><strong>描述</strong></p>
<p>定义了一个点。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_rect">SDL_Rect</h3>
<p><strong>定义</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_rect.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">SDL_Rect</span>
<span class="token punctuation">{</span>
<span class="token keyword">int</span> x<span class="token punctuation">,</span> y<span class="token punctuation">;</span> <span class="token comment">//矩形区域左上角坐标</span>
<span class="token keyword">int</span> w<span class="token punctuation">,</span> h<span class="token punctuation">;</span> <span class="token comment">// 矩形区域宽和高 单位为像素</span>
<span class="token punctuation">}</span> SDL_Rect<span class="token punctuation">;</span></code></pre>
<p><strong>描述</strong></p>
<p>一个由左上角坐标和宽高决定的矩形区域。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_surface">SDL_Surface</h3>
<p><strong>定义</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_surface.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">SDL_Surface</span>
<span class="token punctuation">{</span>
Uint32 flags<span class="token punctuation">;</span> <span class="token comment">//</span>
SDL_PixelFormat <span class="token operator">*</span>format<span class="token punctuation">;</span> <span class="token comment">// 像素格式信息</span>
<span class="token keyword">int</span> w<span class="token punctuation">,</span> h<span class="token punctuation">;</span> <span class="token comment">// 宽、高</span>
<span class="token keyword">int</span> pitch<span class="token punctuation">;</span> <span class="token comment">// 每一行像素字节数</span>
<span class="token keyword">void</span> <span class="token operator">*</span>pixels<span class="token punctuation">;</span> <span class="token comment">// 界面上像素对应的数据内存指针</span>
<span class="token comment">/** 以下这些成员可以暂时先不用了解 */</span>
<span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">;</span>
<span class="token keyword">int</span> locked<span class="token punctuation">;</span>
<span class="token keyword">void</span> <span class="token operator">*</span>list_blitmap<span class="token punctuation">;</span>
SDL_Rect clip_rect<span class="token punctuation">;</span>
SDL_BlitMap <span class="token operator">*</span>map<span class="token punctuation">;</span>
<span class="token keyword">int</span> refcount<span class="token punctuation">;</span>
<span class="token punctuation">}</span> SDL_Surface<span class="token punctuation">;</span></code></pre>
<p><strong>描述</strong></p>
<p>进行位图操作的像素集。可以理解为一张画布,可以在上面进行绘图和其他像素操作。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 class="atx" id="sdl_audiospec">SDL_AudioSpec</h3>
<p><strong>定义</strong></p>
<pre><code class="fenced-code-block language-c"><span class="token comment">// SDL_audio.h</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">SDL_AudioSpec</span>
<span class="token punctuation">{</span>
<span class="token keyword">int</span> freq<span class="token punctuation">;</span> <span class="token comment">// 采样率</span>
SDL_AudioFormat format<span class="token punctuation">;</span> <span class="token comment">// 音频数据格式</span>
Uint8 channels<span class="token punctuation">;</span> <span class="token comment">// 声道数: 1为单声道 2为立体声</span>
Uint8 silence<span class="token punctuation">;</span> <span class="token comment">// </span>
Uint16 samples<span class="token punctuation">;</span> <span class="token comment">//</span>
Uint16 padding<span class="token punctuation">;</span> <span class="token comment">//</span>
Uint32 size<span class="token punctuation">;</span> <span class="token comment">// 音频数据大小(字节)</span>
SDL_AudioCallback callback<span class="token punctuation">;</span> <span class="token comment">// 为音频设备提供数据的回调函数</span>
<span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">;</span> <span class="token comment">// 向回调函数中传递的数据</span>
<span class="token punctuation">}</span> SDL_AudioSpec<span class="token punctuation">;</span></code></pre>
<p><strong>描述</strong></p>
<p>保存音频文件一些格式信息。</p>
<p>userdata最主要用于传递<a href="#sdlloadwav">SDL_LoadWAV</a>加载进来的audio_buf数据也可以自定义一些其他数据。</p>
<p>SDL_AudioCallback为回调函数类型定义如下</p>
<pre><code class="fenced-code-block language-c"><span class="token keyword">typedef</span> <span class="token keyword">void</span> <span class="token punctuation">(</span>SDLCALL <span class="token operator">*</span> SDL_AudioCallback<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> Uint8 <span class="token operator">*</span> stream<span class="token punctuation">,</span><span class="token keyword">int</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>userdata为通过SDL_AudioSpec传入的userdata,</p>
<p>stream为每次向音频设备传递的声音数据</p>
<p>len为传递的stream长度。</p>
<p>一个SDL_AudioCallback例子如下</p>
<pre><code class="fenced-code-block language-c"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span>
Uint8 <span class="token operator">*</span>audio_buf<span class="token punctuation">;</span>
Uint32 audio_len<span class="token punctuation">;</span>
Uint32 pos<span class="token punctuation">;</span>
<span class="token punctuation">}</span> AudioInfo<span class="token punctuation">;</span>
<span class="token keyword">void</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> Uint8 <span class="token operator">*</span> stream<span class="token punctuation">,</span> <span class="token keyword">int</span> len<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
AudioInfo <span class="token operator">*</span>audio_info <span class="token operator">=</span> <span class="token punctuation">(</span>AudioInfo <span class="token operator">*</span><span class="token punctuation">)</span>userdata<span class="token punctuation">;</span>
Uint32 remain_len <span class="token operator">=</span> audio_info<span class="token operator">-&gt;</span>audio_len <span class="token operator">-</span> audio_info<span class="token operator">-&gt;</span>pos<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>remain_len <span class="token operator">&gt;</span> len<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_memcpy</span><span class="token punctuation">(</span>stream<span class="token punctuation">,</span> audio_info<span class="token operator">-&gt;</span>audio_buf <span class="token operator">+</span> audio_info<span class="token operator">-&gt;</span>pos<span class="token punctuation">,</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span>
audio_info<span class="token operator">-&gt;</span>pos <span class="token operator">+=</span> len<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">else</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_memcpy</span><span class="token punctuation">(</span>stream<span class="token punctuation">,</span> audio_info<span class="token operator">-&gt;</span>audio_buf <span class="token operator">+</span> audio_info<span class="token operator">-&gt;</span>pos<span class="token punctuation">,</span> remain_len<span class="token punctuation">)</span><span class="token punctuation">;</span>
audio_info<span class="token operator">-&gt;</span>pos <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">play_audio</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
SDL_AudioSpec spec<span class="token punctuation">;</span>
Uint8 <span class="token operator">*</span>audio_buf<span class="token punctuation">;</span>
Uint32 audio_len<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">SDL_LoadWAV</span><span class="token punctuation">(</span><span class="token string">"sound.wav"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>spec<span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_buf<span class="token punctuation">,</span> <span class="token operator">&amp;</span>audio_len<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SDL_Log</span><span class="token punctuation">(</span><span class="token string">"wav load failed: %s"</span><span class="token punctuation">,</span> <span class="token function">SDL_GetError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
spec<span class="token punctuation">.</span>callback <span class="token operator">=</span> callback<span class="token punctuation">;</span>
AudioInfo audio_info <span class="token operator">=</span> <span class="token punctuation">{</span>audio_buf<span class="token punctuation">,</span> audio_len<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
spec<span class="token punctuation">.</span>userdata <span class="token operator">=</span> <span class="token operator">&amp;</span>audio_info<span class="token punctuation">;</span>
SDL_AudioDeviceID dvice_id <span class="token operator">=</span> <span class="token function">SDL_OpenAudioDevice</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>spec<span class="token punctuation">,</span> <span class="token operator">&amp;</span>spec<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">SDL_PauseAudioDevice</span><span class="token punctuation">(</span>dvice_id<span class="token punctuation">,</span> SDL_FALSE<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<h1 class="atx" id="unknown">Unknown</h1>
<pre><code class="fenced-code-block language-c++">#include &lt;SDL2/SDL.h&gt;
#define WIDTH 720
#define HEIGHT 720
#define FR 30
#define FT 1000 / FR
SDL_Window *window;
SDL_Renderer *render;
SDL_Surface *image_surface;
SDL_Texture *image_texture;
SDL_Rect render_rect;
void calc_redner_rect()
{
int window_width, window_height, texture_width, texture_height;
SDL_GetWindowSize(window, &amp;window_width, &amp;window_height);
SDL_QueryTexture(image_texture, NULL, NULL, &amp;texture_width, &amp;texture_height);
double scale = 1.0;
if ((texture_width &gt; window_width) &amp;&amp; (texture_height &gt; window_height))
{
double xscale = (double)window_width / texture_width;
double yscale = (double)window_height / texture_height;
scale = xscale &lt; yscale ? xscale : yscale;
}
else if (texture_width &gt; window_width)
{
scale = (double)window_width / texture_width;
}
else if (texture_height &gt; window_height)
{
scale = (double)window_height / texture_height;
}
texture_height *= scale;
texture_width *= scale;
render_rect.x = (window_width - texture_width) / 2;
render_rect.y = (window_height - texture_height) / 2;
render_rect.w = texture_width;
render_rect.h = texture_height;
SDL_Log("calc_redner_rect");
}
int initialize()
{
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) &lt; 0)
{
SDL_Log("SDL_Init failed: %s", SDL_GetError());
return -1;
}
window = SDL_CreateWindow("SDL",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
WIDTH, HEIGHT,
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
);
if (NULL == window)
{
SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
return -1;
}
render = SDL_CreateRenderer(window, -1, 0);
if (NULL == render)
{
SDL_Log("SDL_CreateRenderer error: %s", SDL_GetError());
return -1;
}
image_surface = SDL_LoadBMP("1685074549643.bmp");
if (NULL == image_surface)
{
SDL_Log("Image load failed: %s", SDL_GetError());
return -1;
}
image_texture = SDL_CreateTextureFromSurface(render, image_surface);
if (NULL == image_texture)
{
SDL_Log("SDL_CreateTextureFromSurface failed: %s", SDL_GetError());
return -1;
}
calc_redner_rect();
return 0;
}
void release()
{
if (NULL != image_texture)
{
SDL_DestroyTexture(image_texture);
}
if (NULL != image_surface)
{
SDL_FreeSurface(image_surface);
}
if (NULL != render)
{
SDL_DestroyRenderer(render);
}
if (NULL != window)
{
SDL_DestroyWindow(window);
}
SDL_Quit();
}
void draw()
{
SDL_SetRenderDrawColor(render, 255, 255, 255, 255);
SDL_RenderClear(render);
SDL_RenderCopy(render, image_texture, NULL, &amp;render_rect);
SDL_RenderPresent(render);
}
void event_loop()
{
SDL_Event event;
while (1)
{
Uint64 start = SDL_GetTicks64();
while (SDL_PollEvent(&amp;event))
{
switch (event.type)
{
case SDL_MOUSEMOTION:
break;
case SDL_MOUSEBUTTONDOWN:
break;
case SDL_MOUSEBUTTONUP:
break;
case SDL_MOUSEWHEEL:
break;
case SDL_QUIT:
return;
case SDL_WINDOWEVENT:
if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
{
calc_redner_rect();
}
break;
default:
break;
}
}
draw();
Uint64 end = SDL_GetTicks64();
int time = end - start;
// SDL_Log("time = %d, FT = %d", time, FT);
if (time &lt; FT)
{
SDL_Delay(FT - time);
}
}
}
typedef struct {
Uint8 *audio_buf;
Uint32 audio_len;
Uint32 pos;
} AudioInfo;
void callback(void *userdata, Uint8 * stream, int len)
{
AudioInfo *audio_info = (AudioInfo *)userdata;
// SDL_Log("len = %d, len = %d, pos = %u", audio_info-&gt;audio_len, len, audio_info-&gt;pos);
Uint32 remain_len = audio_info-&gt;audio_len - audio_info-&gt;pos;
if (remain_len &gt; len)
{
SDL_memcpy(stream, audio_info-&gt;audio_buf + audio_info-&gt;pos, len);
audio_info-&gt;pos += len;
}
else
{
SDL_memcpy(stream, audio_info-&gt;audio_buf + audio_info-&gt;pos, remain_len);
audio_info-&gt;pos = 0;
}
}
void play_wav()
{
}
#undef main
int main(int argc, char *argv[])
{
if (initialize() &lt; 0)
{
release();
return -1;
}
SDL_AudioSpec spec;
Uint8 *audio_buf;
Uint32 audio_len;
if (SDL_LoadWAV("sound.wav", &amp;spec, &amp;audio_buf, &amp;audio_len) == NULL)
{
SDL_Log("wav load failed: %s", SDL_GetError());
return -1;
}
spec.callback = callback;
AudioInfo audio_info = {audio_buf, audio_len, 0};
spec.userdata = &amp;audio_info;
SDL_Log("%u", audio_len);
SDL_AudioDeviceID dvice_id = SDL_OpenAudioDevice(NULL, 0, &amp;spec, &amp;spec, 0);
SDL_PauseAudioDevice(dvice_id, SDL_FALSE);
SDL_Log("Here !");
event_loop();
SDL_CloseAudioDevice(dvice_id);
SDL_FreeWAV(audio_buf);
release();
return 0;
}</code></pre>
<h1 class="atx" id="cpp多线程">CPP多线程</h1>
<pre><code class="fenced-code-block language-c++"></code></pre>
</article>
</body>
</html>