www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | LICENSE

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 &lt; 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 &gt; 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 &gt; 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 &lt; -200) player.vx = -200;
    175 	if (player.vx &gt; 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-&gt;ppx = s-&gt;px;
    186 	s-&gt;ppy = s-&gt;py;
    187 	s-&gt;vx += s-&gt;ax * ndt / 1000 / 1000 / 1000;
    188 	s-&gt;vy += s-&gt;ay * ndt / 1000 / 1000 / 1000;
    189 	s-&gt;px += s-&gt;vx * ndt / 1000 / 1000 / 1000;
    190 	s-&gt;py += s-&gt;vy * ndt / 1000 / 1000 / 1000;
    191 
    192 	// bind within the window
    193 	if (s-&gt;px &lt; 0) {
    194 		s-&gt;px = 0;
    195 		//s-&gt;vx *= -1;
    196 	}
    197 	if (win_width &lt; s-&gt;px + s-&gt;w) {
    198 		s-&gt;px = win_width - s-&gt;w;
    199 		//s-&gt;vx *= -1;
    200 	}
    201 	// game over when fall out of the screen
    202 	if (s-&gt;py &gt; 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>