RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/059/
INDEXに戻る

掲載(英語版)の遅れに関して

このコラムの掲載が遅れて申し訳ありませんでした。私はアメリカ男子サッカーチームの前代未聞の大活躍で、観戦パーティが深夜に及んだことのせいにしたいと思います。しかし実際のところは、いくつかの問題が重なって遅れは避けられませんでした。

まずはじめに、私は先週REALbasic Developerマガジンの第1号を脱稿しました(素人用語ではすべてを完了させて、印刷屋にまわすことを意味します) 。何事においてもはじめて公表するときは神経が疲れてイライラするものですが、すべてが極めて順調に進んでいて、創刊号の感想もうれしいものばかりでした。(詳細はこのコラムの終わりのNewsセクションをご覧になってください。)

二つ目に、私は本業の過渡期にあり、現在は後継者を指導しながら、フルタイムの雑誌出版社ソフトウェア開発者になるための準備をしています。

そして最後に、SimplePaintはMac OS Xで互換性のないところが見つかったので、このコラムを発表する前にそれを直しておく必要がありました。それを発見したのが先週だったことから、このコラムの発表を遅らせることに決めました。

これで言い訳は充分ですね。それではREALbasic Universityに入りましょう!

SimplePaint:パート VI

前回のレッスンでは、標準の矢印カーソルを置き換えるためのペイント・カーソルと、たくさんの素敵な効果音を加えきました。今回もその線に沿ったレッスンを続けていきましょう。

カーソルを見つける

とくにコンピュータに慣れ親しんでいない幼い子は、マウスを使うことはやっかいに感じることが多いでしょう。新しいpaintCursorは、従来の矢印カーソルよりは優れていますが、時々小さくて見失うことがあります。そこで斬新なカーソルを見付ける機能を付け加えましょう!

これは簡単な機能ですが、いくつかのステップを要します。カーソルのある位置で、いくつかカラーの円が点滅する簡単な方式をとることにしましょう。それをするため、それぞれの円の描画速度を少しだけずらす必要があります(そうしないと、円の描画速度が速すぎてだれも見分けられません)。そこでpaintWindowdelayメソッドを加えましょう(Editメニューの"Add Method")。

   dim t as integer 

t = ticks
while ticks - t < 2
wend

とても簡単なコードですね。それは完了する前に2tick (1tickは60分の1秒)だけ待機します。ticks関数は、マックが立ち上げられてからのtick数を返すので、つねに増加し続ける数です。もともとのtick値を保存し、それからその差を見るために現在の値で差し引きます。その差が2tickを超えるときに、ルーチンは終了します。

詳細

このコードのバリエーションは、作業時間がどれくらいかかったのかを計測するのに役立ちます。例えば、私はどちらが速いかを見るために、二つの異なる方法で試したプログラムを作成したことがあります。時間について一秒の何分の一であるかを問題にしているだけなので、見た目では判りません。しかし開始時間から呼び出されるまでの差を記録するためにticks関数を使うことで、私はどちらの方法が速いかを確認することが出来ました。これはデバッグや最適化(プログラムをより効率的にする)しているときに使われる一般的なテクニックです。

場合によってticks関数は、あなたの目的に十分には速くないので向かないこともあるかもしれません。その代わりにmicroseconds関数を使えばいいでしょう。それは百万分の一秒間隔で時間を返します!

書き終わったdelayメソッドを用いて、新しいメソッドのflashCursorメソッドを作成することができます。それは次のようなコードになります。

   dim i, x, y as integer 
dim g as graphics

cursorflash.play

x = system.MouseX
y = system.MouseY

g = self.graphics

g.penWidth = 8
g.penHeight = 8
g.foreColor = rgb(255, 255 * .75, 0) // 黄オレンジ色

for i = 1 to 5
g.drawOval(x - (i * 5), y - (i * 5), (i * 5) * 2, (i * 5) * 2)

#if TargetCarbon
Declare function GetWindowPort Lib "CarbonLib" (window as WindowPtr) as integer
Declare sub QDFlushPortBuffer Lib "CarbonLib" (port as Integer, region as Integer)
QDFlushPortBuffer GetWindowPort(self), 0
#endif

