commit 2fb601b4a463e3fceff086dcbafdf1bc28568711
parent a8acc9ce8561099f3481e153d33313a7b83a9d12
Author: Matsuda Kenji <info@mtkn.jp>
Date: Wed, 25 Jan 2023 14:51:51 +0900
add xlib_playground6
Diffstat:
13 files changed, 711 insertions(+), 39 deletions(-)
diff --git a/data/weblog b/data/weblog
@@ -130,3 +130,18 @@
1674054000 /index.html
1674054000 /journal/index.html
1674054000 /journal/posts/20230119.html
+1674054000 /journal/index.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /computer/index.html
+1674572400 /computer/xlib_playground5.html
+1674572400 /computer/xlib_playground6.html
+1674572400 /index.html
diff --git a/man/computer/index.html b/man/computer/index.html
@@ -9,6 +9,7 @@ Small is beautiful.
<li><a href="xlib_playground3.html">Xlibで遊んでみる3</a></li>
<li><a href="xlib_playground4.html">Xlibで遊んでみる4</a></li>
<li><a href="xlib_playground5.html">Xlibで遊んでみる5</a></li>
+ <li><a href="xlib_playground6.html">Xlibで遊んでみる6</a></li>
</ul>
<h2>MISC</h1>
diff --git a/man/computer/videos/ex6.webm b/man/computer/videos/ex6.webm
Binary files differ.
diff --git a/man/computer/xlib_playground5.html b/man/computer/xlib_playground5.html
@@ -110,3 +110,7 @@ circle_handle_collision_elastic(struct circle *c1, struct circle *c2)
<ul>
<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
</ul>
+<p>
+次の記事: \
+<a href="xlib_playground6.html">Xlibで遊んでみる6</a>
+</p>
diff --git a/man/computer/xlib_playground6.html b/man/computer/xlib_playground6.html
@@ -0,0 +1,210 @@
+<h1>Xlibで遊んでみる6</h1>
+<time>2023-01-25</time>
+
+<p>
+前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a>
+</p>
+<p>
+言語: C言語<br />
+ソースコード: \
+<a href="https://git.mtkn.jp/xlib_playground/log.html">git</a>
+</p>
+
+<h2>ワールドマップの作成</h2>
+<p>
+ゲームのワールドマップを作製した。\
+ここでは文字列として登録した。なにもないところは「.」、ブロック\
+の場所は「b」、プレーヤーは「p」とした:
+</p>
+<pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] =
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"........b......................................................................."
+"................................................................................"
+"................................................................................"
+"....b..........................................................................."
+"................................................................................"
+"................b..............................................................."
+"..........................................................b..........b.........."
+"................................................................................"
+".......................b........................................................"
+"...........................................b...................................."
+"...........................................b...................................."
+"................................................................................"
+"..................b............................................................."
+"................................................................................"
+"...........................................b...................................."
+"................................................................................"
+"................................................................................"
+"...........................b...................................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"....................................bbbbbbbbbb.................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"..............................................bbbbbbbbbb........................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"....................................bbbbbbbbbb.................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"..........................bbbbbbbbbb............................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................bbbbbbbbbb......................................................"
+"................................................................................"
+"................................................................................"
+"...p............................................................................"
+"bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb"
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b....................";
+</code></pre>
+
+<h2>プレイヤーの作成</h2>
+<p>\
+プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:\
+</p>
+<pre><code>struct rect {
+ float ppx, ppy;
+ float px, py;
+ float vx, vy;
+ float ax, ay; // acceleration
+ int w, h;
+ int m;
+};
+</code></pre>
+<p>\
+ワールドマップを読み込み、その際にプレイヤーに重力を付加:\
+</p>
+<pre><code>struct rect block[NUM_RECT];
+struct rect player;
+
+/* ... */
+
+ int bi = 0;
+ for (int i = 0; i < WORLD_WIDTH * WORLD_HEIGHT; i++) {
+ if (world_map[i] == 'b') {
+ block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE;
+ block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE;
+ block[bi].ax = 0;
+ block[bi].ay = 0;
+ block[bi].vx = 0;
+ block[bi].vy = 0;
+ block[bi].w = block[bi].h = BLOCK_SIZE;
+ block[bi].m = block[bi].w * block[bi].h;
+ bi++;
+ } else if (world_map[i] == 'p') {
+ player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE;
+ player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE;
+ player.vx = 0;
+ player.vy = 0;
+ player.ax = 0;
+ player.ay = GRAVITY;
+ player.w = player.h = BLOCK_SIZE;
+ player.m = player.w * player.h;
+ }
+ }
+</code></pre>
+
+<p>\
+ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。\
+<code>A</code>、<code>D</code>でそれぞれ左右に加速し、\
+地面に接しているときに<code>space</code>キーでジャンプさせる:
+</p>
+<pre><code>void
+handle_inputs(int key_state[])
+{
+ if (key_state[KEY_Q] == KEY_DOWN){
+ next_menu = GAME_OVER;
+ return;
+ }
+ if (key_state[KEY_D] == KEY_DOWN) {
+ if (player.vx > 0) {
+ player.ax = 500;
+ } else {
+ player.ax = 1000;
+ }
+ } else if (key_state[KEY_A] == KEY_DOWN) {
+ if (player.vx > 0) {
+ player.ax = -1000;
+ } else {
+ player.ax = -500;
+ }
+ } else {
+ if (player_is_falling)
+ player.ax = -player.vx;
+ else
+ player.ax = -3 * player.vx;
+ }
+
+ if (player.vx < -200) player.vx = -200;
+ if (player.vx > 200) player.vx = 200;
+ if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN)
+ player.vy = -450;
+}
+</code></pre>
+
+<p>\
+変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算\
+するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:\
+</p>
+<pre><code>
+void
+rect_next_tick(struct rect *s, long ndt) // nano second
+{
+ s->ppx = s->px;
+ s->ppy = s->py;
+ s->vx += s->ax * ndt / 1000 / 1000 / 1000;
+ s->vy += s->ay * ndt / 1000 / 1000 / 1000;
+ s->px += s->vx * ndt / 1000 / 1000 / 1000;
+ s->py += s->vy * ndt / 1000 / 1000 / 1000;
+
+ // bind within the window
+ if (s->px < 0) {
+ s->px = 0;
+ //s->vx *= -1;
+ }
+ if (win_width < s->px + s->w) {
+ s->px = win_width - s->w;
+ //s->vx *= -1;
+ }
+ // game over when fall out of the screen
+ if (s->py > win_height)
+ next_menu = GAME_OVER;
+}
+</code></pre>
+
+
+<h2>完成品</h2>
+<p>
+<a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a>
+</p>
+<p>
+<video controls>
+<source src="videos/ex6.webm" type="video/webm">
+</video>
+</p>
+
+<h2>参考</h2>
+<ul>
+<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
+</ul>
diff --git a/man/index.html b/man/index.html
@@ -9,6 +9,7 @@
<h2>更新履歴</h2>
<a href="/rss.xml">RSS</a>
<ul>
+<li>2023-01-25 <a href="/computer/xlib_playground6.html">Xlibで遊んでみる6</a></li>
<li>2023-01-19 <a href="/journal/posts/20230119.html">寺を辞めた</a></li> </a></li>
<li>2023-01-03 <a href="/computer/xlib_playground5.html">Xlibで遊んでみる5</a></li>
<li>2023-01-02 <a href="/computer/xlib_playground4.html">Xlibで遊んでみる4</a></li>
diff --git a/pub/computer/index.html b/pub/computer/index.html
@@ -32,6 +32,7 @@ Small is beautiful.
<li><a href="xlib_playground3.html">Xlibで遊んでみる3</a></li>
<li><a href="xlib_playground4.html">Xlibで遊んでみる4</a></li>
<li><a href="xlib_playground5.html">Xlibで遊んでみる5</a></li>
+ <li><a href="xlib_playground6.html">Xlibで遊んでみる6</a></li>
</ul>
<h2>MISC</h1>
diff --git a/pub/computer/videos/ex6.webm b/pub/computer/videos/ex6.webm
Binary files differ.
diff --git a/pub/computer/xlib_playground5.html b/pub/computer/xlib_playground5.html
@@ -128,6 +128,9 @@ circle_handle_collision_elastic(struct circle *c1, struct circle *c2)
<ul>
<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
</ul>
+<p>
+次の記事: <a href="xlib_playground6.html">Xlibで遊んでみる6</a>
+</p>
</article>
</main>
diff --git a/pub/computer/xlib_playground6.html b/pub/computer/xlib_playground6.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html>
+<html lang="ja">
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <link rel="stylesheet" type="text/css" href="/style.css" />
+ <link rel="icon" type="image/x-icon" href="/pics/favicon.ico" />
+ <title>Xlibで遊んでみる6</title>
+</head>
+<body>
+ <header>
+ <a href="/">主頁</a> |
+ <a href="/about.html">自己紹介</a> |
+ <a href="/journal">日記</a> |
+ <a href="/farm">農業</a> |
+ <a href="/kitchen">台所</a> |
+ <a href="/computer">電算機</a> |
+ <a href="/poetry">詩</a> |
+ <a href="/books">本棚</a> |
+ <a href="https://git.mtkn.jp">Git</a>
+ </header>
+ <main>
+ <article>
+<h1>Xlibで遊んでみる6</h1>
+<time>2023-01-25</time>
+
+<p>
+前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a>
+</p>
+<p>
+言語: C言語<br />
+ソースコード: <a href="https://git.mtkn.jp/xlib_playground/log.html">git</a>
+</p>
+
+<h2>ワールドマップの作成</h2>
+<p>
+ゲームのワールドマップを作製した。ここでは文字列として登録した。なにもないところは「.」、ブロックの場所は「b」、プレーヤーは「p」とした:
+</p>
+<pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] =
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"........b......................................................................."
+"................................................................................"
+"................................................................................"
+"....b..........................................................................."
+"................................................................................"
+"................b..............................................................."
+"..........................................................b..........b.........."
+"................................................................................"
+".......................b........................................................"
+"...........................................b...................................."
+"...........................................b...................................."
+"................................................................................"
+"..................b............................................................."
+"................................................................................"
+"...........................................b...................................."
+"................................................................................"
+"................................................................................"
+"...........................b...................................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"....................................bbbbbbbbbb.................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"..............................................bbbbbbbbbb........................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"....................................bbbbbbbbbb.................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"..........................bbbbbbbbbb............................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................bbbbbbbbbb......................................................"
+"................................................................................"
+"................................................................................"
+"...p............................................................................"
+"bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb"
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b....................";
+</code></pre>
+
+<h2>プレイヤーの作成</h2>
+<p>プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:</p>
+<pre><code>struct rect {
+ float ppx, ppy;
+ float px, py;
+ float vx, vy;
+ float ax, ay; // acceleration
+ int w, h;
+ int m;
+};
+</code></pre>
+<p>ワールドマップを読み込み、その際にプレイヤーに重力を付加:</p>
+<pre><code>struct rect block[NUM_RECT];
+struct rect player;
+
+/* ... */
+
+ int bi = 0;
+ for (int i = 0; i < WORLD_WIDTH * WORLD_HEIGHT; i++) {
+ if (world_map[i] == 'b') {
+ block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE;
+ block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE;
+ block[bi].ax = 0;
+ block[bi].ay = 0;
+ block[bi].vx = 0;
+ block[bi].vy = 0;
+ block[bi].w = block[bi].h = BLOCK_SIZE;
+ block[bi].m = block[bi].w * block[bi].h;
+ bi++;
+ } else if (world_map[i] == 'p') {
+ player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE;
+ player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE;
+ player.vx = 0;
+ player.vy = 0;
+ player.ax = 0;
+ player.ay = GRAVITY;
+ player.w = player.h = BLOCK_SIZE;
+ player.m = player.w * player.h;
+ }
+ }
+</code></pre>
+
+<p>ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。<code>A</code>、<code>D</code>でそれぞれ左右に加速し、地面に接しているときに<code>space</code>キーでジャンプさせる:
+</p>
+<pre><code>void
+handle_inputs(int key_state[])
+{
+ if (key_state[KEY_Q] == KEY_DOWN){
+ next_menu = GAME_OVER;
+ return;
+ }
+ if (key_state[KEY_D] == KEY_DOWN) {
+ if (player.vx > 0) {
+ player.ax = 500;
+ } else {
+ player.ax = 1000;
+ }
+ } else if (key_state[KEY_A] == KEY_DOWN) {
+ if (player.vx > 0) {
+ player.ax = -1000;
+ } else {
+ player.ax = -500;
+ }
+ } else {
+ if (player_is_falling)
+ player.ax = -player.vx;
+ else
+ player.ax = -3 * player.vx;
+ }
+
+ if (player.vx < -200) player.vx = -200;
+ if (player.vx > 200) player.vx = 200;
+ if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN)
+ player.vy = -450;
+}
+</code></pre>
+
+<p>変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:</p>
+<pre><code>
+void
+rect_next_tick(struct rect *s, long ndt) // nano second
+{
+ s->ppx = s->px;
+ s->ppy = s->py;
+ s->vx += s->ax * ndt / 1000 / 1000 / 1000;
+ s->vy += s->ay * ndt / 1000 / 1000 / 1000;
+ s->px += s->vx * ndt / 1000 / 1000 / 1000;
+ s->py += s->vy * ndt / 1000 / 1000 / 1000;
+
+ // bind within the window
+ if (s->px < 0) {
+ s->px = 0;
+ //s->vx *= -1;
+ }
+ if (win_width < s->px + s->w) {
+ s->px = win_width - s->w;
+ //s->vx *= -1;
+ }
+ // game over when fall out of the screen
+ if (s->py > win_height)
+ next_menu = GAME_OVER;
+}
+</code></pre>
+
+
+<h2>完成品</h2>
+<p>
+<a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a>
+</p>
+<p>
+<video controls>
+<source src="videos/ex6.webm" type="video/webm">
+</video>
+</p>
+
+<h2>参考</h2>
+<ul>
+<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
+</ul>
+ </article>
+
+ </main>
+ <footer>
+ <address>info(at)mtkn(dot)jp</address>
+ </footer>
+</body>
+</html>
diff --git a/pub/index.html b/pub/index.html
@@ -32,6 +32,7 @@
<h2>更新履歴</h2>
<a href="/rss.xml">RSS</a>
<ul>
+<li>2023-01-25 <a href="/computer/xlib_playground6.html">Xlibで遊んでみる6</a></li>
<li>2023-01-19 <a href="/journal/posts/20230119.html">寺を辞めた</a></li> </a></li>
<li>2023-01-03 <a href="/computer/xlib_playground5.html">Xlibで遊んでみる5</a></li>
<li>2023-01-02 <a href="/computer/xlib_playground4.html">Xlibで遊んでみる4</a></li>
diff --git a/pub/rss.xml b/pub/rss.xml
@@ -5,62 +5,218 @@
<description>ウェブページの更新履歴</description>
<language>ja-jp</language>
<link>https://www.mtkn.jp</link>
-<lastBuildDate>Thu, 19 Jan 2023 13:25:02 +0900</lastBuildDate>
-<pubDate>Thu, 19 Jan 2023 13:25:02 +0900</pubDate>
+<lastBuildDate>Wed, 25 Jan 2023 14:50:41 +0900</lastBuildDate>
+<pubDate>Wed, 25 Jan 2023 14:50:41 +0900</pubDate>
<docs>https://www.rssboard.org/rss-specification</docs>
<item>
-<title>寺を辞めた</title>
-<link>https://www.mtkn.jp/journal/posts/20230119.html</link>
-<guid>https://www.mtkn.jp/journal/posts/20230119.html</guid>
-<pubDate>Thu, 19 Jan 2023 00:00:00 +0900</pubDate>
-<description><![CDATA[<h1>寺を辞めた</h1>
-<time>2023-01-19</time>
+<title>Xlibで遊んでみる6</title>
+<link>https://www.mtkn.jp/computer/xlib_playground6.html</link>
+<guid>https://www.mtkn.jp/computer/xlib_playground6.html</guid>
+<pubDate>Wed, 25 Jan 2023 00:00:00 +0900</pubDate>
+<description><![CDATA[<h1>Xlibで遊んでみる6</h1>
+<time>2023-01-25</time>
+
<p>
-寺を辞めた。昨年の夏に一月ほど寺に泊りこんで以来、住職の奥さんとわだかまりができた。根本的に相性が悪い。精神も体調も不安定になり、9月ごろから実家に引き込もっていた。その間先方から何度か手紙が来たのだが、これが決定打となり寺にはもう行かないことを決意した。それが昨年の11月だったと思う。しかし実際に辞表を出すには気が重かった。年が変わって2週間ほど経ってからようやく腰を上げ、辞める意思を手紙にしたためた。そして昨日、借りていた物を返し寺に置いていた物を回収した。</p>
+前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a>
+</p>
<p>
-ふう。
+言語: C言語<br />
+ソースコード: <a href="https://git.mtkn.jp/xlib_playground/log.html">git</a>
</p>
-]]></description>
-</item>
-<item>
-<title>自己紹介</title>
-<link>https://www.mtkn.jp/about.html</link>
-<guid>https://www.mtkn.jp/about.html</guid>
-<pubDate>Thu, 19 Jan 2023 00:00:00 +0900</pubDate>
-<description><![CDATA[<h1>自己紹介</h1>
-<time>2022-07-28</time>
-<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p>
+<h2>ワールドマップの作成</h2>
+<p>
+ゲームのワールドマップを作製した。ここでは文字列として登録した。なにもないところは「.」、ブロックの場所は「b」、プレーヤーは「p」とした:
+</p>
+<pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] =
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"........b......................................................................."
+"................................................................................"
+"................................................................................"
+"....b..........................................................................."
+"................................................................................"
+"................b..............................................................."
+"..........................................................b..........b.........."
+"................................................................................"
+".......................b........................................................"
+"...........................................b...................................."
+"...........................................b...................................."
+"................................................................................"
+"..................b............................................................."
+"................................................................................"
+"...........................................b...................................."
+"................................................................................"
+"................................................................................"
+"...........................b...................................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"....................................bbbbbbbbbb.................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"..............................................bbbbbbbbbb........................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"....................................bbbbbbbbbb.................................."
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"..........................bbbbbbbbbb............................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................................................................................"
+"................bbbbbbbbbb......................................................"
+"................................................................................"
+"................................................................................"
+"...p............................................................................"
+"bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb"
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b...................."
+"........................b.......b......................b...b....................";
+</code></pre>
-<ul>
- <li>名前: 松田 健嗣</li>
- <li>性別: 男</li>
- <li>年齢: 20代</li>
- <li>出身: 和歌山</li>
-</ul>
+<h2>プレイヤーの作成</h2>
+<p>プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:</p>
+<pre><code>struct rect {
+ float ppx, ppy;
+ float px, py;
+ float vx, vy;
+ float ax, ay; // acceleration
+ int w, h;
+ int m;
+};
+</code></pre>
+<p>ワールドマップを読み込み、その際にプレイヤーに重力を付加:</p>
+<pre><code>struct rect block[NUM_RECT];
+struct rect player;
+
+/* ... */
+
+ int bi = 0;
+ for (int i = 0; i < WORLD_WIDTH * WORLD_HEIGHT; i++) {
+ if (world_map[i] == 'b') {
+ block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE;
+ block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE;
+ block[bi].ax = 0;
+ block[bi].ay = 0;
+ block[bi].vx = 0;
+ block[bi].vy = 0;
+ block[bi].w = block[bi].h = BLOCK_SIZE;
+ block[bi].m = block[bi].w * block[bi].h;
+ bi++;
+ } else if (world_map[i] == 'p') {
+ player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE;
+ player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE;
+ player.vx = 0;
+ player.vy = 0;
+ player.ax = 0;
+ player.ay = GRAVITY;
+ player.w = player.h = BLOCK_SIZE;
+ player.m = player.w * player.h;
+ }
+ }
+</code></pre>
-<p>
-高校のころ物理学や数学が好きで、学者を志して大学に行きましたが、能力が足りずに挫折しました。当時は自分の状況を省みることなくひたすら努力していたつもりです。ところがこの努力こそが無駄の根源だったように思います。二回の留年を経て三年目には定員を割っていた生物系に進み、クモの採集にいそしんでいました。京都の山々に分け入っては標本を集める日々です。これはなかなか楽しかった。結局大学ではクモの新種を1つ記載して卒業となりました。
-</p>
-<p>
-勉強以外では合気道部に所属していましたがこちらではなにも努力していた自覚もなく、そこそこの実力を付けていたように思います。自分にとって稽古することが自然なことだったのでしょう。特にしんどいと思ったこともなかったです。無駄な力を抜き全身をうまく使うことを合気道の稽古から学んでいたはずなのに、それが勉強の方には生かせていなかったのです。
-</p>
-<p>
-在学中は社会に出て仕事をすることなど考えていなかったため、いざ就職活動となると業界を選ぶことも大変でした。かろうじて興味のあったのがコンピュータなので、それ関係の会社を覗いたりしましたが、本当に自分にあっているのか分からず一から考え直すことに。結局実家の会社を嗣ぐために同業大手に応募、採用されました。
+<p>ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。<code>A</code>、<code>D</code>でそれぞれ左右に加速し、地面に接しているときに<code>space</code>キーでジャンプさせる:
</p>
+<pre><code>void
+handle_inputs(int key_state[])
+{
+ if (key_state[KEY_Q] == KEY_DOWN){
+ next_menu = GAME_OVER;
+ return;
+ }
+ if (key_state[KEY_D] == KEY_DOWN) {
+ if (player.vx > 0) {
+ player.ax = 500;
+ } else {
+ player.ax = 1000;
+ }
+ } else if (key_state[KEY_A] == KEY_DOWN) {
+ if (player.vx > 0) {
+ player.ax = -1000;
+ } else {
+ player.ax = -500;
+ }
+ } else {
+ if (player_is_falling)
+ player.ax = -player.vx;
+ else
+ player.ax = -3 * player.vx;
+ }
+
+ if (player.vx < -200) player.vx = -200;
+ if (player.vx > 200) player.vx = 200;
+ if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN)
+ player.vy = -450;
+}
+</code></pre>
+
+<p>変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:</p>
+<pre><code>
+void
+rect_next_tick(struct rect *s, long ndt) // nano second
+{
+ s->ppx = s->px;
+ s->ppy = s->py;
+ s->vx += s->ax * ndt / 1000 / 1000 / 1000;
+ s->vy += s->ay * ndt / 1000 / 1000 / 1000;
+ s->px += s->vx * ndt / 1000 / 1000 / 1000;
+ s->py += s->vy * ndt / 1000 / 1000 / 1000;
+
+ // bind within the window
+ if (s->px < 0) {
+ s->px = 0;
+ //s->vx *= -1;
+ }
+ if (win_width < s->px + s->w) {
+ s->px = win_width - s->w;
+ //s->vx *= -1;
+ }
+ // game over when fall out of the screen
+ if (s->py > win_height)
+ next_menu = GAME_OVER;
+}
+</code></pre>
+
+
+<h2>完成品</h2>
<p>
-ところがこの会社があまりにも合わず半年で適応障害になって辞めることに。以来実家に戻って畑をするかたわら寺に通っています。この間生き方についていろいろ考えた結果、社会にもまれて気付いたら定年しているより、もっと人間らしい老い方をしたいと思うに至ったのです。常識に縛られても結局その常識に裏切られるだけです。金銭的な豊かさはあまりにも脆いものでしょう。
+<a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a>
</p>
<p>
-このサイトは日々考えていることを記しておきたいと思い立ち上げました。周りの人にはあまり共感されない僕の考えですが、なにかの参考になれば幸いです。
+<video controls>
+<source src="videos/ex6.webm" type="video/webm">
+</video>
</p>
+
+<h2>参考</h2>
+<ul>
+<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
+</ul>
]]></description>
</item>
<item>
<title>Xlibで遊んでみる5</title>
<link>https://www.mtkn.jp/computer/xlib_playground5.html</link>
<guid>https://www.mtkn.jp/computer/xlib_playground5.html</guid>
-<pubDate>Tue, 3 Jan 2023 00:00:00 +0900</pubDate>
+<pubDate>Wed, 25 Jan 2023 00:00:00 +0900</pubDate>
<description><![CDATA[<h1>Xlibで遊んでみる5</h1>
<time>2023-01-03</time>
@@ -168,6 +324,57 @@ circle_handle_collision_elastic(struct circle *c1, struct circle *c2)
<ul>
<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
</ul>
+<p>
+次の記事: <a href="xlib_playground6.html">Xlibで遊んでみる6</a>
+</p>
+]]></description>
+</item>
+<item>
+<title>寺を辞めた</title>
+<link>https://www.mtkn.jp/journal/posts/20230119.html</link>
+<guid>https://www.mtkn.jp/journal/posts/20230119.html</guid>
+<pubDate>Thu, 19 Jan 2023 00:00:00 +0900</pubDate>
+<description><![CDATA[<h1>寺を辞めた</h1>
+<time>2023-01-19</time>
+<p>
+寺を辞めた。昨年の夏に一月ほど寺に泊りこんで以来、住職の奥さんとわだかまりができた。根本的に相性が悪い。精神も体調も不安定になり、9月ごろから実家に引き込もっていた。その間先方から何度か手紙が来たのだが、これが決定打となり寺にはもう行かないことを決意した。それが昨年の11月だったと思う。しかし実際に辞表を出すには気が重かった。年が変わって2週間ほど経ってからようやく腰を上げ、辞める意思を手紙にしたためた。そして昨日、借りていた物を返し寺に置いていた物を回収した。</p>
+<p>
+ふう。
+</p>
+]]></description>
+</item>
+<item>
+<title>自己紹介</title>
+<link>https://www.mtkn.jp/about.html</link>
+<guid>https://www.mtkn.jp/about.html</guid>
+<pubDate>Thu, 19 Jan 2023 00:00:00 +0900</pubDate>
+<description><![CDATA[<h1>自己紹介</h1>
+<time>2022-07-28</time>
+
+<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p>
+
+<ul>
+ <li>名前: 松田 健嗣</li>
+ <li>性別: 男</li>
+ <li>年齢: 20代</li>
+ <li>出身: 和歌山</li>
+</ul>
+
+<p>
+高校のころ物理学や数学が好きで、学者を志して大学に行きましたが、能力が足りずに挫折しました。当時は自分の状況を省みることなくひたすら努力していたつもりです。ところがこの努力こそが無駄の根源だったように思います。二回の留年を経て三年目には定員を割っていた生物系に進み、クモの採集にいそしんでいました。京都の山々に分け入っては標本を集める日々です。これはなかなか楽しかった。結局大学ではクモの新種を1つ記載して卒業となりました。
+</p>
+<p>
+勉強以外では合気道部に所属していましたがこちらではなにも努力していた自覚もなく、そこそこの実力を付けていたように思います。自分にとって稽古することが自然なことだったのでしょう。特にしんどいと思ったこともなかったです。無駄な力を抜き全身をうまく使うことを合気道の稽古から学んでいたはずなのに、それが勉強の方には生かせていなかったのです。
+</p>
+<p>
+在学中は社会に出て仕事をすることなど考えていなかったため、いざ就職活動となると業界を選ぶことも大変でした。かろうじて興味のあったのがコンピュータなので、それ関係の会社を覗いたりしましたが、本当に自分にあっているのか分からず一から考え直すことに。結局実家の会社を嗣ぐために同業大手に応募、採用されました。
+</p>
+<p>
+ところがこの会社があまりにも合わず半年で適応障害になって辞めることに。以来実家に戻って畑をするかたわら寺に通っています。この間生き方についていろいろ考えた結果、社会にもまれて気付いたら定年しているより、もっと人間らしい老い方をしたいと思うに至ったのです。常識に縛られても結局その常識に裏切られるだけです。金銭的な豊かさはあまりにも脆いものでしょう。
+</p>
+<p>
+このサイトは日々考えていることを記しておきたいと思い立ち上げました。周りの人にはあまり共感されない僕の考えですが、なにかの参考になれば幸いです。
+</p>
]]></description>
</item>
<item>
diff --git a/pub/sitemap.xml b/pub/sitemap.xml
@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://www.mtkn.jp/</loc><lastmod>2023-12-28</lastmod></url>
+<url><loc>https://www.mtkn.jp/computer/xlib_playground6.html</loc><lastmod>2023-01-25</lastmod></url>
+<url><loc>https://www.mtkn.jp/computer/xlib_playground5.html</loc><lastmod>2023-01-25</lastmod></url>
+<url><loc>https://www.mtkn.jp/computer/</loc><lastmod>2023-01-25</lastmod></url>
<url><loc>https://www.mtkn.jp/journal/posts/20230119.html</loc><lastmod>2023-01-19</lastmod></url>
<url><loc>https://www.mtkn.jp/journal/</loc><lastmod>2023-01-19</lastmod></url>
<url><loc>https://www.mtkn.jp/farm/</loc><lastmod>2023-01-19</lastmod></url>
<url><loc>https://www.mtkn.jp/about.html</loc><lastmod>2023-01-19</lastmod></url>
-<url><loc>https://www.mtkn.jp/computer/xlib_playground5.html</loc><lastmod>2023-01-03</lastmod></url>
<url><loc>https://www.mtkn.jp/computer/xlib_playground4.html</loc><lastmod>2023-01-03</lastmod></url>
-<url><loc>https://www.mtkn.jp/computer/</loc><lastmod>2023-01-03</lastmod></url>
<url><loc>https://www.mtkn.jp/computer/xlib_playground3.html</loc><lastmod>2023-01-02</lastmod></url>
<url><loc>https://www.mtkn.jp/computer/xlib_playground2.html</loc><lastmod>2023-01-02</lastmod></url>
<url><loc>https://www.mtkn.jp/journal/posts/20221228.html</loc><lastmod>2022-12-28</lastmod></url>