暇なときに作ったファイルが増えてきたのでサンプルスクリプトとして公開します。 いろいろ研究してみてください。またHSPの掲示板で、私が作ったサンプルも一緒に公開します。 あくまでサンプルですので、プログラミングの練習に活用をして下さい。 下にいくほど最近作ったサンプルです。
エラトステネスのふるいで素数かどうか調べます。peekとpokeでチェックする方法をしています。 メモリの節約のためにbitでチェックするように改造しようと思いましたが、断念しました。 途中でメモリを開放して、巨大な数字を一定のメモリで調べる方法もあるらしいです。
HSPのウィンドウしかmouse命令は使用出来ませんが、 他のウィンドウでもmouse命令でマウスの位置を取得するサンプルスクリプトです。 ScreenToClientを使う方法
算数の問題を本能のまま解くスクリプトを書いた、謎の総当りスクリプトです。
IEのタイトルバーをいじるサンプルスクリプト。レジストリを扱うプログラムの例にどうぞ。
2006年の7月ごろにはやった山田ウィルスを退治するサンプルスクリプト。レジストリを扱うプログラムの例にどうぞ。
HSP3のサンプルスクリプトにある 青い葉っぱのblueleafさんが作った 「ImgCtxによる画像読み込み」をHSP3用に移植したスクリプトをpicloadに置き換える例。但し第二の因数の0に対応していません。
ファイルマンのサイトにあるswfを改造するサンプル。ボタンやリンクなど動画と関係ないオブジェクトを削除します。 結構前に作ったので今は使えないかもしれません。何かファイルの改造パッチを作る例に。
ちょっと変わった方法で、何かのFPSを調べるサンプルです。 方法としてはその1点を監視して、どんな速度で色が変わるか、から測定します。 もうちょっと改良して、ある線上の色を調べると、もっといろいろなソフトでも対応できそうです。
mciを使いCDを連続再生します。例を2つ紹介しています。
MCIを使って音声の位置を調べます。音声と同期の例に。 ただtimeGetTimeの用に連続して再生位置を調べると重くなるので注意してください。
その名のとおりクリップボードにBMPデータが存在しているか調べます。 また存在しているときは大きさも分かります。
gmode 7を使用してアルファ値コピーを行います。 ただ2006年8月現在gmode7にはバグが存在します。 ぷましゃまのHPにgmode7を使用しないサンプルがあります。
Yahoo!に繋げてドルと円のレートを調べます。 2006/6/9現在で動作確認を行っています。今はもう動かない古時計です。
ドットバイパーとよばれる昔からあるゲームのサンプルスクリプトです。
よくある戦車のゲームの弾の管理と発射等の部分のサンプルスクリプトです。 Zで弾がでます。矢印キーでうごきます。戦車ゲーム・弾の管理の例に。
SetWindowPosを使って常に最上面表示される(GSEL *,2)ように起動するサンプル。 このスクリプトではKobarinさんが作った[KbMedia Player]を最前面で起動します。
指定したウィンドウを調べて、存在したら閉じます。 このスクリプトでは、Alt+F4で終了させることが出来なず、またAlt+Tabで最小化も出来ないボンバーマンオンラインを終了させます。
hspsockを使用して、サーバー&クライアント型のチャットを作るサンプルです。 ネットゲームへ発展することも出来ると思います。
VC++6.0 が作ったリスティングファイル(*.cod)からマシン語の記述のみを取り出します。
VC++6.0 のDUMPBINで作成したファイルからマシン語の記述のみを取り出します。
画像を読み込んで、自動的にPaintBBSのパレット、キャンバスの位置を調べて、そこに手書きで出力するサンプルです。 自動的に位置を調べる例、マウスを操作する例として使用して下さい。 中にはtomさんが作ったllmodのマウス、キーボード操作が出来るモジュールを、 HSP3用に書き直したモジュールも含まれています。
弾幕系シューティングゲームの弾管理、発射、描写のサンプルスクリプトです。 処理落ちしたら、描写を中止して処理落ちを行ったフレームの計算のみを行う、という方法で処理落ちを実感させないようなプログラムを組んでいます。 また、256色のパレットの設定や高品質のgrotateを行う命令・関数なども含まれています。 Zキーで弾が出ます。CtrlキーでエスプガルーダIIの様に覚醒します。
GetCursor/GetCursorInfo/DrawIcon のサンプル。全てのPCで正常に動くかどうか不明。
以前、自分がはまってしまったバグ。instrの動作と半角カナの仕様。
ショートカットファイルのリンク先の取得。
減法混色をして絵の具を再現してみます。
IEコンポーネントでステータスバーの情報を取得します。
RegisterAsDropTargetを利用してウィンドウへのD&Dを禁止するサンプルです。 よくネットゲームのアップデートランチャーとかで、IEコンポを使って表示することがありますが、D&Dを禁止したい時に。
objprmを使うとちらつくのでちらつかないようにする方法です。
上のサンプルに、ただ単に数行削除する感じのものくっつけたのです。
二次元での内積と外積を調べます。次のプログラムに関係しています。
実はモジュール変数のサンプルです。
昔作った、可読性が悪いAI付きのシンプルなリバーシです。 GOGO Reversiで実際にブラウザ上で動かせます。 置く場所がないときは自動的にパスされるので、時々順番を飛ばされたと勘違いしてしまいます。 最初に右クリックすることで後手に出来ます。
小数点が入った数字も抜き出します。小数点が2つ以上入った数字も見事に抜き出してくれます。
WindowFromPointを使って、カーソルがボタンの上に乗っているか調べるサンプルです。
コールバック関数が必要なEnumFontFamiliesExを使用したフォントの一覧を作るサンプルです。 関数のポインタが利用できるようになるnaznyarkさんが作ったhpi_exprogctrlでのサンプルと、 無料でダウンロードできるMicrosoft Visual C++ 2005 Express Editionで作った機械語を利用する方法の2種類が含まれています。
メインウィンドウをクリックしても反応しなくなります。 つまりモーダルダイアログのような効果をもつウィンドウを作りたいときのサンプルです。 ※実際のモーダルウィンドウとは異なります。
どんな場合でも、HALFTONEを利用できるとは限らないサンプル。 StretchBltのバグなのか仕様なのか不明。発生条件も不明。
Windows標準についてくるfontview.exeが使っているGetFontResourceInfo(GetFontResourceInfoW)という非公開なAPIを使用して インストールしていないフォント名を取得する。 2008年1月では、2000/XP/Vistaで動作できる。9X系とNTは不明。
以前、処理落ちを見せないSTGを書いてるときに調べたものです。 NtQuerySystemInformationという非公開なAPIを使用してCPU使用率を取得してます。 HSP2掲示板のNAOYAさんの書き込みを参考にしてます。
デスクトップの色のある一点の色を取得します。 hdcDesktopを取得するってやり方は、BitBltを利用してスクリーンショットとかも使えます。 但し、このBitBltを利用したスクリーンショットは、レイヤードウィンドウが取得できなかったと思います。 また、GetPixelはCOLORREF型で返るから、HSPの上でそういう値を使用したいときはpgetより直接GetPixelを使ったほうがいいかもしれないです。
クリップボードの操作と、DIBの色の管理などの応用で、指定した色のBITMAPをクリップボードに入れます。 すぽいと君にも利用しています。色数を32bitにすることで、横のサイズは気にしなくてもいいです。
標準命令のnotemaxを使わずに高速に行数を取得するサンプル。noteadd以外のnote系命令のオマケつきです。 note系は、noteselを使わないといけないから、モジュール内で使うのは危険です。 なので、モジュール内でnote系を使いたい場合は、このサンプルを利用するといいかもしれません。
1つの画面に30fpsのと60fpsを混在させるサンプル。計算速度も0.01秒に1度計算するように調節しています。 左クリックでfpsが下がります。また右クリックでfpsが上がります。 処理落ちを見せないSTGの原理です。
mrefでパレット情報変数を作成して、直接書き換えて実装します。完全にpalfadeの仕様を再現できているはず。
分かりづらい構造体を、C言語で書いたもので、HSPで読みやすいように置き換えて書き換えるサンプル。 バイナリのレジストリを扱うプログラムのサンプルに。
一時的にカーソルを変更したい場合とかのサンプル。 原始的な方法だけど、こんな方法しかないのかな。
キーコードから利用者に分かりやすい名前へ変換するモジュールのサンプル。 これまた原始的なコードです。
最初からフォントが選択済みのフォント選択ダイアログを表示するモジュールのサンプル。 色とかも取得できます。
マウスの位置にあるハンドルを調べるモジュールのサンプル。 「全てのカーソルを指定したカーソルに変更する」を利用して、カーソルを一時変更しています。 また、選択中のウィンドウは、分かりやすいように四角で囲まれます。 一旦ハンドルを取得した後は、出来る限りほかの情報から、再び同じようなウィンドウのハンドルを調べることも出来ます。
複数行の文字をウィンドウに対して、中央や右下などによせて表示させるモジュールのサンプル。 DrawTextを利用しても出来そう。その場合は複数行は無理だけど。
普通にDrawTextWを使ってUnicodeで出力すれば、日本語以外の文字も表示させることが出来ます。 書式を作っておいて、フランス語とかのUnicodeへ変換する関数を作れば楽しそう。
MultiByteToWideCharを使ってUTF-8からUnicode(UTF-16)へ変換するサンプル。
有効なジョイパッド(USBゲームパッド)はいくつあるか、ボタンで何が押されているか調べるモジュールのサンプル。 アナログは対応してません。
SendInputを利用して、getkeyと逆のような命令を作るサンプルです。 スキャンコードの指定はDirectXのゲームに有効なはずです。 また、マウスとキーボードを同じような扱いで指定することが可能です。
よくある、日本語も1文字として何文字かを調べる4種類のサンプルです。
三角関数を利用した色テーブルの円と加算コピーとコントラスト変換、影は適当にフィルタ処理を行って二次元メタボール(メタサークル)っぽいのを描写します。
よくあるginfoを使った方法じゃなくて、GetSystemMetricsを使って調べます。 マウスのクリックが右と左とで交換されているかも調べます。
実行ファイル作成後に、アイコンへドラッグ&ドロップしたショートカットを修正します。 修正は、例えばドライブが"E"から"F"に変わったのに、ショートカット先は"E"を指しているとか、そういうのを修正します。 ショートカットを扱うプログラムのサンプルに。
DOMで、BODY内のスタイルをいじってスクロールバーを消すサンプル。 他に、整形されたソースの表示・リンクの書き換えなどの嫌がらせが含まれています。
掲示板に「VistaにあるAeroみたいに1部分だけ半透明にしたい」というのがあったのでそれを目指して、 実験的にすりガラスっぽいウィンドウを作ってみます。 アルファブレンドウィンドウを使えばSleepを使わずにもっとうまくいくかもしれません。 WindowsNTの2000以上で動作と思います。
bgscrで作ったウィンドウは、一般的にはドラッグでウィンドウを動かしたり、リサイズしたりできません。 しかし、クリックしたときに、別の部分をクリックしたとウィンドウにメッセージを送ることで、可能になります。
通常、HSPで作ったプログラムは、ドラッグでウィンドウを動かしている間・F10キーを押した場合に処理が停止してしまいます。 しかし、タイマーを使えば、停止を防止することが出来ます。