delay
next // i
delay
delay

self.refreshRect(x - 25, y - 25, 50, 50)

このルーチンはcursorflashと呼ばれる新しい効果音を鳴らすことに気づいたでしょう。それをインストールするため、プロジェクトにドラッグしてください。

このルーチンの次の部分はsystemと呼ばれるREALbasic関数を使って、グローバル座標系における現在のマウス・カーソルのx/y座標を手に入れます。どうしてそんな方法をとるのですかって?そうですね、カーソルの位置を取得するもうひとつの方法はmouseMoveのようなイベントによるものがあります。しかしわれわれはそのイベントではなく、カスタム・メソッドの中にいます。ユーザがマウスを動かしたときにカーソルの位置を記録するため、mouseMoveイベントにコードを追加することは出来ますが、先の方法は必要なときにだけ座標位置を取得するのでより効率的です。

一度マウス・カーソルの現在の位置を取得したら、次第に大きくなってゆく一連の円を描画します。ここでいくつかのdeclare文がその後に続く、あまり見慣れない#ifコードがあることに気づくでしょう。それは一体なんでしょうか?

ええ、それはややこしいMac OS Xの便利な機能だとわかります。Mac OS Xは自動ダブルバッファリングの機能を持ちます。それはスクリーン上に描画されるどんなものでも、順次に描画していくのではなく、即座にスクリーンに表示されるような画像として保存されることです。利点はちらつきのないアニメーションができる事です。しかしながら、flashCursorルーチンの場合、最後の描画コマンドが実行されるまでは、Mac OS Xはスクリーンを再描画しません。すなわち、カーソルが全く表示されないのです!

これはどう対処すべきでしょうか?REALbasicそれ自身にはビルト・インの解決法はありませんが、OSに直ちにバッファー(これまで描画したもの全て)をはき出すように指示する2つのシステムコールを簡単に作ることが出来ます。それがこのdeclare文でしていることです。#if targetCarbon - #endifの行でこれらのコマンドを保護することで、Carbon (Mac OS X)アプリだけがこのコマンドを使用できるようにします。通常のrefreshコマンドはSimplePaintのMac OSバージョンで動作します。

詳細

この役立つアニメーションのコツによって問題は解決しましたが、これは私の解決策ではありません。それはREAL Sofware社に勤めているJoe Strout氏によるものです。REALbasic Developerの創刊号に掲載されているたいへん素晴らしい記事である"Three Ways to Animate"において、彼はこの問題を説明して、解決策を提案してくれています。

Joe Strout氏の記事は三つの異なったアニメーションのテクニックを挙げて、詳しく述べています。それにはcanvasSpriteSurface、そしてRb3DSpaceが使われます。お互いにそれぞれ長所や短所がありますが、あなた自身でそれらをすべて見つけ出す以前に、Joe Strout氏はすべて調べ尽くしてしまっています。アニメーションに興味があるならば、読む価値は大いにあります。

NoteREALbasic Developerの創刊号は2002年の7月に発売されます。定期購読もできますよ。

一度cursorFlashルーチンを書いたならば、あとはそれをアクティブにする方法が必要です。私はTabキーによって選択できるようにしました。よってkeyDownイベント内で、次のコードを加えてください。

   if key = chr(9) then 
flashCursor
end if

これでどんなときでも、ユーザがTabキーを押したときにカーソルがフラッシュして、カーソルの場所を示すようになります。とてもすてきな機能でしょう?子供はこのかっこいい機能と効果音が気に入るでしょう。

Mac OS X互換性の修正

これは私に、異なるマシーン上で異なるバージョンのMac OS Xを使用しなさいという教訓でしょう。前回のコラムで、私は古いバージョンのMac OS XでSpeechルーチンをテストしました。その後、読者からそれが動作しないとの報告を受けました。"can't find speechLib"エラーが表示されるというのです。

解決策は簡単だとわかりました。私はどうして古いコードが初期バージョンのMac OS Xで動作するのかわかりませんが、これはMac OS X 10.1.5で動作します。

   dim i as integer 

