<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>demura.net: ロボットの開発と教育 &#187; ODE</title>
	<atom:link href="http://demura.net/category/9ode/feed" rel="self" type="application/rss+xml" />
	<link>http://demura.net</link>
	<description>ロボット達のサッカーW杯RoboCup，つくばチャレンジ，物理計算エンジンＯＤＥと本サイトで開発している３次元描画ライブラリirrDrawStuffなどのロボット開発プラットフォームを開発者の視点で情報発信． なお，ODE本では左下動画のようなロボットシミュレータ作成法を学びます．まずは動画をクリックして体験しよう！</description>
	<lastBuildDate>Wed, 23 May 2012 03:44:27 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/category/9ode/feed" />
		<item>
		<title>ODE0.12のインストール法　(Visual C++ 2010 EE）</title>
		<link>http://demura.net/9ode/9619.html</link>
		<comments>http://demura.net/9ode/9619.html#comments</comments>
		<pubDate>Wed, 16 May 2012 06:44:20 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9619</guid>
		<description><![CDATA[ODE0.12のインストール法を説明します．今回は一番ユーザが多いと思われるWindows 7とVisual C++ 2010 Expression Editionを使った場合です． A. Visual C++ 2010 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://demura.net/wordpress/wp-content/uploads/2009/06/odelogo2.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2009/06/odelogo2.jpg" alt="odelogo2" title="odelogo2" width="200" height="62" class="alignnone size-full wp-image-3865" /></a></p>
<p>ODE0.12のインストール法を説明します．今回は一番ユーザが多いと思われるWindows 7とVisual C++ 2010 Expression Editionを使った場合です．</p>
<ul>
<li>A. Visual C++ 2010 Expression Editionのインストール</li>
<li>B. <a href="#a1">ODEのダウンロード</a></li>
<li>C. <a href="#a2">ODEのインストール</a></li>
<li>D. ODE本のサンプルプログラムをビルドする方法</li>
</ul>
<p><span id="more-9619"></span></p>
<hr />
<ul>
<li><strong>A. Visual C++ 2010 Expression Editionのインストール</strong>
<ul>
<li><a href="http://www.microsoft.com/japan/msdn/vstudio/express/">Microsoftのこのページの指示に従ってダウンロード・インストールしてください。</a></li>
</ul>
</li>
</ul>
<hr />
<ul>
<li><a name="a1"></a><strong>B. ODEのダウンロード</strong>
<ol>
<li><a href="http://sourceforge.net/projects/opende/files/ODE/0.12/ode-0.12.tar.gz/download">ode-0.12.tar.gz</a>をダウンロードし，デスクトップへ保存する．</li>
<li><a name="a2"></a>解凍ソフトの準備（持っていない方のみ）</li>
<li><a name="a2"></a>ode-0.12.tar.gzはtarフォーマットで圧縮されていますので解凍できるソフトウェアをインストールしてください．ここでは，私が使っているLhaplusという圧縮・解凍ソフトを使います．<a href="http://www.google.co.jp/" target="_self">Google</a>でLhaplusを検索するとダウンロード先を簡単に見つけることができます．</li>
<li>解凍と移動
<ul>
<li>デスクトップにあるode-0.12.tar.gzをダブルクリックすると、ode-0.12というフォルダーがデスクトップに生成されます。</li>
</ul>
<ul>
<li>ode-0.12フォルダをCドライブのすぐ下に移動する
<ul>
<li>マウスをode-0.12フォルダーに当て、右マウスボタンをクリック、「切り取り(T)」を選択</li>
<li>スタート→(マイ)コンピュータ→ローカルディスク(c)をダブルクリック</li>
<li>マウスの右ボタンをクリックし、「貼り付け（P)」を選択</li>
</ul>
</li>
</ul>
</li>
<li>ビルド（ライブラリの作成）
<ul>
<li>ode-0.12ではpremakeコマンドを使ってVisual C++ 2010用のソリューションファイルを作成できます．</li>
<li>コマンドプロンプトを起動する．<br />
スタート→「プログラムとファイルの検索」窓にcmd.exeと打ち込みEnterキーを押しコマンドプロンプトを起動する．</li>
<li>以下のようにコマンドを打ち込む．カットアンドペースト の場合は以下の文字列を使用し，自分で打ち込む場合は２個の-(マイナス)文字がつながって見えるので，下画像を参照して注意深く打ち込んでください．
<ul>
<li>
<pre> cd  c:\ode-0.12\build</pre>
</li>
<li>
<pre> premake4 --with-demos --with-libccd --only-double --only-static vs2008</pre>
<p>成功するとvs2008というVisual C++2008用のディレクトリが生成される．</li>
</ul>
</li>
<li>Visual C++ 2010 Express Editionを起動</li>
<li>メニューバーから「ファイル(F)」→「開く（O)」→「プロジェクト/ソリューション(P)」を選択</li>
<li>
<pre> c:\ode-0.12\build\vs2008\ode.sln</pre>
<p>を選択</li>
<li>「Visual Studio変換ウィザードへようこそ」ウインドウが開く。バックアップが必要ないので「いいえ(O)」にチェックを入れ、「次へ(N)」をクリック。</li>
<li>「変換準備完了」の画面になるので「完了(F)」をクリック。</li>
<li>「変換の完了」の画面になるので「閉じる」をクリック。</li>
<li>Visual C++ 2010 Expressのメニューバーから「デバッグ(D)」→「ソリューションのビルド(B)」を選択</li>
<li>デモプログラムの実行ファイルは
<ul>
<li><span style="font-family: 'Courier New'; line-height: 18px; font-size: 12px; white-space: pre;"> c:\ode-0.12\lib\Debug <span style="font-family: Georgia; line-height: 19px; white-space: normal; font-size: 13px;">に生成される．</span></span></li>
</ul>
</li>
<li>試しに，demo_basket.exeをダブルクリックして起動すればODEのビルド成功．これで，ODEのインストールは終わりです。</li>
</ul>
</li>
</ol>
</li>
</ul>
<hr />
<ul>
<li><strong>C. ODE本サンプルプログラムのビルド</strong></li>
<li><a href="../../dl">ダウンロードカテゴリー</a>からrobosimu******(******は日付）をダウンロードして，
<pre> c:\ode-0.12</pre>
<p>にコピーし，そこに解凍する．解凍に成功すると</p>
<pre>c:\ode-0.12\roboSimu******</pre>
<p>というディレクトリが生成される．ここで******は日付の数字。</p>
<p><strong><span style="color: #ff0000;">フォルダ名のroboSimu******から******を取り、次のフォルダ名に変更する。 </span></strong></p>
<pre>c:\ode-0.12\roboSimu</pre>
<p>その中にはsrc, texturesフォルダー，premake.exe, premake.lua, Readme.txt, roboSimu.luaファイルががあり，また，srcフォルダーの中にはODE本のサンプルコードがある．</li>
<li>ODEのインストールと同じように，premakeコマンドを使い，ソリューション，プロジェクトファイルを生成する．コマンドプロンプトを起動し，以下のコマンドを実行する．
<ul>
<li>
<pre>cd c:\ode-0.12\roboSimu</pre>
</li>
<li>
<pre>premake  --target  vs2008
 &#60;span style="color: #ff0000;"&#62;&#60;strong&#62;注：targetの前は-(マイナス）が２個連続．&#60;/strong&#62;&#60;/span&#62;</pre>
</li>
</ul>
</li>
<li>Visual C++ 2010 Express Editionを起動</li>
<li>メニューバーから「ファイル(F)」→「開く（O)」→「プロジェクト/ソリューション(P)」を選択
<ul>
<li>
<pre>c:\ode-0.12\roboSimu\src\roboSimu.sln</pre>
<p>を選択</li>
</ul>
</li>
<li>ビルドターゲットをDebugLibとする．<br />
<a href="http://demura.net/wordpress/wp-content/uploads/2012/05/vc2010.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2012/05/vc2010.jpg" alt="" title="vc2010" width="500" height="250" class="alignnone size-full wp-image-9625" /></a></li>
<li>「デバッグ(D)」→「ソリューションのビルド(B)」を選択</li>
<li>サンプルプログラムの実行ファイルはc:\ode-0.12\roboSimu\DebugLibに生成される．</li>
<li>試しに，arm1.exeをダブルクリックして起動すれば成功．お疲れ様でした！</li>
</ul>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9619.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9619&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9619.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9619.html" />
	</item>
		<item>
		<title>Codeblocksを使ったCプログラムの作り方</title>
		<link>http://demura.net/9ode/8746.html</link>
		<comments>http://demura.net/9ode/8746.html#comments</comments>
		<pubDate>Tue, 24 Apr 2012 02:05:07 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=8746</guid>
		<description><![CDATA[CodeblocksでＣ言語のプログラム作成法を説明します．画像をクリックすると拡大表示されます． １．Codeblocksのメニューバーの「ファイル」→「新規」→「プロジェクト&#8230;」を選択してクリック ２．「 [...]]]></description>
			<content:encoded><![CDATA[<p>CodeblocksでＣ言語のプログラム作成法を説明します．画像をクリックすると拡大表示されます．</p>
<p><span id="more-8746"></span></p>
<p>１．Codeblocksのメニューバーの「ファイル」→「新規」→「プロジェクト&#8230;」を選択してクリック</p>
<div id="attachment_8747" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb1-300x273.jpg" title="cb1" width="300" height="273" class="size-medium wp-image-8747" /></a><p class="wp-caption-text">新規作成</p></div>
<p>２．「Console Application」を選択して，「Go」をクリック</p>
<div id="attachment_8748" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb2.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb2-300x220.jpg" title="cb2" width="300" height="220" class="size-medium wp-image-8748" /></a><p class="wp-caption-text">コンソールアプリケーション</p></div>
<p>３．「Ｃ」を選択して「次へ(N)&gt;」をクリック</p>
<div id="attachment_8749" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb3.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb3-300x242.jpg" title="cb3" width="300" height="242" class="size-medium wp-image-8749" /></a><p class="wp-caption-text">Ｃ言語選択</p></div>
<p>４．プロジェクトを作成するフォルダを選択し，プロジェクトタイトルを決める．ここでは，プロジェクトはC:\ode-0.11.1\myprogの下に作成する．従って、プロジェクトを作成するフォルダはC:\ode-0.11.1\myprogとする。プロジェクトタイトルを入力するとプロジェクトファイル名や出力ファイル名は自動で決まるので打ち込む必要はない。プロジェクトタイトルは半角英数文字にすること。</p>
<div id="attachment_8750" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb4.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb4-300x242.jpg" title="cb4" width="300" height="242" class="size-medium wp-image-8750" /></a><p class="wp-caption-text">プロジェクトの指定</p></div>
<p>５．コンパイラを選択．ここではGNU GCC Compilerを選択．</p>
<div id="attachment_8752" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb51.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb51-300x242.jpg" title="cb5" width="300" height="242" class="size-medium wp-image-8752" /></a><p class="wp-caption-text">コンパイラの指定</p></div>
<p>７．プロジェクト名の下のSourcesをダブルクリックすると，テンプレートファイルが開く．Hello World!と表示する簡単なプログラムが自動的に生成される。このmain関数を自分のプログラムに変更する。</p>
<div id="attachment_8753" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb6.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb6-300x223.jpg" title="cb6" width="300" height="223" class="size-medium wp-image-8753" /></a><p class="wp-caption-text">テンプレートファイルの表示</p></div>
<p>8.　メニューバーの「ビルド(B)」→「ビルドして実行(F9)」を選択、あるいは、歯車と矢印アイコンをクリックしてビルド＆実行する。エラーの場合は下のLogs &amp;othersと表示された場所にエラーメッセージが表示される。成功の場合はウインドウが開く。この例ではHello World!と表示される。　「Press any key to continue.」と表示されているように、何かキーを押すとウインドウが閉じプログラムが終了する。</p>
<div id="attachment_8754" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb7.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb7-300x96.jpg" title="cb7" width="300" height="96" class="size-medium wp-image-8754" /></a><p class="wp-caption-text">実行結果</p></div>
<p>終わり．
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F8746.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=8746&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/8746.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/8746.html" />
	</item>
		<item>
		<title>よくあるエラーメッセージ</title>
		<link>http://demura.net/9ode/9549.html</link>
		<comments>http://demura.net/9ode/9549.html#comments</comments>
		<pubDate>Mon, 23 Apr 2012 03:21:22 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9549</guid>
		<description><![CDATA[Ｃ言語の授業でCodeblocksを使っています。そのコンパイラはgccで英語のエラーメッセージが初心者には難解で意味不明です。ここでは、その意味と解決法をまとめます。 例１ #include #include int  [...]]]></description>
			<content:encoded><![CDATA[<p>Ｃ言語の授業でCodeblocksを使っています。そのコンパイラはgccで英語のエラーメッセージが初心者には難解で意味不明です。ここでは、その意味と解決法をまとめます。</p>
<p><span id="more-9549"></span></p>
<hr />
<p>例１</p>
<pre>#include
#include 

int main()
{
　    printf("Hello world!\n");
    return 0;
}

||=== c1, Debug ===|
C:\myprog\c1\main.c||In function 'main':|
C:\myprog\c1\main.c|6|error: stray '\201' in program|
C:\myprog\c1\main.c|6|error: stray '@' in program|
||=== Build finished: 2 個のエラー、 0 個の警告 ===|</pre>
<ul>
<li>原因：全角空白文字が入っている。Codeblocksのエディタは全角空白文字が見えないので、コメントに日本語を使わないことをお勧めします。</li>
<li>解決方法: エラー行と１行上の行の全ての空白を削除して、空白部分に半角スペースを挿入する</li>
</ul>
<hr />
<p>例2</p>
<pre>int main()
{
    double r,  pi = 3.14
    printf("Input radius:");
    scanf("%lf", &amp;r);  //引数にアドレス演算子&amp;を付ける
    printf("area=%f \n", pi*r*r);  //円の面積を計算
    return 0;
}
C:\myprog\c2\main.c||In function 'main':|
C:\myprog\c2\main.c|7|error: expected ',' or ';' before 'printf'|</pre>
<ul>
<li>訳： printfの前に;(セミコロン）または,(カンマ）が期待される</li>
<li>原因と解決：printfの前にセミコロンがなかったので、挿入する</li>
</ul>
<hr />
<p>例3</p>
<pre>int main()
{
    int i, n = 30;
    double sum = 1.0; // 階乗は42億以上なるのでint型は不可

    four (i = n; i &#62; 0; i--)
    {
        sum *= i;
    }
    printf("Sum is %f\nSum is %e\n", sum,sum);
    return 0;
}</pre>
<pre>C:\myprog\c8\main.c||In function 'main':|
C:\myprog\c8\main.c|9|warning: implicit declaration of function 'four'|
C:\myprog\c8\main.c|9|error: expected ')' before ';' token|
C:\myprog\c8\main.c|10|error: expected ';' before '{' token|
C:\myprog\c8\main.c|7|warning: unused variable 'sum'|
||=== Build finished: 2 個のエラー、 2 個の警告 ===|</pre>
<ul>
<li>原因：forをfourと打ち間違えた</li>
<li>解決法：fourをforに変更</li>
</ul>
<hr />
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9549.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9549&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9549.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9549.html" />
	</item>
		<item>
		<title>ODE 0.12 のインストール法　(Windows + Code::Blocks)</title>
		<link>http://demura.net/9ode/9463.html</link>
		<comments>http://demura.net/9ode/9463.html#comments</comments>
		<pubDate>Mon, 09 Apr 2012 05:56:31 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9463</guid>
		<description><![CDATA[2012年2月12日にリリースされたODE0.12のインストール法を説明します．ここでは日本であまりメジャーではありませんが，海外ではユーザも多く，私の講義でも利用しているマルチプラットフォームの開発環境Code::Bl [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://demura.net/wordpress/wp-content/uploads/2009/06/odelogo1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2009/06/odelogo1.jpg" alt="odelogo1" title="odelogo1" width="200" height="62" class="alignnone size-full wp-image-3860" /></a></p>
<div>
<p>2012年2月12日にリリースされたODE0.12のインストール法を説明します．ここでは日本であまりメジャーではありませんが，海外ではユーザも多く，私の講義でも利用しているマルチプラットフォームの開発環境Code::Blocks10.05用の記事です．ODEではCode::Blocksのインストールがサポートされています．</p>
<p><span id="more-9463"></span></p>
<ol>
<ol>
<li><strong>ODE 0.12のインストール</strong></li>
<ul>
<li><a href="http://sourceforge.net/projects/opende/files/ODE/0.12/ode-0.12.tar.gz/download">ode-0.12.tar.gz</a>のダウンロード．デスクトップへ保存・解凍する．解凍ソフトは<a href="http://www.forest.impress.co.jp/lib/arc/archive/archiver/lhaplus.html">Lhaplus</a>を推奨します．</li>
<li>ode-0.12フォルダーをcドライブのトップへコピー．以下のディレクトリ（フォルダ）構成になります．</li>
<ul>
<li> c:\ode-0.12</li>
</ul>
<li>スタート→「プログラムとファイルの検索」窓にcmd.exeと打ち込みEnterキーを押しコマンドプロンプトを起動する．</li>
<li>以下のようにコマンドを打ち込みますが，打ち間違えると失敗するので<span style="color: #ff0000;"><strong>カットアンドペーストしてください</strong>。</span>カットアンドペーストした後はEnterキーを押してください．なお，cdの前に白い四角があると全角空白文字が挿入されています．全角文字があると失敗するので，その場合は矢印キーでカーソールを移動してDeleteキーで消してください．</li>
<ul>
<li>
<pre> cd c:\ode-0.12\build</pre>
</li>
<li>
<pre> premake4 --with-demos --with-libccd --only-double --only-static --os=windows codeblocks</pre>
</li>
</ul>
<li>成功するとcodeblocksというcode::blocks用のディレクトリがbuildフォルダの中に生成されるので，あるかどうかエクスプローラで確認する．なお, c:\ode-0.12\buildの意味はＣドライブの一番上にode-0.12というフォルダがあり，その中にbuildというフォルダがあるという意味．</li>
<ul>
<li>c:¥ode-0.12¥build¥codeblocks</li>
</ul>
</ul>
<li> <strong>ODEのビルド</strong></li>
<ul>
<ul>
<li>codeblocksを起動．起動法は次のとおり．<br />
スタート→すべてのプログラム→CodeBlocks→CodeBlocks</li>
<li>codeblocksのメニューバーから「ファイル(F)」→「開く（O)」を選択．ファイルを選ぶウインドウが開くので次のファイルを選ぶ．<br />
c:¥ode-0.12¥build¥codeblocks¥ode.workspace</li>
<li>「ビルド(B)」→「ワークスペースをビルド(W)」を選択．ワークスペースはVisual C++のソリューションと同様なもの．</li>
<li>デモプログラムの実行ファイルはc:¥ode-0.12¥lib¥Debugに生成される．試しに，そのDebugフォルダ内にあるdemo_basket.exeをダブルクリックして起動すればODEのビルド成功．<strong style="color: #ff0000;"><strong style="color: #ff0000;"><strong><strong><strong><strong><strong><strong><strong><strong><strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><br />
<strong><br />
</strong></li>
</ul>
</ul>
<li><span style="color: #ff0000;"><strong>ビルドに失敗する場合の対策</strong></span></li>
<ul>
<li><span style="border-collapse: separate; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-family: arial; color: #000000;"><strong>DebugDoubleLib” uses an </strong></span><em>invalid compiler</em>. と怒られたら</li>
<li>原因：他のコンパイラでビルドしようとしています。</li>
<li>対策：設定(s)→コンパイラとデバッガ(C)→グローバルなコンパイラ設定のToolchain実行ファイルが以下のようになっているか確認し（クリックすると画像が拡大される）、違う場合は変更する。 <a href="http://demura.net/wordpress/wp-content/uploads/2008/12/cb-compiler.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2008/12/cb-compiler-300x278.jpg" title="cb-compiler" width="300" height="278" class="alignnone size-medium wp-image-2946" /></a></li>
</ul>
</ol>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><!--more--> <strong>　　４．ODE本サンプルプログラムのビルド</strong></p>
<ol>
<ol>
<ol type="a">
<ol type="a">
<li><a href="http://demura.net/dl">ダウンロードカテゴリー</a>からrobosimu******(******は日付）をダウンロードして，c:¥ode-0.12にコピーし，そこに解凍する．解凍に成功するとc:¥ode-0.12¥roboSimu******というディレクトリが生成される．<span style="color: #ff0000;"><strong>フォルダ名から日付をとり，roboSimuとフォルダ名を変更する．</strong></span>その中にはsrc,texturesフォルダーとがあり，premake.exe, premake.lua, Readme.txt, roboSimu.luaファイルが生成される．srcフォルダーの中にはODE本のサンプルコードがある．</li>
<li>ODEのインストールと同じように，premakeコマンドを使い，code::blocks用のプロジェクトを生成する．コマンドプロンプトを起動し，以下のコマンドを実行する．なお，ODEでは新しいpremake4を使っていますが，ここではODE本サンプルプログラムに同封されている古いpremakeを使います．</li>
<ul>
<li>
<pre> cd c:\ode-0.12\roboSimu </pre>
</li>
<li>
<pre> premake  --target  cb-gcc </pre>
</li>
<li><strong style="color: #ff0000;">注：targetの前は-(マイナス）が２個連続．</strong></li>
</ul>
<li>code::blocksを起動</li>
<li>code::blocksのメニューバーから「ファイル(F)」→「開く（O)」を選択</li>
<ul>
<li>c:\ode-0.12\roboSimu\src\roboSimu.workspace<br />
を選択</li>
</ul>
<li><strong><span style="color: #ff0000;">重要：</span><span style="color: #0000ff;">ビルドターゲットを</span></strong><strong><span style="color: #ff0000;">DebugLib</span><span style="color: #0000ff;">とする．</span></strong></li>
<li>ODEのライブラリをビルドするとき倍精度静的ライブラリを選んでいるので、必ずDebugLibを選択する。</li>
<li>「ビルド(B)」→「ワークスペースをビルド(W)」を選択。エラーが出た場合は、ODEのビルドに失敗している可能性が高いのでODEのビルドをやり直し。</li>
<li>サンプルプログラムの実行ファイルはc:¥ode-0.12¥roboSimu¥DebugLibに生成される．</li>
<li>試しに，arm1.exeをダブルクリックして起動すれば成功．お疲れ様でした！</li>
</ol>
</ol>
</ol>
</ol>
<p>&nbsp;</p>
<p>最終更新日：2012-4-9</p>
</div>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9463.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9463&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9463.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9463.html" />
	</item>
		<item>
		<title>C/C++統合開発環境Code::Blocks10.05のインストール (Windows)</title>
		<link>http://demura.net/9ode/8634.html</link>
		<comments>http://demura.net/9ode/8634.html#comments</comments>
		<pubDate>Sat, 07 Apr 2012 22:27:18 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=8634</guid>
		<description><![CDATA[Code::BlocksというフリーでオープンソースなC/C++統合開発環境のインストール法をッ説明します．日本では，Code::blocksはあまり馴染みがないかもしれませんが，オープンソースでマルチプラットフォームと [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://demura.net/wordpress/wp-content/uploads/2008/07/codeblocks.jpg" alt="codeblocks.jpg" /></p>
<p><a href="http://www.codeblocks.org/">Code::Blocks</a>というフリーでオープンソースなC/C++統合開発環境のインストール法をッ説明します．日本では，Code::blocksはあまり馴染みがないかもしれませんが，オープンソースでマルチプラットフォームという利点はODEやIrrlichtと同じように多少リスキーですが，かっこいいと思いますので使っていきます．</p>
<p>では，これからCode::Blocksのインストール方法をご説明します．</p>
<ol>
<li>ダウンロード・インストール
<ul>
<li><a href="http://www.codeblocks.org/">Code::Blocks</a>のウェブサイトからダウンロードする．
<ul>
<li>左にあるMainのDownloadsをクリック</li>
<li>Download the binary releaseをクリックすると以下の画面になるので，Windows 2000/XP/Vistaの<span style="color: #ff0000;">codeblocks-10.05mingw-setup.exe</span>を選択する． <span style="color: #0000ff;"><strong>これにはmingwからのgccやgdbが含まれています．必ずこちらをダウンロードしてください．</strong></span></li>
</ul>
</li>
<li>デスクトップに保存し，codeblocks-10.05mingw-setup.exeをダブルクリックし実行する．</li>
<li>CodeBlocks Setupの窓になり，「Next&gt;」をクリック</li>
<li>License Agreementの窓になり，読んでから「I Agree」をクリックする．同意しないとインストールできません．</li>
<li>Choose Componentsの窓になり，C:B Share Configにもチェックを入れる「Next &gt;」をクリック</li>
<li>Choose Install Locationの窓になる．Destination Folderを変更せずに，「Install」をクリック</li>
<li>”Do you want to run Code::Blocks now?”と聞かれるが，日本語環境に変更するので「いいえ(N)」をクリックする．</li>
<li>Installation Completeの窓になり，「Next&gt;」をクリックすると，「Completing the CodeBlocks Setup Wizard」窓になるので，「Finish」をクリックしてインストールを終了する．</li>
</ul>
</li>
<li>日本語化
<ul>
<li><a href="http://sourceforge.jp/projects/foo-doc-jp/wiki/CodeBlocks">Code::Blocks日本語化</a>のウェブサイトに行き，日本語化に必要なファイルcodeblocks-ja-8.02-1.zipをダウンロードし，デスクトップに保存する．codeblocks8.02用だが、codeblocks10.05でも日本語化できる。</li>
<li>codeblocks-ja-8.02-1.zipを解凍する．解凍するとcodeblocks-jaフォルダーの中に，locale, srcフォルダーとreadme.txtファイルができる．</li>
<li>localeフォルダーをコピーしてcodeblockのインストールフォルダ
<pre>c:\Program Files\CodeBlocks\share\CodeBlocks  (32bit OSの場合)</pre>
<pre>c:\Program Files (x86)\CodeBlocks\share\CodeBlocks  (64bit OSの場合)</pre>
<p>の中へ貼り付ける．上の行の意味は、コンピュータのローカルディスクＣ（Ｃドライブとも呼ぶ）の中にProgram Filesというフォルダーがあり、その中にCodeBlocksというフォルダーがあり、また、その中にshareというフォルダーがあり、その中のCodeBlocksを意味します。￥マークはフォルダの区切りを表します。32bit OSと64bit OSでは場所が違うので注意してください。</li>
<li>Code::Blocksを起動する．日本語化の設定をしていないので，次のように英語表示される．<br />
<img src="http://demura.net/wordpress/wp-content/uploads/2008/07/cbenglish.jpg" alt="cbenglish.jpg" title="cbenglish.jpg" width="500" /></li>
<li>Settings -&gt; Environmentを選択</li>
<li>「目玉おやじ」のようなViewをクリック. Internationalizationにチェックを入れ，Japaneseを選択し，OKをクリック．日本語化するためには再起動が必要なので，File→Quitを選択．<br />
<img src="http://demura.net/wordpress/wp-content/uploads/2008/07/view.jpg" alt="view.jpg" title="view.jpg" width="500" /></li>
<li>Layout Changedの画面が出て，&#8221;The layout &#8216;Code::Blocks default&#8217; has changed. Do you want to save it?&#8221;と設定を保存するか聞いてくるので聞かれるので「Yes」をクッリクする．</li>
<li>CodeBlocksを起動する．トップ画像のように日本語になっていればOK．おつかれさま．</li>
</ul>
</li>
</ol>
<p>説明が詳しくないので，わからない箇所があればコメントください．<br />
以上です．</p>
<p>でむ
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F8634.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=8634&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/8634.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/8634.html" />
	</item>
		<item>
		<title>待ちに待ったODE-0.12リリース</title>
		<link>http://demura.net/9ode/9413.html</link>
		<comments>http://demura.net/9ode/9413.html#comments</comments>
		<pubDate>Mon, 20 Feb 2012 06:40:40 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9413</guid>
		<description><![CDATA[ODEが２０１２年２月１２日にバージョンアップされ0.12となりました．svnでは更新されていましたが，頻繁に変わるため講義などでは使いづらく問題でした．待ちに待った約２年９カ月ぶりのバージョンアップです．主な変更は次の [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_9414" class="wp-caption alignnone" style="width: 538px"><a href="http://demura.net/wordpress/wp-content/uploads/2012/02/gyro.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2012/02/gyro.jpg" alt="" title="gyro" width="528" height="443" class="size-full wp-image-9414" /></a><p class="wp-caption-text">ODE-0.12　demo_gyroscopicのキャプチャ画面</p></div>
<p>ODEが２０１２年２月１２日にバージョンアップされ0.12となりました．svnでは更新されていましたが，頻繁に変わるため講義などでは使いづらく問題でした．待ちに待った約２年９カ月ぶりのバージョンアップです．主な変更は次のとおり（<a href="http://ode-wiki.org/wiki/index.php?title=Changelog">詳細な変更はここ</a>）．</p>
<ul>
<li><a href="http://sourceforge.net/projects/opende/files/ODE/0.12/">ダウンロードはここから</a>．</li>
<li>多くのプラットフォームに対応</li>
<ul>
<li>Windows 32bit, 64bit, Mac OS X,  PS3 (実験）, xbox360(実験）</li>
</ul>
<li>衝突検出の改善</li>
<ul>
<li>CCD(Continuous Collision Detection, 連続衝突検出）の実装．</li>
</ul>
<li>Pythonバインディングの組み込み</li>
</ul>
<div>物理エンジンとしては衝突検出にCCDが実装されたことは大きいでしょう．今まで，円柱（シリンダ）の衝突検出に問題がありましたが，これにより改善されることが期待されます（未確認）．なお，CCDを使うためにはpremakeで&#8211;with-libccdのオプションが必要です．</div>
<div>さっそく，Windows 7の 64bitで試しましたが問題なくpremake, ビルド，デモプログラムの実行ができました．</div>
<div>ちなみに，私は以下のオプションでpremakeしました．</div>
<div>
<ul>
<pre class="brush:cpp;">premake4 --with-demos --with-libccd --only-double --only-static --os=windows --platform=x64 codeblocks
</pre>
</ul>
<div>Enjoy ODE-0.12　!</div>
<div>でむ</div>
<p>&nbsp;</p>
</div>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9413.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9413&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9413.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9413.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶC言語 [STEP6: まとめ]</title>
		<link>http://demura.net/9ode/9383.html</link>
		<comments>http://demura.net/9ode/9383.html#comments</comments>
		<pubDate>Thu, 19 Jan 2012 14:14:22 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9383</guid>
		<description><![CDATA[今回でこの講座は終わりです。先週作り始めたブロック崩し風ゲームを完成させましょう。 この手のゲームで必要になることは、ボールがブロックの当たったときにブロックの消す処理です。このサンプルプログラムではブロックを３個用意し [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_9384" class="wp-caption alignnone" style="width: 410px"><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/block2.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2012/01/block2.jpg" alt="" title="block2" width="400" height="313" class="size-full wp-image-9384" /></a><p class="wp-caption-text">ブロック崩し風ゲーム。未完成。続きを作ろう！</p></div>
<p>今回でこの講座は終わりです。先週作り始めたブロック崩し風ゲームを完成させましょう。</p>
<p>この手のゲームで必要になることは、ボールがブロックの当たったときにブロックの消す処理です。このサンプルプログラムではブロックを３個用意し、それぞれの当たりを判定する変数をblock1_hit, block2_hit, block3_hitとして０で初期化します。</p>
<p>ボールとブロックが衝突したらその変数を１に設定し、そのブロックを破壊し表示しないという処理を行っています。</p>
<pre class="brush:cpp;">// step6.cpp
int block1_hit = 0, block2_hit = 0, block3_hit = 0; //　ブロックにボールが衝突すれば１、しないと０

/***  シミュレーションループ　***/
void simLoop(int pause)
{
    int i, j;

    dmWorldQuickStep(); // シミュレーションを１ステップ進める(高速版)

    dmDraw(&amp;ball);
    dmDraw(&amp;bar);
    dmDraw(&amp;field);

    for (i =0; i &#60; 3; i++)
    {
        dmDraw(&amp;fence&#91;i&#93;);
    }

    // ブロックがボールに衝突していない場合はブロックを表示し
    // ブロックがボールに衝突した場合はブロックを破壊する。
    if (block1_hit==0) dmDraw(&amp;block1);
    else                  dmDestroyBox0(&amp;block1);

    if (block2_hit==0) dmDraw(&amp;block2);
    else                  dmDestroyBox0(&amp;block2);

    if (block3_hit==0) dmDraw(&amp;block3);
    else                  dmDestroyBox0(&amp;block3);

    STEPS++;
}</pre>
<p>次に、今まで秘密のベールに包まれていたdm6.cppを説明します。このファイルでODEを簡単に使う関数を作っています。まず、２，３行目のexternで始まる変数の宣言は、dm6.cpp以外のファイルで宣言しているよとコンパイラーに教えています。これらの行がないとblock1, block1_hitが宣言されていないとエラーになり、externを付けないとstep6.cppでも宣言されているので２重定義でエラーになってしまいます。大きなプログラムは複数のファイルで構成されるのでこのexternは覚えておきましょう。</p>
<p>お次は、衝突検出を説明します。これはdm6.cpp内のnearCallback関数で行われています。if else文でブロック１のジオメトリ(block1.geom)、ブロック２のジオメトリ(block2.geom)、ブロック３のジオメトリ(block3.geom)がボールのジオメトリ(ball.geom)がo1, o2のどちらかなら衝突しているので、衝突判定用の変数block1_hit, block2_hit, block3_hitに１を代入しています。なお、ジオメトリとはODEで衝突判定に使われる物体の属性です。</p>
<p>また、nearCallback関数は２つの物体（正確にはジオメトリ）が接近して衝突しそうになったら自動で呼び出せれる関数です。このような関数をコールバック関数と呼びます。電話のコールバックをイメージしてください。引数のジオメトリo1, o2は衝突しそうな２つのジオメトリです。</p>
<p>このサンプルプログラムでたった３個のブロック崩し風ゲームは完成です。後は、いろいろ工夫して自分だけのゲームを完成させてください。</p>
<p>終わり。</p>
<pre class="brush:cpp;">// dm6.cpp
extern dmObject ball, field, fence&#91;3&#93;, bar, block1, block2, block3;
extern int block1_hit, block2_hit, block3_hit;

/*** 衝突検出関数（コールバック関数） ***/
void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
    static const int N = 10; // 接触点数の最大値
    dContact contact&#91;N&#93;;     // 接触点

    // 衝突情報の生成 nは衝突点数
    int n = dCollide(o1,o2,N,&amp;contact&#91;0&#93;.geom,sizeof(dContact));

    for (int i = 0; i &#60; n; i++)
    {
        contact&#91;i&#93;.surface.mode = dContactBounce; // 接触面の反発性を設定

        //　ボールとバーが接触したら反発係数を1.5に設定
        if(((ball.geom == o1) &amp;&amp; (bar.geom == o2)) || ((ball.geom == o2) &amp;&amp; (bar.geom == o1)))
        {
            contact&#91;i&#93;.surface.bounce = 1.5;          // 反発係数(実際の世界では0.0から1.0)
        }
        // ボールと床が接触したら反発係数を0.5に設定
        else if (((ball.geom == o1) &amp;&amp; (field.geom == o2)) || ((ball.geom == o2) &amp;&amp; (field.geom == o1)))
        {
            contact&#91;i&#93;.surface.bounce = 0.5;
        }
        // ボールとブロック１が接触したら。block1_hitを１に設定
        else if (((ball.geom == o1) &amp;&amp; (block1.geom == o2)) || ((ball.geom == o2) &amp;&amp; (block1.geom == o1)))
        {
             block1_hit = 1;
        }
        // ボールとブロック2が接触したら。block2_hitを１に設定
        else if (((ball.geom == o1) &amp;&amp; (block2.geom == o2)) || ((ball.geom == o2) &amp;&amp; (block2.geom == o1)))
        {
             block2_hit = 1;
        }
         // ボールとブロック3が接触したら。block2_hitを１に設定
        else if (((ball.geom == o1) &amp;&amp; (block3.geom == o2)) || ((ball.geom == o2) &amp;&amp; (block3.geom == o1)))
        {
             block3_hit = 1;
        }
        // その他は反発係数を0.8に設定
        else
        {
            contact&#91;i&#93;.surface.bounce = 0.8;
        }

        // contact&#91;i&#93;.surface.bounce_vel = 0.05;      // 反発に必要な最低速度
        contact&#91;i&#93;.surface.mu = 0.0;// dInfinity;        // 摩擦係数

        // 接触ジョイントの生成
        dJointID c = dJointCreateContact(world,contactgroup,
                                         &amp;contact&#91;i&#93;);
        // 接触している２つの剛体を接触ジョイントにより拘束
        dJointAttach(c,dGeomGetBody(contact&#91;i&#93;.geom.g1),
                     dGeomGetBody(contact&#91;i&#93;.geom.g2));
    }
}</pre>
<p>ホームワーク</p>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/step6-120119.zip">step6-120119.zipをダウンロードして実行しよう！</a></li>
<li>ブロックの数を１個増やそう。</li>
<li>３で作ったブロックの色を黒に変更しよう。</li>
<li>ブロックの数を増やし、競技盤の半分ぐらいは埋め尽くそう。配列を使うのが望ましい。</li>
<li>ボールの初期位置と飛び出す方向をランダムに変えよう。</li>
<li>バーが競技盤を飛び出してしまいます。飛び出さないようにしよう。</li>
<li>得点を表示する機能を付けよう。標準出力にprintfでもかまいません。</li>
<li>いろいろ工夫して自分だけのブロック崩し風ゲームを作ろう！遊ぶためにゲームの説明を文字ウインドウに表示しよう。</li>
</ol>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9383.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9383&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9383.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9383.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶC言語 [STEP5: 構造体]</title>
		<link>http://demura.net/9ode/9353.html</link>
		<comments>http://demura.net/9ode/9353.html#comments</comments>
		<pubDate>Mon, 09 Jan 2012 05:28:59 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9353</guid>
		<description><![CDATA[少し、遅くなりましたが新年明けましておめでとうございます。今年も、demura.netをよろしくお願いします。 ODEで学ぶC言語2のStep5です．今回は構造体と物体へ力やトルクを加える方法，さらにシミュレーションのリ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_9356" class="wp-caption alignnone" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/block1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2012/01/block1-300x242.jpg" alt="" title="block1" width="300" height="242" class="size-medium wp-image-9356" /></a><p class="wp-caption-text">ブロック崩しを作ろう！</p></div>
<p>少し、遅くなりましたが新年明けましておめでとうございます。今年も、demura.netをよろしくお願いします。</p>
<p>ODEで学ぶC言語2のStep5です．今回は構造体と物体へ力やトルクを加える方法，さらにシミュレーションのリセット法などを学びます．構造体の概要については既にわかっているものとし，サンプルコードを示すことにより具体的な使い方を学びます．例として、Step5とStep6でスティーブン・ジョブスがAtari社時代に、アップルの共同設立者ウォズニアックと開発に携わったBreakout（ブロック崩し）風のゲームを作ってみましょう。</p>
<p><span id="more-9353"></span></p>
<p><strong>○　構造体</strong></p>
<p>配列では同じ型しかまとめることができませんでしたが，構造体では違う型をまとめて扱うことができるのでシミュレーションなど物体に多くの属性がある場合に便利です．このサンプルプログラムでは物体をdmObjectという構造体で次のように表しています．dm5.hの１６行目に定義しています．</p>
<pre class="brush:cpp;">typedef struct{
    dBodyID body; // ボディのID
    dGeomID geom; // ジオメトリのID
    const double *p; // x, y, z　&#91;m&#93;
    const double *R;   // 回転行列 要素数4x3
    double m; // 質量 &#91;kg&#93;
    double r,l; // 半径 &#91;m&#93;, 長さ &#91;m&#93;
    const double *side; // サイズ　x,y,z
    const double *color; // 色 r,g,b
} dmObject;</pre>
<p>また、STEP4まではdmLoop関数の引数にstep関数やcommand関数を渡していましたが、ここでは関数のポインタを要素に持つ構造体dmFunctionsを定義します。今まではdmLoopに渡す関数が増えるとその数だけ引数が多くなってしまいましたが、この構造体だけを引数として渡せば良いのでプログラムがすっきりします。</p>
<pre class="brush:cpp;">typedef struct
{
    void (*start)();            // 初期化関数
    void (*step) (int pause);	// ステップ関数
    void (*command) (int cmd);	// キー関数
} dmFunctions;</pre>
<p>○<strong> 衝突検出だけ働く物体の作り方</strong></p>
<p>物理エンジンODEでは物体は２つの属性からできています。一つは動力学計算の対象となるbody（ボディ）、もう一つは衝突検出の対象となるgeometry（ジオメトリ）です。ゲームでは動かない建物や壁など動力学計算を働かせる必要のない物体は衝突検出計算だけを適応すれば計算処理が軽くて済みます。ここでは、衝突検出計算だけ働く物体を作るAPIを紹介します。</p>
<ul>
<li><strong>void dmCreateBox0(dmObject *obj, double p[3], double R[12], double m, double side[3], double color[3]);</strong></li>
</ul>
<p>衝突検出計算しか作用しない物体を作成します．dmCreateBoxの後に0（零）を付け加えたAPI名です。引数のp[3]は位置(x,y,z)[m]，R[12]は姿勢（回転行列）, mは質量[kg]，sideは直方体の各辺の長さ[m]，color[3]は色(赤，緑，青各成分、値は0以上1以下）です．同様なAPIとして、dmCreateSphere0, dmCreateCylinder0, dmCreateCapsule0があります。</p>
<p>○<strong> 姿勢の変更</strong></p>
<p>物体の姿勢を変更するためには次のAPIを使い回転行列Rの値を変更します．ここで，Rは回転行列が格納されている配列へのポインタ，ax, ay, axは回転軸ベクトル．angleは回転角度となります．なお，dだけで始まるAPIはODEのAPIです．</p>
<ul>
<li><strong>dRFromAxisAndAngle(double　R[12], double  ax, doulbe  ay, double  az, double angle);</strong></li>
</ul>
<p><strong>○　力，トルクの加え方</strong></p>
<ul>
<li><strong>void dmAddForce(dmObject *obj, double fx, double fy, double fz)</strong>
<ul>
<li>物体objの重心に力(fx,fy,fz)を加える</li>
</ul>
</li>
<li><strong>void dmAddTorque(dmObject *obj, double fx, double fy, double fz)</strong>
<ul>
<li>物体objの重心にトルク(fx, fy, fz)を加える．fx，ｆｙ，ｆｚはそれぞれx, y, z軸まわりのトルク</li>
</ul>
</li>
</ul>
<p>○　<strong>高速なシミュレーション</strong></p>
<p>前回のサンプルではシミュレーションのステップ関数としてdmWorldStep()を使いましたが，ここではより高速なdmWorldQuickStep()を使います．ただし，dmWorldStep()と比較して精度が悪くなります．</p>
<p><strong>○　シミュレーションのリセット</strong></p>
<p>rまたはRキーを押すと，resetSim関数が呼ばれてシミュレーションがリセットされます．resetSimの中身はシミュレーションループが１回以上呼び出されたときにdmInit関数を呼び出して初期化し，物体を再度生成しています．</p>
<p><strong>○　ソースコード</strong></p>
<pre class="brush:cpp;">/* step5 ブロック崩し 2012-01-09 　*/
#include "dm5.h"

static int STEPS = 0;   // シミュレーションのステップ数
double red&#91;3&#93;     = {1.3, 0.0, 0.0}; // 赤色
double yellow&#91;3&#93; = {1.3, 1.3, 0.0}; // 黄色
double green&#91;3&#93; = {0.0, 0.8, 0.0}; // 緑色

dmObject ball, field, fence&#91;3&#93;, bar; // ドミノ, フィールド, 柵
dmFunctions dmf; // 描画関数の構造体

/***  シミュレーションループ　***/
void simLoop(int pause)
{
    int i;

    dmWorldQuickStep(); // シミュレーションを１ステップ進める(高速版)

    dmDraw(&amp;ball);
    dmDraw(&amp;bar);
    dmDraw(&amp;field);
    for (i =0; i &#60; 3; i++)
    {
        dmDraw(&amp;fence&#91;i&#93;);
    }

    STEPS++;
}

void resetSim(int n)
{
    double m = 0.1; // 質量
    double side&#91;3&#93; = {0.2, 0.05, 0.5}; // サイズ
    double R&#91;12&#93; = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢
    double ball_pos&#91;3&#93;={-0.91, 0.25, 0.7}, ball_r = 0.03, ball_m = 0.1; // ボールの位置、半径、質量
    double bar_pos&#91;3&#93;={-0.08, 0, 0.6}, bar_side&#91;3&#93; = {0.01, 0.1, 0.1}, bar_m = 0.1; // ボールの位置、半径、質量
    double field_pos&#91;3&#93;={-0.5, 0, 0.5}, field_side&#91;3&#93; = {1, 1, 0.01}, field_m; // フィールドの位置、サイズ, 質量
    double fence_pos&#91;3&#93;&#91;3&#93; = {{-1.0, 0, 0.6}, {-0.5, -0.5, 0.6},{-0.5, 0.5, 0.6}};　// 柵の位置
    double fence_side&#91;3&#93;&#91;3&#93; = {{0.05, 1.05, 0.1}, {1.0, 0.05, 0.1}, {1.0, 0.05, 0.1}};
    double fence_m&#91;3&#93; = {0.1, 0.1, 0.1};
    int i;

    // シミュレーションの終了
    if (STEPS != 0)
    {
        dmClose();
    }

    dmInit(); // 初期化

    //  ボールの生成
    dmCreateSphere(&amp;ball, ball_pos, R, ball_m, ball_r, red);

    // バーの生成
    dmCreateBox0(&amp;bar, bar_pos, R, bar_m, bar_side, yellow);

    // フィールドの生成
    dmCreateBox0(&amp;field, field_pos, R, field_m, field_side, green);
    for (i =0; i &#60; 3; i++) {
        dmCreateBox0(&amp;fence&#91;i&#93;, fence_pos&#91;i&#93;, R, fence_m&#91;i&#93;, fence_side&#91;i&#93;, green);
    }
}

/*** キ―入力関数 ***/
void command(int cmd)
{
    switch (cmd)
    {
    case 'r':
    case 'R':
        resetSim(0);
        break;
     default:
        printf("Input r, R, f, F key \n");
        break;
    }
}

/*** カメラの位置と姿勢設定 ***/
void setCamera()
{
    float x =  -0.5, y = 0.0, z = 1.5;    // カメラの位置
    float roll = 0, pitch = -90, yaw = -180; // カメラの方向&#91;°&#93;
    dmSetCamera(x,y,z,roll,pitch,yaw);  // カメラの設定
}

/*** 描画用構造体の設定　***/
void setDraw()
{
    dmf.start       = &amp;setCamera;
    dmf.step        = &amp;simLoop;
    dmf.command = &amp;command;
}

/*** main関数 ***/
int main()
{
    resetSim(0); // シミュレーションのリセット
    setDraw();   // 描画関数の設定
    dmLoop(800, 600, &amp;dmf);  // ウインドウの幅，高, ループ関数，コマンド関数
    dmClose(); // 終了
    return 0;
}</pre>
<p><strong>ホームワーク５</strong></p>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/step5a-120110.zip">これをダウンロードstep5a-120110して実行しよう！</a></li>
<li>黄色のバーをfまたはFキーを押すと左、jまたはJキーを押すと右にバーが動くように変更しよう！<br />
ヒント：　黄色のバーには動力学を適応させていないのでdGeomSetPosition(dGeomID geom, double x, double y, double z);を使って強制的に位置を移動させる。ここで、１番目の引数にはbar.geomを入れればよい。2から４番目の引数は、絶対座標系での位置のx, y, z成分。</li>
<li>ボールが斜めに落ちるように、初めに横方向に力を加えよう！<br />
ヒント：dmAddForce(dmObject *obj, double fx, double fy, double fz); を使おう。resetSim関数内のdmCreateSphere関数のすぐ後にdmAddForceを入れよう。なお、力の方向や大きさを乱数を使って変化させるとゲームが面白くなる。</li>
<li>ブロックを３行１０列、合計３０個表示しよう！各行で色を変えると見栄えがするよ。<br />
ヒント： dmObject fence[3]; ボール落下防止用の柵に関するコードを参考にすると良い。</li>
</ol>
<div>　　以上</div>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9353.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9353&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9353.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9353.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶＣ言語 [Step4: 関数]</title>
		<link>http://demura.net/9ode/9344.html</link>
		<comments>http://demura.net/9ode/9344.html#comments</comments>
		<pubDate>Tue, 20 Dec 2011 23:03:43 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9344</guid>
		<description><![CDATA[ODEで学ぶC言語のStep4です．今回は私がODEのAPIを元に作成した関数を使い，赤い球を落下させるプログラムを説明します． 今までのプログラムでは描画だけでしたが，今回からシミュレーションやゲームを作るために必要な [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7485" class="wp-caption aligncenter" style="width: 673px"><a href="http://demura.net/wordpress/wp-content/uploads/2010/07/step4.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2010/07/step4.jpg" alt="落下する赤い球" title="step4" width="663" height="532" class="size-full wp-image-7485" /></a><p class="wp-caption-text">落下する赤い球</p></div>
<p>ODEで学ぶC言語のStep4です．今回は私がODEのAPIを元に作成した関数を使い，赤い球を落下させるプログラムを説明します．</p>
<div id="_mcePaste">今までのプログラムでは描画だけでしたが，今回からシミュレーションやゲームを作るために必要な動力学計算や衝突検出計算も含んでいます．サンプルプログラムとしては，物理シミュレーションで最も簡単な物体の落下を取り上げます．C言語などのプログラミングの教科書では初めの例題はHello Worldを表示する例が定番です。ここではHello Worldの物理シミュレーション版を紹介します．</div>
<div><span id="more-9344"></span></div>
<div>
<p>&nbsp;</p>
<ul>
<li><strong>API</strong>
<p style="padding-left: 25px;">ここでは簡単にするためにODEのAPIを元に，超簡単なAPIを作成しました．ただし、ODEのAPIのように細かいことはできません。</p>
<ul>
<li><strong>void dmInit()；<br />
</strong>シミュレーションを初期化します．</li>
<li><strong>void dmCreateSphere(dmObject *obj, double p[3], double R[12], double m, double r, double color[3]);<br />
</strong>球を作成します．引数のp[3]は位置(x,y,z)[m]，R[12]は姿勢（回転行列）, mは質量[kg]，rは半径[m]，color[3]は色(赤，緑，青各成分、値は0以上1以下）です．</li>
<li><strong>void dmWorldStep();</strong><br />
シミュレーションを１ステップ進めます．</li>
<li><strong>dmDraw(dmObject obj);<br />
<span style="font-weight: normal;">引数のオブジェクトobjを描画する．<br />
</span> </strong></li>
</ul>
</li>
<li><strong>ソースコード</strong>
<ul>
<ul>次に、詳しいコメントのついたソースコードを以下に示します。main関数から読んでください。</ul>
</ul>
<pre class="brush:cpp">/* step4 リンゴ（林檎）の落下 　*/
#include "dm4.h"

dmObject apple;  // リンゴ

void command(int cmd)
{
   printf("Input %d", cmd);
}

void simLoop(int pause)           /***  シミュレーションループ　***/
{
    dmWorldStep();   // シミュレーションを１ステップ進める
    dmDraw(apple);   // リンゴの描画
}

int main()   /*** main関数 ***/
{
    double p1&#91;3&#93; = {0.0, 0.0, 2.0}; // 位置 &#91;m&#93;
    double R&#91;12&#93; = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢（回転行列）

    double red&#91;3&#93;    = {1.0, 0.0, 0.0};　// 赤色
    double r = 0.2, m = 1.0;  // 半径&#91;m&#93;,質量&#91;kg&#93;

    dmInit(); // 初期化
    dmCreateSphere(&amp;apple, p1, R, m, r, red); // 球の作成
    dmLoop(800, 600, simLoop, command);  // ウインドウの幅，高, ループ関数，コマンド関数
    dmClose(); // 終了処理

    return 0;
}</pre>
<ul>
<li>これは赤い玉の自由落下のプログラムです。まず、dmInit()でシミュレーションを初期化します。</li>
<li>次に物体を作ります．球を作るAPIはdmCreateSphere()です．</li>
<li>物体の生成が終わったら、次はシミュレーションを１ステップ進めます。dmLoop()の中身はwhileループになっていて、繰り返しsimLoop関数とキー操作可能なcommand関数を呼び出しています。</li>
<li>お次は物体の描画です．dmDraw(apple)で落下する球を表示しています。dmDraw()の引数は表示したい物体をいれてください。</li>
<li>最後にシミュレーションをdmClose()で終了します．なお、小文字のdmで始まる関数は私がこの講義用にODEのAPI(application interface)を元に作成したものです．</li>
</ul>
</li>
<li><strong>ホームワーク４</strong>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2011/01/step4-1101201.zip">step4-110120.zip</a>をダウンロードして実行しよう！</li>
<li>次のAPIを使い黄色のボックスを位置p[3]={0.0, -1.0, 2.0}に作成し，落下させるプログラムを作ってください．
<ul>
<li>void dmCreateBox(dmObject *obj, double p[3], double R[12], double m, double side[3],  double color[3]);</li>
<li>物体 obj, 位置　p[3], 　姿勢（回転行列）R[12],  質量　m, サイズ(x,y,z) side[3], 色　color[3]</li>
<li>なお、回転行列は3&#215;3行列ですが、ODEでは高速化のために3&#215;4行列として各行の最後に0を追加しています。</li>
</ul>
</li>
<li>今度は赤色の円柱を位置(0.0, 1.0, 4.0)に作成し，落下させなさい．
<ul>
<li>void dmCreateCylinder(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);</li>
<li>物体 obj, 位置　p[3], 　姿勢　R[12],  サイズ sides[3], 半径 r, 長さ l,　質量　m, 色　color[3]</li>
</ul>
</li>
<li>最後に，青色のカプセルを位置(-1, 0, 2)に作成し，落下させなさい．
<ul>
<li>dBodyID  dmCreateCapsule(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);</li>
<li>物体 obj, 位置　p[3], 　姿勢　R[12],  サイズ sides[3], 半径 r, 長さ l,　質量　m, 色　color[3]</li>
</ul>
</li>
</ol>
</li>
</ul>
<p>&nbsp;</p>
</div>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9344.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9344&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9344.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9344.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶC言語 [Step3：switch文]</title>
		<link>http://demura.net/9ode/9338.html</link>
		<comments>http://demura.net/9ode/9338.html#comments</comments>
		<pubDate>Thu, 15 Dec 2011 04:53:33 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9338</guid>
		<description><![CDATA[Step2でfor文を使った繰り返しを練習しました。ここではswitch文を使ったキー処理の方法を学びます．キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力によりレーザービームを発射したり [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7432" class="wp-caption aligncenter" style="width: 460px"><a href="http://demura.net/wordpress/wp-content/uploads/2010/07/step3a.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2010/07/step3a.jpg" alt="step3サンプルプログラムの実行画面" title="step3a" width="450" height="384" class="size-full wp-image-7432" /></a><p class="wp-caption-text">step3サンプルプログラムの実行画面</p></div>
<p>Step2でfor文を使った繰り返しを練習しました。ここではswitch文を使ったキー処理の方法を学びます．キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力によりレーザービームを発射したり，車を操縦しますね．switch文を使って，キーボードからのキー入力を処理する方法を学びます． <span id="more-9338"></span></p>
<ul>
<li><strong>switch文とキー処理</strong></li>
</ul>
<p><strong> </strong> 新しく登場したのが11行目のcommand関数です．これは，キーボードからのキー入力を引数cmdとして受け取ります．このサンプルプログラムではswitch文を使いキー入力の値に応じて分岐させ違う処理をさせています．zが入力されると初期位置のz成分を0.1m増加させます．つまり，zキーを押すたびに直方体全体が上空へ上がっていきます．その下のbreak文は忘れないでください．忘れるとdefaultに対応する21行目の文を実行し常にInput z keyと表示されてしまいます．</p>
<p>その他のキーを入力するとdefaultにある&#8221;Input z key&#8221;という文字列がコンソール画面に表示されます． なお、switch文の変わりにif文でもできますが、キー入力が増え分岐が多くなるとswitch文の方がすっきりした読みやすいプログラムを書けます。</p>
<ul>
<li><strong>乱　数</strong></li>
</ul>
<p><strong> </strong> ODEとは関係ありませんがゲームやシミュレータでは乱数も活躍します．乱数を使う場合は&#8221;stdlib.h&#8221;をインクルードします．ここではtime()関数も使っているので&#8221;time.h&#8221;もインクルードしています．</p>
<p>乱数を使用する場合は、まず，main関数の42行目にあるように乱数を初期化します．そのために<strong>void srand(unsigned seed）</strong>関数を使います。引数seedは乱数を発生させる種を入れます．それが同じ値の場合は，常に同じ乱数系列が発生します．srand(time(NULL))は実行時に乱数の種を変更する一般的な方法です． ちなみに、time(NULL)は万国標準時１９７０年１月１日からの経過秒数です。大きな数値になるのでパット見意味がわからりづらいですね．</p>
<p>実際に乱数を発生させているのがsimLoop関数の30行目のrand関数です．rand関数のプロトタイプ宣言は<strong>int rand(void)</strong>なので引数は取らず，int型の値を返します．RAND_MAXは乱数の最大値なので，30行目は0以上1以下の乱数を発生させ，それを赤成分の値に代入します．なお，rand()とRAND_MAXの割り算をするとint型になり小数点以下が切り捨てられるのでfloat型にキャスト（型変換）することを忘れないようにしましょう．これによって，表示されている直方体（以下ボックスと表記）の赤成分の色だけが変わることになります．</p>
<p>今回は２つのことを学びました．特に乱数はゲームで使うと非常に面白いゲームになるのでしっかり覚えておきましょう．</p>
<p style="text-align: right;">でむ</p>
<pre class="brush:cpp">/* step3 キー入力　switch文　*/
#include "dm3.h"
#include &#60;time.h&#62;
#include &#60;stdlib.h&#62;

// Rは回転行列の各要素が格納される配列. 4, 8, 12番目の要素は高速化のために常に０
double R&#91;12&#93; ={1,0,0,0, 0,1,0,0, 0,0,1,0};
double p&#91;3&#93; = {0.0, 0.0, 0.05};   //　重心の位置
double p&#91;3&#93; = {0.0, 0.0, 0.05};   // 位置(x,y,z)&#91;m&#93;
double sides&#91;3&#93; = {0.1, 0.1, 0.1}; // 直方体のサイズ(x, y, z)&#91;m&#93;
double start_x = 0.0, start_y = 0.0, start_z = 0.0; // 初期位置

void command(int cmd)
{
    float xyz&#91;3&#93;, hpr&#91;3&#93;;
    switch (cmd) {
        case 'z':
            start_z += 0.1;
            break;
        default:
            printf("Input z key \n");
    }
}

void simLoop(int pause)        /***  シミュレーションループ　***/
{
  int i, j, num = 11;          // 直方体の数
  static float red = 0.0, green = 0.0, blue = 0.0; // 赤，緑，青成分

  for (i = 0; i &#60; num; i++) {
      for (j = 0; j &#60; num; j++) {
        red = (float) rand()/RAND_MAX;   // 赤成分を乱数で決定
        dsSetColor(red, green, blue);    // 色の設定
        p&#91;0&#93; = start_x;                  // 位置のx成分
        p&#91;1&#93; = i * 0.2 - 1.0  + start_y; // 位置のy成分
        p&#91;2&#93; = j * 0.2 + 0.05 + start_z; // 位置のz成分
        dsDrawBox(p,R,sides); // 直方体の表示
      }
  }
}

int main()         /*** main関数 ***/
{
  srand(time(NULL)); // 乱数の初期化
  dmLoop(800, 600, simLoop, command);  // ウインドウの横，縦，シミュレーション関数，コマンド関数
　return 0;
}</pre>
<p><strong>ホームワーク３</strong></p>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2010/12/step3-101217.zip">step3-101217.zip</a>をダウンロードして実行しよう．</li>
<li>jキーを押すと右，fキーを押すと左にボックス全体が移動するようにしよう．</li>
<li>３行（ｊの値が２）、４列（iの値が３）目のボックスだけをキー操作でx, y, z軸の正負方向へ移動できるようにしよう．つまり，６個のキーを割り当てる必要があります．simLoop関数の中でif文を使う必要があります．</li>
<li>まず、ボックスを全て白色に変更し，乱数を使い１つのボックスだけ赤色に描画するプログラムを書こう．</li>
<li>まず、ボックスを全て白にし、数字０を赤いブロックを複数使い電光掲示板のように表示するプログラムを書こう．</li>
<li>[発展問題」　まず、ボックスを全て白にし、９から０までの数字を赤いブロックを複数使いカウントダウン表示する電光掲示板を作りましょう。０から９までの数字を表示する部分はそれぞれ関数にすること。</li>
</ol>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9338.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9338&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9338.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9338.html" />
	</item>
	</channel>
</rss>

