<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>しののめん</title>
  <link>https://ada335.game-waza.net/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://ada335.game-waza.net/RSS/" />
  <description>プログラミングを勉強中の人のあれこれなブログ</description>
  <lastBuildDate>Mon, 02 Jun 2014 11:19:42 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>６月ですね</title>
    <description>
    <![CDATA[早いものでもう６月。私がプログラムを勉強し始めてから約４ヵ月が経過しました。<br />
ここまでいろいろありましたが、今やってるのはDirectXです。<br />
<br />
<br />
コイツがまた難しい&hellip;赤い単色の画面作るのに何日かかったことやら。<br />
導入さえうまくいけばWinAPIで描画するよりは楽とのこと。<br />
<br />
&hellip;ほ、ほんとか？]]>
    </description>
    <category>未選択</category>
    <link>https://ada335.game-waza.net/Entry/11/</link>
    <pubDate>Mon, 02 Jun 2014 11:19:42 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/11</guid>
  </item>
    <item>
    <title>キー操作のアルゴリズム</title>
    <description>
    <![CDATA[<p>暑くなってきました。<br />
まだ５月なんですがね&hellip;&hellip;。さておき前置きはこのぐらいにして今回はキー操作のアルゴリズム。<br />
<br />
結構いろんなサイトを見てみると、<br />
キー操作をウィンドウプロシージャで制御している方々が多いのですね。<br />
<br />
私もそうするのかーと思っていたのですがあるとき先生（教えてもらっている人）に<br />
「そこで管理する必要ないよ」<br />
と言われて、じゃぁどうするの？という話をしていた時に教えてもらったのが以下のソース。<br />
<br />
---------------------------------------------------------------<br />
int Param = 0;<br />
<br />
void keyControl()<br />
{<br />
&nbsp;if (GetAsyncKeyState(VK_SPACE) &amp; 0x8000)<br />
&nbsp;{<br />
&nbsp;&nbsp;Param ++;</p>
<p>&nbsp;&nbsp;if (Param &gt; 2)<br />
&nbsp;&nbsp;{ Param = 2; }<br />
&nbsp;}<br />
&nbsp;else<br />
&nbsp;{<br />
&nbsp;&nbsp;if (Param == 2)<br />
&nbsp;&nbsp;{ Param ++; }<br />
&nbsp;&nbsp;if (Param == 3)<br />
&nbsp;&nbsp;{ Param = 0; }<br />
&nbsp;}<br />
}<br />
----------------------------------------------------------------<br />
<br />
本当は、BOOLで制御するそうですが私にはよくわからないのでこのまま使用しております。<br />
原理としては<br />
１：入力を確認する<br />
２：押されている間にカウントを＋して行く。<br />
３：カウントごとにIf分で制御する。<br />
みたいな感じなのかしら。ちなみに使用するときは<br />
<br />
if (Param == 1){ True };<br />
<br />
みたいな感じです。<br />
<br />
Param == 1:押された直後<br />
Param == 2:押している間<br />
Param == 3:離す時<br />
Param == 0:何もしていない状態<br />
<br />
というふうに場合分けしているのですね。<br />
<br />
大掛かりなものになればなるほどプロシージャで管理するよりも<br />
こちらで管理したほうがよいよいです。参考までにどうぞ。</p>]]>
    </description>
    <category>プログラムソース</category>
    <link>https://ada335.game-waza.net/Entry/10/</link>
    <pubDate>Wed, 28 May 2014 07:41:20 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/10</guid>
  </item>
    <item>
    <title>一応完成</title>
    <description>
    <![CDATA[テトリスが、完成したぞー！<br />
といっても、ブロックの色は一色なのですがｗ<br />
<br />
基本的な部分が完成しました！<br />
明日からちょくちょくテトリスのアルゴリズムの解説を踏まえた、ソースコードとか紹介していけたらいいなと思います。<br />
<br />
しかし、今日が２７日で開始日が２１日。<br />
一日５時間としても３５時間、多く見積もって４０時間程度なのか&hellip;]]>
    </description>
    <category>ゲームプログラム</category>
    <link>https://ada335.game-waza.net/Entry/9/</link>
    <pubDate>Tue, 27 May 2014 06:59:38 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/9</guid>
  </item>
    <item>
    <title>暗号解読</title>
    <description>
    <![CDATA[テトリス制作なう。<br />
<br />
<br />
しかし、他人様のソースを見るのは暗号解読に等しい。<br />
そう、暗号解読。<br />
何が書いてあるかを把握するのは本当に難しいって話でした。まる。]]>
    </description>
    <category>未選択</category>
    <link>https://ada335.game-waza.net/Entry/8/</link>
    <pubDate>Sat, 24 May 2014 05:31:26 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/8</guid>
  </item>
    <item>
    <title>落下、落下、落下！</title>
    <description>
    <![CDATA[<p>テトリス制作なうにおいて発生した事件。<br />
落下速度が、早すぎる&hellip;！<br />
<br />
<br />
これ、どういうことかと申しますと。<br />
ようは１フレームに１回移動させていたのが原因らしく、<br />
移動量と相まってめっちゃ落下が早かったのですね。<br />
<br />
<br />
さんざん悩んで先生（教えてもらっている人）に泣きつきつつ。<br />
（いやほんとご迷惑かけてます、いつもありがとうございます。）<br />
その先生に<br />
<br />
「別に１フレームに１回移動させる必要なんてないのですよ」<br />
<br />
と言われ、な、なるほど&hellip;！と感心せざるを得ない発見に。<br />
ほんと、自分が初心者だと実感した瞬間&hellip;とまれ、そんな時にできたソースをご紹介。<br />
<br />
<br />
-------------------------------------------------<br />
int Count = 0;<br />
<br />
void MovePiese()<br />
{<br />
&nbsp;Count ++;</p>
<p>&nbsp;if (Count &gt;= 20)<br />
&nbsp;{<br />
&nbsp;&nbsp;//処理<br />
&nbsp;&nbsp;Count = 0;<br />
&nbsp;}<br />
}<br />
-------------------------------------------------<br />
<br />
こんな感じ。<br />
早い話、カウントをチャージしてカウントが一定を超えたら処理させて、カウントを初期化。<br />
こうすることで、好きなタイミングで処理を可能にしました。<br />
多分、いろんなサイトさんでも取り扱ってる方法の一つだと思いますが。<br />
<br />
<br />
さてさて、次はブロックを次々と落下させる処理だー。</p>]]>
    </description>
    <category>プログラムソース</category>
    <link>https://ada335.game-waza.net/Entry/7/</link>
    <pubDate>Thu, 22 May 2014 16:05:53 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/7</guid>
  </item>
    <item>
    <title>届いた！</title>
    <description>
    <![CDATA[<p>Windowsゲームプログラミング（2800円税別）が届く。<br />
<br />
<br />
アマゾンの中古で1514円。約半額。<br />
さすがアマゾン、安いのはとことん安い&hellip;。</p>]]>
    </description>
    <category>未選択</category>
    <link>https://ada335.game-waza.net/Entry/6/</link>
    <pubDate>Thu, 22 May 2014 09:52:21 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/6</guid>
  </item>
    <item>
    <title>そういえばスケルトン</title>
    <description>
    <![CDATA[さて、テトリスをちまちま作っていくことになったのだが。<br />
何はともあれ、windowsプログラミングというからにはウィンドウを表示させる必要がある。<br />
<br />
まぁ、ウィンドウの表示のさせ方はめっちゃネットにソースが掲載されているので<br />
ここでとやかく書くつもりはないのですが。<br />
<br />
とまれこのウィンドウの表示、最初から作ると面倒くさいことこの上ないのです。<br />
WINMAIN関数やウィンドウプロシージャを最初から書くのがとにかく大変。<br />
<br />
５個ぐらい作った時点で、コピペをするようになりました。<br />
現役でプログラマやってる人とかも推奨していますね。<br />
<br />
自分なりのスケルトンを作ったら、それを使いまわすのが吉。<br />
これはアルゴリズムに関しても同じで、使いまわせる部分はどんどん使いまわしちゃおうってことらしいです。<br />
<br />
ちなみに私はテトリスを作るにあたり、<br />
やっと自分なりのスケルトンのテンプレを作ることに成功しました。<br />
長かったぜ&hellip;。<br />
<br />
]]>
    </description>
    <category>ゲームプログラム</category>
    <link>https://ada335.game-waza.net/Entry/5/</link>
    <pubDate>Wed, 21 May 2014 09:53:58 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/5</guid>
  </item>
    <item>
    <title>そして次に</title>
    <description>
    <![CDATA[さて、ブロック崩しは一応の完成を見たので、次に進むのはテトリス。<br />
落ちゲーの元祖なのでしょうか。簡単そうに見えて奥が深いらしいですね。<br />
<br />
<br />
さて、今回からは製作途中で使えそうなものはじゃんじゃん載せていこうかなと。<br />
まぁ共通で使えそうなものって少なそうですけどね、テトリスって。]]>
    </description>
    <category>未選択</category>
    <link>https://ada335.game-waza.net/Entry/4/</link>
    <pubDate>Wed, 21 May 2014 01:24:18 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/4</guid>
  </item>
    <item>
    <title>矩形同士の当たり判定（角もあるよ！）</title>
    <description>
    <![CDATA[ブロック崩しを作成している過程で教えてもらいながらやっとこさ出来たソースを公開してみる試み。<br />
<span style="font-size: 14px;"> 今回のソースは当たり判定の中でもメジャーな矩形同士の当たり判定。</span><br />
<span style="font-size: 14px;"> 結構ネット上とかにもソースはあるのだけど、角まで含んだのは珍しいのではないだろうか？<br />
</span><span style="font-size: 14px;"><br />
というわけで公開。</span>
<p><span style="font-size: 14px;">-----------------------------------------------------------------------------------------</span></p>
<p><span style="font-size: small;">BOOL HIT = FALSE; //当たったかどうかのフラグ。初期設定ではFALSE</span><br />
<span style="font-size: small;"> BlockAYCenter;&nbsp;&nbsp;&nbsp; //矩形Aの中心Y座標</span><br />
<span style="font-size: small;"> BlockAXCenter;&nbsp;&nbsp;&nbsp; //矩形Aの中心X座標</span><br />
<span style="font-size: small;"> BlockBYCenter;&nbsp;&nbsp;&nbsp; //矩形Bの中心Y座標</span><br />
<span style="font-size: small;"> BlockBXCenter;&nbsp;&nbsp;&nbsp; //矩形Bの中心X座標</span><br />
<span style="font-size: small;"> BlockBYSpeed;&nbsp;&nbsp;&nbsp;&nbsp; //矩形BのY速度</span><br />
<span style="font-size: small;"> BlockBXSpeed;&nbsp;&nbsp;&nbsp;&nbsp; //矩形BのX速度</span><br />
<span style="font-size: small;"> BlockAWid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //矩形Aの横幅</span><br />
<span style="font-size: small;"> BlockAHei;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //矩形Aの縦幅</span><br />
<span style="font-size: small;"> BlockBWid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //矩形Bの横幅</span><br />
<span style="font-size: small;"> BlockBHei;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //矩形Bの縦幅</span></p>
<p><span style="font-size: small;">void Hit()</span><br />
<span style="font-size: small;"> {</span><br />
<br />
<br />
<span style="font-size: small;"> &nbsp;//当たり判定。ここらへんはいろんなところでソースが出ていると思う。</span><br />
<span style="font-size: small;"> &nbsp;//所謂、二つの座標の絶対値の距離を参照して一定の範囲内だったらTRUEを返すアルゴリズム。</span><br />
<span style="font-size: small;"> &nbsp;//ただ、今回の判定では未来予測を使用していることに注意。</span><br />
<span style="font-size: small;"> &nbsp;if (abs(BlockAYCenter - (BlockBYCenter + BlockBYSpeed)) &lt;= (BlockAHei + BlockBHei) / 2)</span><br />
<span style="font-size: small;"> &nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;if (abs(BlockAXCenter - (BlockBXCenter + BlockBXSpeed)) &lt;= (BlockAWid + BlockBWid) / 2)</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;HIT = TRUE;</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;}</span><br />
<br />
<span style="font-size: small;"> &nbsp;if (HIT)</span><br />
<span style="font-size: small;"> &nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;//角の当たり判定。問題はここ。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;//まず、現在位置においてどこにあるのかを判定する。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;//このif文は、現状矩形Aが矩形Bの角付近にいる場合を定義している。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;if (abs(BlockBXCenter - BlockAXCenter) &gt; ((BlockAWid + BlockBWid) / 2) &amp;&amp; abs(BlockBYCenter - BlockAYCenter) &gt; ((BlockAHei + BlockBHei) / 2))</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;//そして判定。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;//角に当たって、接触している部分の形が正方形になるのなら、角に当たっているという判定。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;//そうでない場合（接触している部分の形が長方形の場合）は、XとYのどちらが長いかを場合分けして左右か上下どちらかにあたっているかを場合分けする。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;if (((BlockAWid + BlockBWid) / 2) - abs((BlockBXCenter + BlockBXSpeed) - BlockAXCenter) == ((BlockAHei + BlockBHei) / 2) - abs((BlockBYCenter + BlockBYSpeed) - BlockAYCenter))</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;&nbsp;//ここに角に当たった場合の処理を書く。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;else if (((BlockAWid + BlockBWid) / 2) - abs((BlockBXCenter + BlockBXSpeed) - BlockAXCenter) &gt; ((BlockAHei + BlockBHei) / 2) - abs((BlockBYCenter + BlockBYSpeed) - BlockAYCenter))</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;&nbsp;//ここに角には当たっているけど左右の辺よりな場合の処理を書く。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;else if (((BlockAWid + BlockBWid) / 2) - abs((BlockBXCenter + BlockBXSpeed) - BlockAXCenter) &lt; ((BlockAHei + BlockBHei) / 2) - abs((BlockBYCenter + BlockBYSpeed) - BlockAYCenter))</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;&nbsp;//ここに角には当たっているけど上下の辺よりな場合の処理を書く。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;//そして、角以外の当たり判定＝各々の辺に当たっているなのでelseで処理を書く。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;else</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;//ここでは左右か上下かどちらかの場合分けをしている。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;//とりあえず、上下の場合をif文で定義。それ以外は左右なのでelseで分岐。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;if (((BlockAWid + BlockBWid) / 2) - abs((BlockBXCenter + BlockBXSpeed) - BlockAXCenter) &gt; ((BlockAHei + BlockBHei) / 2) - abs((BlockBYCenter + BlockBYSpeed) - BlockAYCenter))</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;&nbsp;//ここに上下の辺にあたっている時の処理を書く。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;else</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;{</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;&nbsp;//ここに左右の辺にあたっている時の処理を書く。</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;&nbsp;}</span><br />
<span style="font-size: small;"> &nbsp;}</span><br />
<span style="font-size: small;"> }</span></p>
<p><span style="font-size: 14px;">-----------------------------------------------------------------------------------------</span></p>
<p><span style="font-size: 14px;">と、こんな感じのソースが出来上がりました。</span><br />
<span style="font-size: 14px;"> 今回、ブロック崩しを作成している過程でのソースなので、ブロック崩し専用のアルゴリズムになるのかな？</span><br />
<span style="font-size: 14px;"> 矩形が片方しか動いてなかったり、上下と左右の二つでしか場合分けしてないのがその証拠ですね（ブロック崩しは基本上下と左右は処理が同じ）。</span><br />
<span style="font-size: 14px;"> あとこれ、矩形の動き方が斜め４５度の時にしか上手く動いてくれないっぽいです。</span><br />
<span style="font-size: 14px;"> ただ、角にも判定を作らなきゃいけないという場合には参考になるかと思います。</span></p>
<p><span style="font-size: 14px;">そしてちょっとだけソースの解説、いやソース内でも記述はしてあるけど。</span></p>
<p><span style="font-size: 14px;">まず、当たり判定には未来予測を使用しています。</span><br />
<span style="font-size: 14px;"> 次のフレームで当たる時に、現在のフレームの位置関係を調べてどの方向から当たるのかを調べているわけですね。</span></p>
<p><span style="font-size: 14px;">そして角付近に居る場合。接触したら角にぶつかったということになるのですが、角といってもちょっきり角に当たった場合と少し上にずれてるとかそういう場合があります。</span><br />
<span style="font-size: 14px;"> それを調べるために、「接触している部分の形が正方形ならちょっきり角に当たったよー」という分岐を追加しているのですね、それ以外はずれているのでズレてる場合の処理。</span><br />
<span style="font-size: 14px;"> そして角付近にいないということは辺の付近にいるということなのでelseを使用しているわけです。</span></p>
<p><span style="font-size: 14px;">ということで解説終了。</span><br />
<span style="font-size: 14px;"> まぁ、ソースを見てもらって、使えそうならご自由に改変して使ってくださって問題ないです。</span><br />
<span style="font-size: 14px;"> 矩形同士の当たり判定にしか使えませんので、使う部分は限られてそうですが。</span></p>]]>
    </description>
    <category>プログラムソース</category>
    <link>https://ada335.game-waza.net/Entry/3/</link>
    <pubDate>Wed, 21 May 2014 00:12:47 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/3</guid>
  </item>
    <item>
    <title>さて、ブロック崩し</title>
    <description>
    <![CDATA[さて、唐突だがブロック崩しだ。<br />
なぜかというと、今作っているからなのだが。<br />
<br />
突き詰めれば突き詰めるほどこんがらがるのがプログラムで、<br />
それを解決するのが困難でありまた面白い。<br />
<br />
<br />
ちなみに今苦戦しているのは当たり判定。<br />
ブロックとボールの衝突の際の判定だ。<br />
矩形と矩形での当たり判定を使用しているので簡単だと思ったらそうでもなかった。<br />
<br />
<br />
角に当たった際の判定がうまくいかなかったのだ。<br />
角に当たったら、XとYの移動量が両方逆になるのだからそうしなきゃ！<br />
でも&hellip;<br />
どういう状況なら角に当たったということになるのだろうか？<br />
<br />
<br />
そんなことを考えて２日ほど。<br />
教えてもらっている先生にいろいろアドバイスをもらいながら製作中。<br />
作り終わったら、ソースをぺたぺた張ってみようと思う。]]>
    </description>
    <category>ゲームプログラム</category>
    <link>https://ada335.game-waza.net/Entry/2/</link>
    <pubDate>Tue, 20 May 2014 11:11:14 GMT</pubDate>
    <guid isPermaLink="false">ada335.game-waza.net://entry/2</guid>
  </item>

    </channel>
</rss>