xlib_playground6.html (9725B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <link rel="stylesheet" type="text/css" href="/style.css"> 7 <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> 8 <title>Xlibで遊んでみる6</title> 9 </head> 10 <body> 11 <header> 12 <a href="/">主頁</a> | 13 <a href="/about.html">自己紹介</a> | 14 <a href="/journal">日記</a> | 15 <a href="/farm">農業</a> | 16 <a href="/kitchen">台所</a> | 17 <a href="/computer">電算機</a> | 18 <a href="/poetry">詩</a> | 19 <a href="/books">本棚</a> | 20 <a href="/gallery">絵</a> | 21 <a href="/plant">植物</a> | 22 <a href="https://git.mtkn.jp">Git</a> 23 </header> 24 <main> 25 <article> 26 <h1>Xlibで遊んでみる6</h1> 27 <time>2023-01-25</time> 28 29 <p> 30 前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> 31 </p> 32 <p> 33 言語: C言語<br /> 34 ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> 35 </p> 36 37 <h2>ワールドマップの作成</h2> 38 <p> 39 ゲームのワールドマップを作製した。ここでは文字列として登録した。なにもないところは「<code>.</code>」、ブロックの場所は「<code>b</code>」、プレーヤーは「<code>p</code>」とした: 40 </p> 41 <pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] = 42 "................................................................................" 43 "................................................................................" 44 "................................................................................" 45 "................................................................................" 46 "................................................................................" 47 "........b......................................................................." 48 "................................................................................" 49 "................................................................................" 50 "....b..........................................................................." 51 "................................................................................" 52 "................b..............................................................." 53 "..........................................................b..........b.........." 54 "................................................................................" 55 ".......................b........................................................" 56 "...........................................b...................................." 57 "...........................................b...................................." 58 "................................................................................" 59 "..................b............................................................." 60 "................................................................................" 61 "...........................................b...................................." 62 "................................................................................" 63 "................................................................................" 64 "...........................b...................................................." 65 "................................................................................" 66 "................................................................................" 67 "................................................................................" 68 "................................................................................" 69 "................................................................................" 70 "................................................................................" 71 "....................................bbbbbbbbbb.................................." 72 "................................................................................" 73 "................................................................................" 74 "................................................................................" 75 "................................................................................" 76 "................................................................................" 77 "................................................................................" 78 "..............................................bbbbbbbbbb........................" 79 "................................................................................" 80 "................................................................................" 81 "................................................................................" 82 "................................................................................" 83 "....................................bbbbbbbbbb.................................." 84 "................................................................................" 85 "................................................................................" 86 "................................................................................" 87 "................................................................................" 88 "..........................bbbbbbbbbb............................................" 89 "................................................................................" 90 "................................................................................" 91 "................................................................................" 92 "................................................................................" 93 "................bbbbbbbbbb......................................................" 94 "................................................................................" 95 "................................................................................" 96 "...p............................................................................" 97 "bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb" 98 "........................b.......b......................b...b...................." 99 "........................b.......b......................b...b...................." 100 "........................b.......b......................b...b...................." 101 "........................b.......b......................b...b...................."; 102 </code></pre> 103 104 <h2>プレイヤーの作成</h2> 105 <p>プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:</p> 106 <pre><code>struct rect { 107 float ppx, ppy; 108 float px, py; 109 float vx, vy; 110 float ax, ay; // acceleration 111 int w, h; 112 int m; 113 }; 114 </code></pre> 115 <p>ワールドマップを読み込み、その際にプレイヤーに重力を付加:</p> 116 <pre><code>struct rect block[NUM_RECT]; 117 struct rect player; 118 119 /* ... */ 120 121 int bi = 0; 122 for (int i = 0; i < WORLD_WIDTH * WORLD_HEIGHT; i++) { 123 if (world_map[i] == 'b') { 124 block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE; 125 block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE; 126 block[bi].ax = 0; 127 block[bi].ay = 0; 128 block[bi].vx = 0; 129 block[bi].vy = 0; 130 block[bi].w = block[bi].h = BLOCK_SIZE; 131 block[bi].m = block[bi].w * block[bi].h; 132 bi++; 133 } else if (world_map[i] == 'p') { 134 player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE; 135 player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE; 136 player.vx = 0; 137 player.vy = 0; 138 player.ax = 0; 139 player.ay = GRAVITY; 140 player.w = player.h = BLOCK_SIZE; 141 player.m = player.w * player.h; 142 } 143 } 144 </code></pre> 145 146 <p>ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。<code>A</code>、<code>D</code>でそれぞれ左右に加速し、地面に接しているときに<code>space</code>キーでジャンプさせる: 147 </p> 148 <pre><code>void 149 handle_inputs(int key_state[]) 150 { 151 if (key_state[KEY_Q] == KEY_DOWN){ 152 next_menu = GAME_OVER; 153 return; 154 } 155 if (key_state[KEY_D] == KEY_DOWN) { 156 if (player.vx > 0) { 157 player.ax = 500; 158 } else { 159 player.ax = 1000; 160 } 161 } else if (key_state[KEY_A] == KEY_DOWN) { 162 if (player.vx > 0) { 163 player.ax = -1000; 164 } else { 165 player.ax = -500; 166 } 167 } else { 168 if (player_is_falling) 169 player.ax = -player.vx; 170 else 171 player.ax = -3 * player.vx; 172 } 173 174 if (player.vx < -200) player.vx = -200; 175 if (player.vx > 200) player.vx = 200; 176 if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN) 177 player.vy = -450; 178 } 179 </code></pre> 180 181 <p>変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:</p> 182 <pre><code>void 183 rect_next_tick(struct rect *s, long ndt) // nano second 184 { 185 s->ppx = s->px; 186 s->ppy = s->py; 187 s->vx += s->ax * ndt / 1000 / 1000 / 1000; 188 s->vy += s->ay * ndt / 1000 / 1000 / 1000; 189 s->px += s->vx * ndt / 1000 / 1000 / 1000; 190 s->py += s->vy * ndt / 1000 / 1000 / 1000; 191 192 // bind within the window 193 if (s->px < 0) { 194 s->px = 0; 195 //s->vx *= -1; 196 } 197 if (win_width < s->px + s->w) { 198 s->px = win_width - s->w; 199 //s->vx *= -1; 200 } 201 // game over when fall out of the screen 202 if (s->py > win_height) 203 next_menu = GAME_OVER; 204 } 205 </code></pre> 206 207 208 <h2>完成品</h2> 209 <p> 210 <a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a> 211 </p> 212 <p> 213 <video controls> 214 <source src="videos/ex6.webm" type="video/webm"> 215 </video> 216 </p> 217 218 <h2>参考</h2> 219 <ul> 220 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> 221 </ul> 222 </article> 223 224 </main> 225 <footer> 226 <address>info(at)mtkn(dot)jp</address> 227 <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> 228 </footer> 229 </body> 230 </html>