#if targetMacOS then
#if targetCarbon then
declare function SpeakString lib "CarbonLib" (SpeakString as pstring) as integer
#else
declare function SpeakString lib "SpeechLib" (SpeakString as pstring) as integer
#endif
#endif

#if targetMacOS then
i = SpeakString(theString)
return true
#endif

return false 

お分かりだと思いますが、私は始めにMac OSで動いていることを確認してから、Carbonであることを確認しています。仮にCarbonでなければ、"CarbonLib"の代わりに"SpeechLib"を呼び出します。残りのコードは以前のものと同じです。

この問題では失礼しましたが、私たちは常に学んでいます!

今週はここまでです。前回、私はSimplePaintの"代替"バージョンを約束しましたが、それは次週、発表することにします。

今週のチュートリアルの完全なREALbasicプロジェクト・ファイル(リソースを含む)を入手したい場合は、ここからダウンロードしてください。

次週

新しいプロジェクトを開始して、私はSimplePaintエッチアスケッチバージョンを公開します。

News

初期割引価格でREALbasic Developer定期購読が利用できるのは残り数日限りとなりました。2002年の7月1日から始まる一年間(6冊)定期購読の正規通常価格は32ドルとなります。

REALbasic Developerの創刊号はいま印刷に回されていて、7月には配送できるでしょう。定期購読していない人のために、どんな内容になるかちょっとお見せします。これが創刊号のTable of Contentsです。

記事、チュートリアル、コラム、レビュー、ニュースやその他の内容で総勢50ページ以上におよびます。ソースコードも盛りだくさんです(定期購読者はRBDのウェブサイトから完全なRBプロジェクト・ファイルをダウンロードすることができます)。REALbasicファンなら定期購読は不可欠ですね!

Letters

拝啓

これまでのところ、私がRBをはじめて一週間しか経っていないことを認めても、これは私が見つけた中でベストでとても理解しやすいRBガイドです。そしてそれは、何事も理解するという点で私がいまどれほどのところに達しているか伝えてくれます。

私はちょうどチュートリアル11のGenderChangerの大部分を読み終え、そこで行われている事をあいまいながら理解しました。解説は大変すばらしく、私自身はBASICを数年前に始めたところです。しかしながらそれ以来プログラミングの経験はほとんどありません。

いづれにしても、あなたのとっているアプローチは見事で、たくさんの事項が初心者である私の頭の中を駆け抜け、それと同じだけの内容が吸収されていきます。だから全体的に見て、あなたの取り上げたGCチュートリアルでRBの動作やいくつもの属性、コマンドその他を、理解しながら習得するのにとても良いと思います。完成したのちには、GCは私にとってすばらしいプログラムであることは言うまでもありません!=)

そういうわけで、私はデバッグに問題があります(ない人はいないでしょう)。しかしコードのどこが悪いのかに関してRBはいくつかの手がかりを与えてくれ、ロジックや以前のチュートリアルを参照してある程度問題を修正することができました。ただコードの決まったところで"Parameters Expected"エラーが出てしまい、あなたのチュートリアルとコードを二重チェックしましたが、それはまったく同じものでした。RBがエラーと示している行のほかに、何か変更しなければならない点があるのでしょうか?このデバッグはとりわけ苛立たしいもので、私は自分自身、そのノウハウがないことで不安に思います。なにか提案はないでしょうか?

敬具

Keith Bahrenburg

Keithさん、お手紙どうもありがとうございます!

デバッグは非常に複雑な問題です。それをいつか取り上げようとずっと心の奥底に抱いていて、あなたの手紙で再びそれを思い起こされました。とくにデバッグについての一連のコラムを予定に入れ、あなたの状況(その他)を取り上げましょう。標準的なデバッグのテクニックについて明確にして、私自身のデバッグのいくつかのコツを明らかにし、また読者からのヒント集も提供します。

これを始めるために、デバッグのコツを持っている読者はぜひともそれを私に送ってください。シリーズの一部として情報を公開していきます。


RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る