2009年11月09日

【講座】「教えて!おにたま!!」

<チャーリ さんからのおたより>

またまた、物好きな60過ぎのおっさん「チャーリー」の質問です。
WEBサーバー上のMySQLへPHPスクリプトなどを介さずに
直接HSP3.2で、接続して如何にしてクエリを投げるのかが
いまいち分かりません。
PHPスクリプトからとか、ローカルマシンのMySQLには接続できて
操作できるのですが、WEB上の別なスクリプトを介さないで、
HSP3.2だけで可能なのでしょうか?
”sockopen ”でサーバーまでは接続できるのですが、接続して
下位ディレクトリへ移動する方法やパスワードやクエリを
MySQLに渡す事はHSP3.2だけでできますか?


<こたえ>

以前にもMS Accessとの連携などでご質問を頂いたチャーリさん、
60歳過ぎてなお精力的に活動されていて素晴しいですね。
さて、データベースへの接続についてですが、HSPではhspdbという
プラグインがあります。これは、ODBCという仕組みを通して各種
データベースを操作するもので、MySQLに限らず多くのソフトを
サポートしています。
hspdbの詳しい使い方は、マニュアルを参照してもらうとして、
その準備としてODBC接続用のDSN(データソース)というものを
用意する必要があります。これは、Windowsのコントロールパネル
から、コンピューターの管理を開いて「データソース(ODBC)」
を選択すれば編集を行なうことができます。
たとえば、ここで「test」という名前のDSNを作成した場合は、
以下のスクリプトで接続させることができます。

#include "hspdb.as"
dbini ; ODBC環境の初期化
if stat : dialog "ODBC環境がありません。終了します。("+stat+")" : end
dbopen "DSN=test" ; DBと接続
if stat : dialog "DB接続できませんでした。終了します。("+stat+")" : end
dbclose ; DBとの接続を切ります

クエリを送る場合は、dbsend命令を使用することで、SQL文字列を
そのままスクリプトで指定することができます。
さて、サーバーへの接続方法ですが、ODBCの場合はこのDSNを作成
する段階で接続先のサーバーと、ユーザー名、パスワードなどを
あらかじめ入力する必要があります。
MySQLに接続するドライバ(MyODBC)では、Connection Parameters
という項目でそれぞれ指定することができるはずです。
これで、離れた場所にあるサーバーであっても、ネットワークを
経由して直接HSPから制御を行なうことが可能です。
ただし、すべてのサーバーをこれでコントロールできるという
ことではありません。WEBサーバーとして一般に公開されている
場合、セキュリティのためデータベースに直接接続するための
ポートは閉じられていることが多いです。
その際には、やはりPHPやPerlなどのCGIを通してデータベースの
アクセスを行なうしかありません。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 17:34

2009年07月25日

【講座】「教えて!おにたま!!」

<チャーリー さんからのおたより>

60過ぎのおっさんですがHSPプログラムは楽しく使わせて貰っています
今までにRS232C操作ででGPSソフトや、エクセルとの連携で
個人的な趣向のソフトを作って楽しんでいますが
マイクロソフトのアクセスのテーブルデーターをHSPと連携させたいのですが
できないものでしょうか?

<こたえ>

お便りありがとうございます。
ご高齢にも関わらず、HSPで機器の制御とか、エクセルの連携とか…
なかなか最先端の開発をされていますね。素晴しいです。
さて、マイクロソフトアクセスとの連携ですが、メルマガでは過去に
エクセルとの連携を取り上げたことがあります。
http://hspcenter.com/hsptvm/archives/2006/10/hsp3_11.html

基本的には、これに近い方法でAccessをコントロールすることが
可能です。ただ、AccessはExcelよりも機能が豊富で複雑なため、
私自身も詳しいところまでは試していません。
以下のサイトによれば、AccessのプログラムIDは「Access.Application」
なので、COM経由でアクセスが可能です。
http://support.microsoft.com/kb/210111/ja

VBと同様の方法で、COMのインスタンスを取得していくことで、
データを取得したり、書き込みを行なうことが可能なはずです。

newcom pDoc,"Access.Application"
pDoc("Visible")=1

また、Accessのデータは基本的にデータベースで管理されているため、
SQL経由でのデータ処理が可能になっています。
データベースへの接続は、hspdbプラグインで行なうことができますので、
こちらを使ってみるのも手かと思います。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 01:34

2009年06月10日

【講座】「教えて!おにたま!!」

はじめまして。
累乗を計算してたら、何か挙動がおかしいので困ってます。
HSPで累乗するために hspmath.as のpow関数を使っているのですが、
出てくる値を整数型に変えるとおかしい数になってしまいます。
2の3乗が7、2の6乗が63など・・・。
これは整数型に変えちゃだめなんですか?
int関数で変換しなくても、整数と一緒に計算しただけで
勝手に整数型になっておかしい数字になります。
計算がくるって正しい結果が出せません;
これはいったいどういうことか教えてくださいorz
10進数を2進数につたないながらも変換しようとしていました。。

<こたえ>

お便りありがとうございます。
HSP3の実数計算は、64bitの精度を持っていますが、計算の内容に
よっては誤差が出てしまうことがあります。
hspmath.asのpow関数は、累乗を求めるものですが、近似値を得る
ようになっているため、整数に変換した時に誤差が出ることが
あります。以下のスクリプトを実行してみてください。

#include "hspmath.as"

a=pow(2,3) ; 2の3乗を求める
mes a ; そのまま表示
mes strf("%.16f",a) ; 小数点以下16桁を表示

最初は、計算結果が代入されている変数の内容をそのまま表示
しています。この時は「8.0」ですが、実際に小数点以下の細かい
部分まで表示してみると、「7.9999...」という数値になっています。
int関数などで整数に変換すると、「7.9999...」の整数部分である
「7」だけを取り出してしまい、誤差が出ることになります。
ただ、そのまま表示した場合は、「8.0」になっている点が不可解です。
通常の実数表示では小数点以下6桁程度までを取るようになっていて、
その際に有効な桁から下は四捨五入しているため、このような結果に
なっているのです。
もし、この四捨五入された値で整数に変換したい場合は、一度
文字列型に変換してから、再度整数値に戻すといった方法を取ることも
可能です。

#include "hspmath.as"

a=pow(2,3) ; 2の3乗を求める
st=str(a) ; 文字列に変換
mes int(st) ; 整数として表示

ところで、10進数を2進数に変換という目的であれば、実数で計算を
行なう必要はないので、最初から整数ですべて行なうのも手だと
思います。また、2のn乗を計算するのであれば、演算子「<<」を
使うことができます。
以下は、2のn乗を求めるスクリプトです。

repeat 9
n=cnt
val=1 ‹‹n ; 2をn乗する
mes "2^"+n+"="+val
loop
stop

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 01:41

2009年02月25日

【講座】「教えて!おにたま!!」

<松尾 さんからのおたより>

先日は、n88-basicで言うところの「line input」に
変わるノートパット命令による代替え方法を教えていただき、
あらゆる方向に応用でき、感謝しています。
今回は、instr関数やstrmid関数中で、chr$("&h"22)や、
chr$("&h"0d)といった、文字列では指定できないキャラクタ
コードを指定するには、どのようにすればいいのか
教えてください。
また、「mid$("abcdef",2,3)="123"」といった、文字列の1部
書き換えはどのようにすればいいのでしょうか。


<こたえ>

またまた、n88-basicなど昔のMicrosoft系BASICにあった
文字列操作に関連した質問ですね。chr$というのは、HSPには
存在しない文字列関数で、指定したコードの文字列に変換する
機能を持っていました。
さて、HSPに限らず最近の言語では、キーボードから直接入力
できない文字をエスケープシーケンスという手法で記述する
ことができるようになっています。
chr$関数の中に入るコードは、ASCIIコードと呼ばれていて、
「chr$(&H22)は「"(ダブルクォーテーション)」」、
「chr$(&H0d)はCR(改行)」ということになります。

http://ja.wikipedia.org/wiki/ASCII

HSPでこれらの文字を入力する場合は、
「\"」がダブルクォーテーション、「\r」が改行になります。
(Windowsの改行では、「\n」の方が多く使われています)
ただし、この記述方法だと、chr$のように自由なコードを
指定することはできません。
自由なコードを記述する場合は、poke命令を使って直接
文字列が格納されているメモリを書き換えることで同様の
処理になります。

s="*":poke s,0,$60
mes s

これを応用すれば、文字列の1部を書き換えることも可能です。
文字列の操作や格納方法については、付属するドキュメント
hsp3str.htm(HSP ver3文字列のひみつ)に情報が書かれている
ので、参考にしてみてください。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 02:26

2008年12月18日

【講座】「教えて!おにたま!!」

<松尾 さんからのおたより>

はじめまして。
hsp3.1を使用させていただいて間もないのですが、現在
簡易mlソフト作りにチャレンジしています。
しかしながら、hspにはpop3サーバーから送信されてくる
データを、1行ごと、つまり改行マークまでを1ラインとした、
例えばn88-basicでいうところの「line
input#?」のような関数がなく、困っています。


<こたえ>

line inputステートメントは、今ではあまり知られていないと
思いますが、n88-basicなど昔のMicrosoft系BASICにあった
定番のストリームアクセス命令ですね。懐かしいです。
さて、HSPではネットワークやシリアル通信からのデータを
1行単位で取ってくる命令を標準では用意していません。
しかし、命令の組み合わせで同様の処理は実現可能です。
主に以下の方法が取れると思います。

・変数バッファ(メモリ)に受信データを一気にすべて読み込んだ
後に、テキストを1行づつ取り出す
・受信データを1文字(1バイト)づつ改行コードが出てくるまで
取り出してから、処理を行なう

上の方法であれば、データを取り出した後、メモリノートパッド
命令(noteselやnoteget等をヘルプで検索してください)か
getstr命令により1行単位で取得することができます。
サンプルのnote1.hspやnote2.hspも参考になるかと思います。
下の方法は、シリアル通信のサンプルで行なっています。
「sample/hspext/terminal.hsp」を参考にしてみてください。
ソケット通信の場合は、受信部分をsockgetc命令で行なうと
考えるといいでしょう。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 06:28

2008年11月18日

【講座】「教えて!おにたま!!」

私のPCは物理メモリを3GB積んでいて,その全体物理メモリを
調べるため

mes "全体物理メモリ:"+sysinfo(34)

を実行したのですが,

全体物理メモリ:2147483647

と,表示されました.
本来なら,HSPの整数は符号付32bitだから$80000000でオーバー
フローして,$C0000000 = -1073741824が表示されるはずなのに,
$7fffffffff = 2147483647でカウントストップしているよう
です.
2GB以上の物理メモリサイズを正しく取得するにはどのように
すれば良いのか教えてください.
もしかして,WinAPIの仕様なのでしょうか?


<こたえ>

結論から言うと、sysinfo(34)で得られる物理メモリのサイズは
WinAPIの仕様により2GBまでとなっています。(2GB以上のメモリが
搭載されている場合は、すべて2GBとなります)
これは、HSP3内部で使用しているGlobalMemoryStatusという
APIの制限によるものです。
ただし、WinAPIで用意されているGlobalMemoryStatusExという
関数により、2GBを超えるメモリ情報を取得することができます。
以下がサンプルスクリプトになります。

; 2GB以上のメモリを取得する(NTカーネル専用)
#uselib "KERNEL32.DLL"
#func GlobalMemoryStatusEx "GlobalMemoryStatusEx" var
dim buf,16
buf(0)=64
GlobalMemoryStatusEx buf
mes strf("メモリ容量(下位)=%x",buf(2))
mes strf("メモリ容量(上位)=%x",buf(3))

この方法により、2GBを超える環境での物理メモリ容量や、使用
している量などを正確に知ることができます。
なぜHSP3でこの方法を使用していないのかと言うと、
このAPIは、Windows95や98系のカーネルでは使用できないため
互換性を重視した形になったと考えてください。
メモリの搭載量は、今後どんどん増える傾向にあるので、
将来的には改善していくべきですね。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 01:22

2008年08月01日

【講座】「教えて!おにたま!!」

<高田 さんからのおたより>

現在HSP3では、通常、どうも小数点以下6桁まで計算する
ようですが、これを、小数点以下8桁まで計算させることは
できるのでしょうか。
(ヘルプファイルのどこを参照すればいいのでしょうか。)

実は、レンズ設計を勉強中で、光線追跡の計算をHSPで
やらせたいと思っています。そのため出来れば、8桁まで、
なのですが、6桁まで、ということでしたら、それはそれで
ある程度使えるとは思いますが・・・。
よろしくお願いします。


<こたえ>

お便りありがとうございます。
HSP3の実数計算は、64bit浮動小数点という形式を使って
行なわれています。これは、小数点の位置を数値ごとにうまく
ずらすことで、非常に小さな小数値も、巨大な数でも表現
することができる頭のいい方法です。
で、通常の表示では確かに小数点以下6桁までしか表示
されていません。たとえば、以下のスクリプトでは
「1÷3」ということで「0.333333」が表示されます。

a = 1.0 / 3
mes a

しかし、内部ではもっと細かい値まで計算されています。
strf関数を使って、表示桁数を指定してみましょう。

a = 1.0 / 3
mes strf("%.16f",a)

この例では、小数点以下16桁まで表示しています。
さっきも書いたように、浮動小数点は小数が移動するので、
必ず小数点以下16桁が有効になるわけではありません。
たとえば、「10.333」のように整数部分が2桁ある場合は、
小数点以下の桁数もそれに引きずられて少なくなります。
ただ、小数点の位置は別にして、だいたい15~16桁程度まで
計算することができるようになっています。
通常、6桁までしか表示していないのは、あまりにも桁数が
多い時にかえって読みにくくなるのを抑えるためと、それほど
小数点以下の精度が必要な場面が少ないと考えているためです。
内部では、もちろん高い精度で計算されています。あくまでも、
表示の時に少ない桁数になってしまっているだけです。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 11:46

2008年07月20日

【講座】「教えて!おにたま!!」

こんにちわ~
ちょっと困ったことが起きたので質問させてください。
実は、パソコンの調子が悪く、作成ソフトデータ等を保存して
いたのですが、いらなくなったCD-Rを破棄したところ、そのCD-Rが
最新版だったと気がつき、作成ソフトデータの一番新しい物を
なくしてしまいました。。。。
Vector登録しているので、実行ファイルは残っていますが。。
そこで、実行ファイル(exe)からHSPファイルを抽出することは
可能でしょうか?
なにか方法があったら教えていただければ幸いです><。。

<こたえ>

お便りありがとうございます。
自分が作成したソーススクリプトが消えてしまうのは、
ショックなことだと思います。何とか復元したい気持ちは、
よくわかります。
ただ、実行ファイルからHSPのソースを抽出する方法があったと
すると、作者以外の誰でもソースを見ることが可能になって
しまいます。こういった問題はデリケートで、ソフトの作者が
見せたくない情報、たとえばシェアウェアであったり、ゲームの
解法につながる大切なデータが含まれていることもあります。
HSP3では、基本的な方針として第三者が勝手にソースを見れない
ことを優先しています。そのため、実行ファイル作成時には、
オブジェクトファイルを暗号化して格納しています。
Vectorに登録されている一部のソフトでは、HSPの実行ファイルに
格納されたデータを抽出したり、ソーススクリプトを復元する
といったものもありますが、現行のHSP3.1の場合で言えば、
それらのソフトで抽出はできないと考えています。
あまり明快な回答ができなくて申し訳ないのですが、
こういった事情があることも理解してもらえればと思います。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 11:42

2008年06月06日

【講座】「教えて!おにたま!!」

<和之 さんからのおたより>

「hspsock」を使っての通信対戦を作ってみたんですが、
どうしてもタイムラグが発生します。仕方ないかと思って、
暇つぶしに市販のゲームをやっていると通信対戦があって
遊んでみました。するとタイムラグがなかったのです、
これはなぜなんでしょうか・・・。
ちなみに予測とかは不可能だと思います・・・。

<こたえ>

お便りありがとうございます。
現在のネットワークゲームは、とても高度な技術によって
作られているものが多いのは確かです。が、ほぼすべての
ネットワークゲームの基盤になっているのは、「ソケット」
と呼ばれるTCP/IPネットワークライブラリであり、
その中身は単純にデータの送受信を行なうだけのシンプルな
構造になっています。「hspsock」もまた、「ソケット」の
ライブラリを使用しており、通信のタイミングや速度で
大きな違いがあるわけではありません。
では、市販のネットワークゲームと何が違うのかと言うと、
おそらく効率的にデータを通信する仕組みではないかと
思います。HSPTV!メルマガの第51号でも、ちょっと触れて
いますが、画面の書き換えスピードに対して通信速度が
追いつかない場合がほとんどです。そこで、通信が遅く
なっても、なるべくゲームがスムーズに進行するような
方法を考える必要があります。
予測とかは不可能と書かれていますが、ある程度予測可能な
動作(たとえば操作を何もしない状態が続く場合など)は
通信を行なわないとか、データが到着していない場合は
問題のない範囲でゲームを継続させる工夫を市販のソフトは
行なっています。
「hspsock」の例で言えば、sockget~系の命令でデータを
受け取るのではなく、sockcheck命令でデータの到着を
確認して、到着していない場合は先に進むなどで画面を
止めないようにする必要があります。
また、交換するデータにも送信した時間(またはフレーム)
などを付加して、現在表示中のフレームとうまく同期させる
必要があるでしょう。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 00:28

2008年04月02日

【講座】「教えて!おにたま!!」

<フルカワ さんからのおたより>

P2P通信のゲームを作るうえ(というより、遊ぶうえ?)で、
どうしてもネックになるのは、ホストを立てるときのポート開放で、
ルーターを利用してネットに繋がっているパソコンでは、
ポートが開放できず、ソケットが接続できません。
ただ、最近のルーターでは、UPnPに対応していて、UPnPを利用
すれば、いちいちルーターの設定を行わずに、簡単にポートが
開放することができると聞きました。
そこで、HSPからUPnPを利用する方法を、教えていただけないで
しょうか?

<こたえ>

お便りありがとうございます。
いきなりハイレベルな質問ですね。通信に詳しくない人には
聞いたことのない用語が出てきて驚くかもしれません。

ネットゲームに限らずインターネット上でデータを交換する場合、
接続の方法で色々と苦労することになります。
これは、主に繋げられる側に要因があります。
たとえば、普通にホームページをブラウザで表示できているのは、
ネット上のサーバーに繋いでページのデータを取得しているから
です。これは、誰でも繋げることのできる場所(これはネット上で
グローバルアドレスを持った場所とも言います)にサーバーが
あるためです。
しかしながら、P2Pの場合や個人でネットゲームを作ったりした
場合には、誰でも繋げることのできる場所はなかなか用意する
ことができません。自分の家をサーバーにしようとしても、
個人で繋いでいる環境はルーターがあったり、IPアドレスが変化
したりといった理由で外からの接続がしにくいのです。
(逆にセキュリティの面では、これは良いことでもあります。)
UPnP(Universal Plug and Play)を使うことで、個人の家から
他の人が繋げやすくするための準備を行なうことができます。

ただし、これはルーターが機能に対応している必要があり、
すべての環境で動作することを保障するものではありません。
そして、この機能によって外からの接続が可能になった場合でも、
最初に接続先を提供するための仕組みを用意してあげないと、
どこに繋げばいいかわからなくなります。

で、質問の件ですが、HSPの標準パッケージでは用意されて
いませんが、以下のURLで公開されているpcbnet2プラグインが、
UPnP NAT Traversalの機能を持っています。
既に開発が終了しているプラグインですが、参考にしてみると
いいと思います。

pcbnet2
http://www.pcbsoft.net/for-hsp-users.html

なお、中央のサーバーが集中してデータを管理する方法
(ユーザーのマシンはサーバーに繋ぐだけ)であれば、上のような
心配はいりません。HSP関連のサービスである、O2システムなど
はこれに該当するため、誰でも接続して遊ぶことが可能です。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 01:20

2008年02月11日

【講座】「教えて!おにたま!!」

<西島 さんからのおたより>

はじめまして
hsp勉強中の西島といいます
hspでフルコンピュータ名を取得することができるのでしょうか?
(Visual Studio C++のEnvironment::UserDomainName命令相当)

<こたえ>

お便りありがとうございます。
フルコンピュータ名というのは、システムのプロパティにある
コンピュータ名タブに表示される内容ということでしょうか。
単純にコンピュータ名(自分のマシン名)を取得するのであれば、
HSPのsysinfo関数を使うことができます。

mes sysinfo(2)

のように書けば、マシン名を表示することができます。
DNS名を含む完全なコンピューター名が必要な場合は、
GetComputerNameEx関数というシステムAPIを呼び出す必要があります。
HSPから呼び出す場合は、以下のように書くことができます。

#uselib "kernel32.dll"
#func global GetComputerNameEx "GetComputerNameExA" int,var,var
cname_size=256
sdim cname,cname_size
GetComputerNameEx 3,cname,cname_size
mes cname

詳しくは、GetComputerNameEx関数についてネットでも調べてみて
ください。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 14:10

2007年11月29日

【講座】「教えて!おにたま!!」

<中島 さんからのおたより>

HSP3.1のHGIMG3についての質問なのですが、
単純なプログラムでも「ツール」-「EXEファイル作成」で
実行ファイルを作成すると、

-->内部エラーが発生しました(1)

というエラーが出てしまいます。
良い解決法があれば、ご伝達よろしくお願いします。


<こたえ>

お便りありがとうございます。
HGIMG3は、HSPに同梱されているプラグインで3D表示やサウンドの
再生などに利用するものです。そして実は、このプラグインだけが
拡張ランタイムと呼ばれる特殊な形式で作られています。
他のプラグインは、実行ファイルを作成した場合に、プラグイン本体
であるDLLファイル(たとえば、HSPDXプラグインならば、hspdx.dll)
を同じフォルダに置かなければなりません。
しかし、HGIMG3だけはDLLファイルを追加する必要なく、単一の
実行ファイルを作成することができます。
拡張ランタイムとは、簡単に言うとHSP本体にプラグインの機能を
すべて組み込んだ形で用意するもので、実行ファイル作成時には、
特別なランタイムファイルというものが必要になります。
そして、「ツール」-「EXEファイル作成」のメニューは、拡張
ランタイムに対応していないため、残念ながらHGIMG3では利用する
ことができません。

結論を言うと、「EXEファイル作成」メニューは使用せずに、
「実行ファイル自動作成」を使ってもらえればと思います。
HSP3以降では、「実行ファイル自動作成」によって実行ファイルを
作成することが推奨されており、「PACKFILE編集」と「EXEファイル
作成」は、過去のバージョンとの互換性を重視して残されている
機能です。

データファイルを実行ファイルに埋め込む場合は、#pack、#epack
命令が利用できますので、マニュアル等も参考にしながら、
「実行ファイル自動作成」の機能を使ってみてください。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 23:58

2007年11月02日

【講座】「教えて!おにたま!!」

<和之 さんからのおたより>

前回、hspsockで3人対戦が可能かどうか聞いた"和之"です。
3人対戦より先に、二人対戦を完璧にしようとしてるのですが、
二つのパソコンで性能が違うらしく、「同時対戦」ができません。
性能の悪いほうに合わせて十分なwait(await)をとるしか
ないのでしょうか?

<こたえ>

お便りありがとうございます。
前回に引き続き、通信対戦ゲームについての質問ですね。

「同時対戦」の前にまず、対戦ゲームについて考えてみましょう。
通信しないで対戦する例として、キーボードから2人分の
入力を受け取って、それぞれのプレイヤーを動かすとします。
キーボードの入力は、getkey命令やstick命令などを使って
すぐに取得することができるはずです。
これが通信対戦となるとどうでしょう。相手側のキーボードの
状態をすぐに知ることはできません。相手側の状態を通信で
送ったとしても、届くのは少し後になってしまいます。
同じ建物内でLANに接続されている場合はまだいい方ですが、
インターネット上など離れた場所では、届く時間が保障されて
いません。
このような環境で、確実な「同時対戦」を行ないたい場合には、
通常の対戦とは作り方をまったく変えなければなりません。
await命令などで、1フレームあたり10~20ms単位で画面を
書き換えているとして、その速さで通信データを送り合うことは、
ほぼ不可能です。
多くの通信対戦ゲームでは、もっと遅い単位でデータを送り
あっています。送るデータも、キーボードの状態などではなく、
ゲームの中で変化するもの、たとえばプレイヤーの座標や、
ゲームの状態などになります。さらにスムーズにゲームを見せる
ためには、届いていないデータを補間したり、次の座標を予測
するなどの技術を使う場合もあります。

もちろん、まずはできる範囲から始めればいいと思いますが、
重要なのは通信に余裕を持たせることと、画面の動きと通信は
別に考えてみるといいんじゃないでしょうか。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 09:36

2007年09月19日

【講座】「教えて!おにたま!!」

<和之 さんからのおたより>
hspsockを使って4台のパソコンを使って4人対戦ゲームを作り
たいんですが、ソケットの使い道などがよくわからず、
2人対戦が限界です。やり方とかってあるんですか?
32人までできるそうですが、二人対戦が限界でした・・・

<こたえ>
お便りありがとうございます。
hspsockは、様々な通信機能を持ったプラグインですが、
基本的には1対1でデータを送受信することを想定しています。
1つのサーバーソケットに対しては、1つのクライアントのみ
接続することができます。
複数の相手と通信を行なう場合には、複数のソケットを
接続する必要があります。たとえば、4人同時に対戦する
場合では、サーバーの役割を行なう側で4つのソケットを
作成しなければなりません。また、データが到着した時にも、
すべてのマシンに同じデータを振り分けて同期する必要があり、
とても複雑なものになります。
一般的なネットゲームでは、ネット上にメインのサーバーを
持っていて、そのマシンがソケットの待ち受けや、データの
振り分けを行なっています。(HSP/O2は、この仕組みを利用
しています。)
メインのサーバーを持たず、ソケット(hspsock)だけで複数人数を
こなす場合は、P2Pと呼ばれる分野に近い構造となります。
hspsockを使って実現することは、不可能ではありませんが、
かなり難しいと考えた方が良いでしょう。
前述のHSP/O2は、HSP3から利用する場合に少し難がありますが、
複数人数で対戦を行なうのに適したプラグインです。
また、hspsock以外にも、pcbnetや、hspsockAなどの通信用
プラグインが存在するので、調べてみては如何でしょうか。

何にしても、二人対戦まで作れたのであれば、大いに可能性が
あると思います。これからも頑張ってください。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 13:52

2007年08月22日

【講座】「教えて!おにたま!!」

<しゃの さんからのおたより>

HSP3.1のpeasマスターしようとしているの
ですが、配列や構造体が使いたいです。
スクリプトパーツで設定しなければダメでしょうか?

<こたえ>

お便りありがとうございます。
HSP3.1から新しく追加されたPeasエディタは、
スクリプトエディタを使わずにプログラムを
作成することができるツールです。
ただ、1つ間違えないで頂きたい点があります。
Peasエディタは決してHSPのスクリプトの流れを
パーツに直して配置することが目的ではないのです。
HSPが持つ命令1つ1つをPeasのパーツに直したと
しても、配置や設定など手間が増えるだけで、
スクリプトエディタ以上に便利にはなりません。

Peasエディタが活躍する場面は、もっと大きな動作
の単位を組み合わせる時だと考えています。
たとえば、「色々な効果とともに絵を出す」とか、
「画面を表示してキーが押されるまでそのまま待つ」
など、再利用できそうな処理のパターンをパーツ
として登録しておき、スクリプトの内容を深く
知らなくてもプログラムとして動作させられることを
目指しています。もっと極端なことを言えば、
シューティングゲームを作るパーツを配置して、
プロパティの設定をするだけでも動くくらいの
手軽さが出て、初めてスクリプトエディタとは違う
使い方が生まれると思っています。

Peasは、まだ生まれたばかりのツールで、色々と
不自由なこともあるかと思いますが、これからも
HSPとともに発展していければと考えています。
質問の答えとしては、Peasのマスターとなるならば、
目的に合ったパーツを自分でも作りながら、
その中で配列や構造体にあたる要素を提供する
のが正しい道だと思います。
これからも頑張ってくださいね。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 00:30

2007年07月25日

【講座】「教えて!おにたま!!」

<せんしゅう さんからのおたより>

今回ベータ版での変更での不具合なもので、ここでお聞きするのは
ご迷惑かと思いましたが、今までのものが動作しなくなってしまい、
それを吟味したサンプルを簡単に用意できないもので、失礼ながら
勉強不足な質問をさせていただきたいと思います。
ベータ版3.1b10より、sortvalが機能しなくなってしまいました。
その行にくるとシステムエラーで停止してしまいます。
実数配列となったということで、それに関わる変数を全て実数に変え、
intの変換もdoubleに変えるという作業も行ったのですが、sortvarの
行で止まってしまいます。そのほか旧バージョンから変更すべき点
などありますでしょうか??

<こたえ>

お便りありがとうございます。
今回は、不具合についての質問ですが、他にも同じような現象で
悩んでいる人がいるかもしれませんので、取り上げてみました。
質問自体は、タイムリーなもので、今まさにHSP3.1の最終的な調整
を行なっているので、リリース版で不具合が起こってしまうと
多くの人が困る可能性もあります。

今回、質問にあったHSPDAプラグインのsortval命令ですが、これは
HSP3.1β10からDLLの定義ファイルである、「hspda.as」が変更され
ています。この、定義ファイルと実際のDLLファイルは、どちらも
バージョンを揃えておく必要があります。
「hspda.as」だけが新しかったり、逆に「hspda.dll」だけが新しい
状態であっても、正常に機能しないことがあります。

せんしゅうさんの場合も同様に、バージョンが合っていない可能性
があります。「hspda.as」ファイルは、HSPがインストールされて
いる場所の「commonフォルダ」内にあります。
ただし、これ以外にもスクリプトのソースが置かれているカレンド
フォルダに「hspda.as」ファイルがあると、そちらが優先されて
しまいます。

以上のことを確認して、もう一度試してみてください。
ちなみに、sortval命令は、整数型(int)でも実数型(double)でも
ソースすることが可能なはずです。

ここで説明した内容は、他のプラグインにも言えることなので、
バージョンが新しくなった時などは注意しておくといいですよ。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 23:41

2007年07月11日

【講座】「教えて!おにたま!!」

<匿名 さんからのおたより>

僕は今、ハノイノ塔の手数プログラムを組んでいます。この公式が
2のn乗引く1なのですが・・・・・・・・。塔の段数がnです。
で、input命令でnに代入させるのですが、その後の累乗の
プログラムがわかりません!!
教えてください。お願いします。

<こたえ>

お便りありがとうございます。
ハノイノ塔に限らず、累乗(xのy乗といった計算)を求めたい時が
あると思いますが、HSP3では標準の演算子には累乗がありません。
そのかわり、便利な数学関数が集められた「hspmath.as」という
モジュールが標準で用意されていますので、これを使って求める
ことができるようになっています。
これを使って、累乗を求めるサンプルは以下のようになります。

#include "hspmath.as"

a=pow(2,16) ; 2の16乗を求める
mes a ; 結果を表示
stop

「pow(x,y)」が「xのy乗」という意味になります。
通常の使用範囲内では、これで問題なく計算できるはずです。
この関数は、整数値を指定しても必ず実数を返すので注意して
ください。
「hspmath.as」には、この他にもπなどのよく使われる各種定数
をはじめ、ラジアンと度の変換や、実数の丸めや四捨五入など
便利な機能が含まれていますので、一度ソースを見てみると
いいでしょう。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 01:27

2007年05月15日

【講座】「教えて!おにたま!!」

おにたまさま いつもお世話になります。

以前hsp3の掲示板で
Unicode文字列の長さを取得するのに、APIのlstrlenを使って

#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var
a = "" : cnvstow a, "abcあいうdef"
mes lstrlenW(a)

と教えられたのですが
別の方にべつにAPIを使わなくても標準命令だけでもできると
言われました。
できればそれにこしたことはないと思ったんですが・・
hspの最新版を使わせていただいていますが
いろいろ探してもUnicodeに関しては"cnvstow","cnvwtos"しか
見つからず古いバージョンでは"llmod.as"、"unicode.as"を
includeして"to_uni""from_uni"という命令が使えるようですが
hsp3ではどうすれば標準命令だけでUnicode文字列の長さを
取得することができるのかわかりません
どこへ行っても教えていただくばかりで恐縮ですが
ご教授お願いできますでしょうか?

<こたえ>

お便りありがとうございます。なかなか高度な質問ですね。
よくわからない人も多いと思いますので、Unicodeとは何かを
簡単に説明しておきましょう。
HSPで文字列を扱う場合には、半角1byte、全角2byteで表わす
シフトJIS(SJIS)というルールが採用されています。
これについては、マニュアルと一緒に同梱されている
「HSP3文字列のひみつ(hsp3str.htm)」という文書でも解説して
います。
コンピューターは、どんな文字列であっても最終的には
1byte=8bit(0~255までの値)のデータとして記憶しています。
しかし、開発環境やOSごとに文字列を表わすルールが色々あって
何かと不便な状態になっています。国ごとに話す言葉が違う
ように、文字列のデータもソフトごとに異なっていると考えて
もらって構いません。
HSP2やHSP3では、日本の古いパソコン時代から採用されている
ルール(SJIS)になっていますが、Visual BasicやJavaを始めと
した最近の言語では、国際的に規格が統一されているUnicode
(またはUTF-16とも呼ばれます)が多く採用されています。
HSP3では、これらの橋渡しをするために、Unicodeとの相互
変換命令(cnvstow、cnvwtos)を標準でサポートしていますが、
strlenやstrmidなど文字列を扱う命令や関数の多くは、
Unicodeを扱うことができません。
UnicodeがSJISと異なっている最大のポイントは、1つの文字を
2byteで表わすという部分です。半角、全角という区別はなく、
すべての文字は2byte(0~65535までの値)で管理されます。
データ領域を余計に使う反面、大量の文字種をシンプルに扱う
ことができます。
APIのlstrlenWは、この2byte単位の文字列の長さを数える関数
ですが、これと同じことをHSPの標準命令で行なうとすると、
以下のようになります。

sdim a,64
cnvstow a, "abcあいうdef"

repeat
if wpeek(a,cnt*2)=0 : len=cnt : break
loop

mes "LEN="+len

残念ながら、一回の処理でUnicodeの長さを調べる命令や
関数は、HSP3にありません。ですから、APIのlstrlenWを
使用すること自体に問題はないと思われます。

日本語を含む文字列データの扱いについては、色々と複雑な
部分もありますが、昔からの積み重ねで現在の形になってきて
います。あせらずじっくりと覚えていってください。
それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 01:05

2007年02月20日

【講座】「教えて!おにたま!!」

ちょっと無理難題(?)にぶちあたったので、質問させて
いただきます。HSP内でFLASHファイル(*.swf)を再生することは
できるのでしょか?
もしHSP単体だけでは再生できなくともなにかDLLなどを追加
することによって再生できるようになったりするのでしょうか?

<こたえ>

お便りありがとうございます。
HSP3では、ActiveXによって各種機能を呼び出すことができます。
FLASHファイルは、基本的にIEコンポーネントなどで表示させる
ことが可能ですが(サンプルのcomtest2.hspなどで試してみて
ください)、直接Flashオブジェクトを利用してswfファイルを
ウィンドウ内で再生することもできます。
以下は、サンプルスクリプトになります。

fname = dir_cur+"\\test.swf"
axobj obj,"ShockwaveFlash.ShockwaveFlash",640,480
obj->"LoadMovie" 0, fname
obj->"Play"

スクリプトで指定している、「test.swf」がファイル名に
なります。適当なswfファイルで試してみるといいでしょう。
この方法であれば、FLASHファイルに含まれる情報の取得や、
任意の再生コントロールを行なうことができます。


<せんしゅう さんからのおたより>

いつもHSPTV!メルマガを楽しく読ませていただいております。
今回テキストファイルを読み込むnotesel の命令を教えて
頂いたのですが、どうした環境からか、MEや98SEでは読めるのに、
XPやウィンドウズ2000では読めずにシステムエラーになる・・・。
っていうことがありました。
9x系とNT系では、何か違いがあるのでしょうか??

<こたえ>

9x系とNT系(2000やXP以降)は、基本的に同様の動作をしますが、
内部の仕組みはかなり異なっています。noteselなど、HSPの命令が
OSによって違う動作をすることはないように作成していますが、
内部の仕組みにより微妙に結果が変わることはありえます。
NT系では、メモリの管理が厳密になっていて、9x系では見逃して
いるようなエラーを報告してきます。
具体的には何とも言えませんが、管理されていないメモリ領域へ
アクセスするなど想定外の処理を行なったのではないでしょうか。
原因がわかる形で短いスクリプトにまとめられたら、また送って
もらえれば詳しいことがわかるかもしれません。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 22:55

2007年01月10日

【講座】「教えて!おにたま!!」

新年明けました。今年もHSPTV!やメルマガともども宜しくお願い
します。HSP3.0のリリースから1年以上が経過して、今年は
いよいよ新しい機能と魅力を持ったアップデートができるよう
頑張りたいと思います。

<オプサン さんからのおたより>

初めまして、『オプサン』と申します。HSPを始めたばかりです。
そこで、質問があります。
HSPの略「ホットスーププロセッサ」ですが、「ホットスープ」は
どうして名前を名づけましたか?教えてください。

<こたえ>

名前の由来についてですが、HSPはもともと「SOUP」(スープ)
という名前がついていたのです。この名前は、Sequential OUtput
control Processorの頭文字を取ったものです。
月日が流れて、バージョンアップとともに頭に「Hot」が付く
ようになりました。このあたりの詳しい歴史は、HSPファンブック
にも載っているので、見てみてくださいね…と宣伝してみたり…。

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 21:55

2006年12月20日

【講座】「教えて!おにたま!!」

「方向転換」を作りたい!!と思っていざ作ろうとすると・・・
無理でした。いつも「マウスのいるところが正面」にする方法が
まったく思いつきません。
さらにgrotate命令の4番目のパラメータの角度指定も
いまいちわかりません。

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
画像を回転させたり、特定の方向に向かせるといった処理を
行なうためには、どうしても三角関数という要素が必要になって
きます。
三角関数と聞くとなんか難しそうに感じるかもしれませんが、
横方向(X)と縦方向(Y)の長さと、その角度をお互いに計算で
出すことができる便利な方法だと思って覚えてしまうのも手です。

HSP3で言うと、角度から長さを出すには、

横方向の長さ = sin(角度)
縦方向の長さ = cos(角度)

のように使います。(長さは-1.0から1.0の範囲で出てきます。)

逆に、長さから角度を割り出すには、

角度 = atan( 縦方向の長さ, 横方向の長さ )

となります。ここで使われる角度は、ラジアンという単位なので、
ちょっと馴染みにくいのですが、円周率(π)の値(3.14…)が
ちょうど180度になると思ってください。

grotate命令の4番目のパラメータには、このラジアンという
単位で角度を指定します。

以下のスクリプトは、マウスカーソルの方向を向かせる処理の
サンプルです。grect命令を使っていますが、角度の指定などは
grotate命令でも同じです。

screen 0,320,240
cx=160:cy=120 ; 中心のX,Y座標
repeat
redraw 0
dir=atan(cy-mousey,cx-mousex)
color 255,255,255:boxf
color 0,0,0:pos 0,0
mes "mouse=("+mousex+","+mousey+") dir="+dir
grect cx,cy,dir,100,100
redraw 1
await 20
loop

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っています。

(おにたま)

投稿者 usuaji : 00:53

2006年11月07日

【講座】「教えて!おにたま!!」

<ゆちボン さんからのおたより>

HSPエディタを自作してみたいと思いActiveBasicでリッチ
エディットを使う、HSPエディタを作ってみました。
それを公開してもいいのでしょうか?

また、ActiveBasicなどの、CやC++以外の言語で作ったDLLもHSP
では使用可能なのでしょうか?
プログラムの際気をつける部分があるのでしょうか?

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
まず、最初の質問についてですが、HSPに関するツールや講座は
自由に公開してもらって構いません。便利なツールが、多くの
人が使えるようになっていれば、こちらも嬉しいです。

2番目の質問はDLLについてですね。DLLは、大ざっぱに言って
しまうと、HSPからgosub命令でサブルーチンを呼び出すのと
同様の仕組みをWindows全体でやってしまおうというものです。
(これを進化させたものがCOMやActiveXにあたります。)

DLLは、基本的にはCやC++から呼び出すために作られていますが、
それ以外の言語で使うことも作成することもできます。

もちろんActiveBasicで作成したDLLやCOMをHSPから利用する
ことも可能です。

気をつける部分として、DLLで提供される関数には、呼び出しの
方法を定めた規約が2種類存在します。HSPで利用できるのは、
stdcallと呼ばれるWindowsで一般的な規約です。ActiveBasicでも、
標準的に使用しているので問題ないと思われますが、他の言語で
DLLを作成する際には、気をつけておくといいでしょう。

それでは、またまた。HSPに限らず、PCのコトやプログラミング関係
どんなことでもお便り待っています。

(おにたま)

投稿者 usuaji : 03:39

2006年10月11日

【講座】「教えて!おにたま!!」

HSP3でシューティング作りに挑戦しているのですが、
左上キーを押しながらショットしようとすると出来ません。
なぜでしょう?

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
シューティングゲームを作っているとのことですが、ショットの
キーと移動のキーは、よく使われるものなので、思ったように
動かすことができないと困りますよね。
同時にキーを押してもダメということですが、これはシューティングに
限らず色々な場面で起こってきます。主な原因は、キーボードの
特性によるものです。パソコンで使用しているキーボードによっては、
同時に2つ、または3つのキーまでしか同時に押していることを
認識できません。これは、「Nキーロールオーバー」とも呼ばれていて、
キーボードの回路の違いによって変わります。
特にノートパソコンでは同時に2つのキーまでしか認識しないことが
多いです。こうしたキーボードで快適にゲームを遊ぶには、
ジョイスティックを接続して使用した方がいいでしょう。
HSPで作成するゲームも、標準で同梱されているモジュール、
「mod_joystick.as」を使用することで、手軽に対応させることが
できるので、試してみてください。

それでは、またまた。HSPに限らず、PCのコトやプログラミング関係
どんなことでもお便り待っています。

(おにたま)

投稿者 usuaji : 00:30

2006年09月28日

【講座】「教えて!おにたま!!」

【講座】「教えて!おにたま!!」

<亀山さんからのおたより>

こんにちは。
HSPでは、グラフ(棒やら線やら)に関する命令はありますか?
家計簿を作りたいのですが、サンプルはありますか?

<こたえ>

家計簿のような計算を行なうプログラムは、HSPで作る場合は、
より自分に合ったレイアウトや、便利な機能を付けるなど
色々と工夫できるところが魅力だと思います。
HSPが持っている描画命令により、線(line命令)や棒(box命令)、
円(circle命令)などを使ってグラフを作ることができますし、
画像を利用して凝った表示をしてみるのも面白いでしょう。
以下のサンプルは、各マスごとの内容を合計するだけの単純な
スクリプトですが、入力枠の配置と、グラフィックの描画を
行なっているので参考にしてみてください。

dim kazu,10
objsize 100,24
repeat 10
input kazu(cnt)
loop
button "合計",*sum
input total
obj_total=stat
stop
*sum
color 255,255,255:boxf
a=0
repeat 10
x=110:y=24*cnt
color 255,0,0
boxf x,y,x+kazu(cnt),y+20
a=a+kazu(cnt)
loop
objprm obj_total,a
stop

それでは、またまた。HSPに限らず、PCのコトやプログラミング関係
どんなことでもお便り待っています。

(おにたま)

投稿者 usuaji : 10:54

2006年09月12日

【講座】「教えて!おにたま!!」

今回は、前回「教えて!おにたま!!」に頂いたお便りについて、
追加情報があったので、それを取り上げたいと思います。

<前回のゆちボン さんからのおたより>

スクリプトエディタでテンキーで「*」を入力すると
2つ「*」が入力されてしまいます。
(「**」←こんな感じです)
これは仕様なんでしょうか?それともバグなんでしょうか?

これについて、せんしゅうさん、兼弘小雪さんなどからも、
同様の現象が起こるという報告を頂きました。
手順としては、「かな」キーや「漢字」キーなどを押して、
日本語を入力できる状態にして、テンキーなどで「*」を
入力した場合に、「**」になってしまうようです。
これは、スクリプトエディタの不具合でしたね。
HSP3のエディタ部分は、独立した部品になっているため、
ちょっとすぐに修正ができるかどうかわかりませんが、
今後修正していきたいと思います。

それでは、またまた。次回はまた、他の質問にも答えていきますよ。
HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り
待っています。

(おにたま)

投稿者 usuaji : 09:10

2006年08月29日

【講座】「教えて!おにたま!!」

HSP3.0でO2システムを利用することはできないのでしょうか?
そのままの形で動かないのは確かなようですが、少しの改造で
動くようになるものなのでしょうか?
また、dllのバージョンアップの予定などはありますでしょうか?

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^

O2システムは、以下のURLで公開されているネットワーク対戦用の
プラグインです。
http://o2.zener.co.jp/

現在のところ、O2システムはHSP2.6以降にのみ対応しています。
ただし、プラグインDLL自体(sephira.dll)は、HSP3からであっても
使用することができます。HSP3に対応していないのは、付属して
いるモジュールの「o2.as」になります。
これは、ユーザーIDの入力やチャットウィンドウなど標準的な
システム表示をサポートするためのものになっています。
HSP3に対応した「o2.as」は、準備中でなるべく早く公開したいと
考えていますが、自信のある人はHSP3対応に修正してみても
いいかと思います。
また、O2のバージョンアップについては、機能の追加も含めて
検討しています。ただ、詳しい予定がまだ立っていない状態なので
もう暫らくお待ち下さい。


<ゆちボン さんからのおたより>

スクリプトエディタでテンキーで「*」を入力すると
2つ「*」が入力されてしまいます。
(「**」←こんな感じです)
これは仕様なんでしょうか?それともバグなんでしょうか?

<こたえ>

スクリプトエディタ自体には、テンキーの「*」が「**」になって
しまう仕様はありません。また、同様の不具合も報告されては
いません。詳しくはわかりませんが、他のソフト、たとえば
メモ帳などで「*」を入力できるかどうか試してみてください。
もし、スクリプトエディタだけで起こるようであれば、HSPの
問題である可能性が高いと思います。再度インストールを行なう
なども試してみるといいかもしれません。

それでは、またまた。
HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り
待っていますよ。

(おにたま)

投稿者 usuaji : 23:50

2006年08月01日

【講座】「教えて!おにたま!!」

<姫野さんからのおたより>

あるスクリプトで「プリプロセッサ命令」が書かれている行の
コメントに「¥」マークが入っていました。
この「¥」マークをはずすとエラーになってしまいました。
まだまだ初心者の域をでないまま「プリプロセッサ命令」を
よくわからないまま使っているせいだと思いますが、
コメントに「¥」マークがあるかなしかで、動いたり、
動かなかったりするのがよくわかりません。

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
「プリプロセッサ命令」というのは、最初に「#」の記号が入っている
命令のことで、1行に1つしか書けないなど通常の命令とは使い方が
異なっています。
どうして、このような分かり難い仕組みになっているかと言うと、
命令を実行するタイミングが違うからなのです。普通の命令は、
スクリプトが上から順番に読み込まれて実行されます。
たとえば、mes命令で文字を表示する前にwait命令があったら、
wait命令で時間を待ってから、mes命令が実行されることになります。
これに対して、最初に「#」の記号が入っているプリプロセッサ命令は、
[F5]キーを押して実行を開始する時点ですでに機能が果たされています。
たとえば、「#include」は、指定したファイルを結合するための
命令ですが、「#include」の位置がスクリプト内のどこにあっても
結合は行なわれます。
さて、コメントにある「¥」マークについてですが、これは
プリプロセッサ特有の行接続ルールが関係していると思われます。
プリプロセッサ命令が書かれた行は、最後に「¥」マークを置くことで
次の行を接続することができます。

#include "hspext.as" ;test\
mes "TEST"
stop

上のようなスクリプトでは、mes命令が無視されてしまいます。
これは、「#include」のある行と次の行が「¥」マークによって
接続されて、

#include "hspext.as" ;testmes "TEST"

のように解釈されているためです。
コメント内の文字列が解釈されるのが特殊なので、戸惑うことが
あるかもしれませんが、仕組みがわかっていれば大丈夫です。
それでは、またまた。
HSPに限らず、PCのコトやプログラミング関係どんなことでも
お便り待っています。

(おにたま)

投稿者 usuaji : 01:34

2006年07月18日

【講座】「教えて!おにたま!!」

<あげなす さんからのおたより>

ちょっとした質問があるのですが、
HSPは今後、AMD64等の64Bit環境やマルチスレッドに
対応する予定はありますか?

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
64Bit環境は、最近サーバーなどの大きなマシンで注目されて
きているものですが、基本的には現在のHSPも含めて32Bit環境用の
プログラムが動作するので、使えないことはありません。
64Bit環境だけで動作する専用のHSPは、現在用意していませんが、
単純にコードを移植して作成することは難しくないので、要望が
多くなれば検討していきたいと考えています。
また、マルチスレッドについてですが、現在は実行時のパフォー
マンス(速度)を考慮して対応の予定はしていません。しかし、
ネットワークのサーバーとして利用する場合など、一部で必要に
なる場面があるのも確かですので、こちらも需要があれば検討する
ことはできると思います。
64Bitやマルチスレッドなどは高度な利用方法だと思われますが、
どのような用途を考えているのか、聞いてみたいところです(^^


今3Dゲームを作ってるのですが…。
3つの動きを組み合わせて攻撃シーンを作っているのですが
最初のモーションを繰り返すだけで終わってしまいます。
3つのモーションを順序よく、そしてできるだけ遅くするには
どうすればよいでしょうか。よろしくお願いします。

<こたえ>

一緒にスクリプトも送られてきていたのですが、長かったので
ここでは省略させて頂きました。
3Dゲームは、HGIMG3プラグインで作っているということなので、
複数の動き(モーション)を順序よく再生する方法について、
ここではお答えします。
アニメーションは、objact命令で切り替えることができます。
「objact オブジェクトID,モーション番号,設定モード」の形で、
モーション番号が0ならば最初に読み込んだモーション、1ならば
その次に読み込んだモーションとなります。d
パラメーターの3番目にある設定モードは、切り替えのタイミング
を指示するためのもので、これが0か省略の時にはすぐに切り替え
られるし、1ならば現在のモーションが終了してから切り替える
ことになります。
このようにobjact命令では、2つのモーションをつなげて再生する
ことが可能です。しかし、3つのモーションをうまくつなげるには
どうしたらいいでしょう?
その時は、getanim命令を使って自分で切り替えのタイミングを
調べるしかありません。「getanim 変数,オブジェクトID,1」の
ように指定すると、オブジェクトのモーション再生が終了して
いるかどうかの結果が変数に代入されます。変数が1になった時に、
次のモーションをobjact命令で切り替えるようなスクリプトを
作っておけば大丈夫です。頑張ってくださいね。

それでは、またまた。
HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り
待っていますよ。

(おにたま)

投稿者 usuaji : 02:40

2006年07月04日

【講座】「教えて!おにたま!!」

<鋼の部隊長さんからのおたより>

Windowのタイトルバー&枠を消すことはできますか?

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
ウィンドウの内容すべてを描画領域にして、タイトルバーや枠など
を表示しないようにするためには、bgscr命令を使います。
bgscr命令のパラメーターは、screen命令と同様になっています。
なので、「bgscr ウィンドウID,Xサイズ,Yサイズ」のように指定
することで、枠のないウィンドウを使うことができます。
ただし、このウィンドウは移動したり、閉じることが大変になって
しまいます。(閉じる場合は、[Alt]+[F4]キーを押します)
そこで、以下のようにスクリプトを組むことで、ウィンドウ内を
ドラッグして移動することができるようになります。
ワンポイントテクニックとして覚えておくといいでしょう。

; 枠なしウィンドウを移動可能にする
bgscr 0,320,240:cls 1
onclick gosub *move
button "閉じる",*owari
stop
*move
if wparam=1 : sendmsg hwnd,$00A1,2,0
return
*owari
end


bsaveでMIDIやWAVE形式で保存するにはどうしたらいいんですか?

<こたえ>

Windowsで使用できるファイル形式は、とても多くの種類があります。
しかし、すべてに共通しているのは、「ファイルである」ということ
です。ファイルとは、好きなサイズの数値データを並べたものに
名前をつけて保存しているもので、どんな形式であるかはその内容に
よって決まるのです。HSPのbsave命令は、好きなサイズで好きな
データの並びを保存することができますが、その内容はスクリプト側で
作成しなければなりません。
こうしたデータの並びを「フォーマット」と呼んでいます。
どのような順番や規則でデータの並びを作るかを定めたものです。
「WAVE形式 フォーマット」のような検索キーワードで、ネット上から
調べることもできますので、色々と参考にしてみてください。
ただし、フォーマットによっては非常に複雑で作成するのが難しい
ものも少なくありませんので、簡単に…とはいかないかもしれません。

それでは、またまた。
HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り
待っていますよ。

(おにたま)

投稿者 usuaji : 00:00

2006年05月24日

【講座】「教えて!おにたま!!」

<ソラシドさんからのおたより>

こんにちは!
3年前からプログラミングにはまった高1のソラシドというも
のです。毎回楽しくメールを読ましていただいています!!
(中略)
ところで、HSPってどうやって作ってるのでしょうか?自分
も何か新しい言語を作ってみたいな~、などと無謀なことを思
いついてしまって、今とても気になっています!!
もしよかったら、新しい言語(HSPに限らず)を作る方法を
取り上げて下さい!!

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
HSPのスクリプトとは直接関係ない質問も大歓迎ですよ。
プログラミングで使うことのできる言語は色々ありますが、実は
コンピューターが理解できる言語は1つしかありません。それは、
マシンコードと呼ばれるもので、人間にはちょっとスラスラ書く
ことが難しい、数字の列が並んだものなのです。
これではあまりに大変ということで、用途に合わせて色々な言語が
作られているわけです。しかし、最終的にコンピューターが理解
できる言語は1つなので、新しい言語が取るべき道は、以下の2つ
になります。

1. 新しい言語をマシンコードに変換する
2. 新しい言語を実行するプログラムを作る

1のことをコンパイラと呼び、2のことをインタプリタと呼んで
います。実行速度としては1の方が速くなります。
1に属する言語としては、CやC++、Active Basicなどがあります。
2は、HSPやJava Script、PerlやPHP、なでしこ等が該当します。
2の言語は、1の方法で作るのが一般的です。
HSPも、C++で作られています。言語を作る方法には色々ありますが、
まずは仕組みなどを自分で考えてみて、実際に挑戦してみること
がいいと思います。専門書も色々あり、大学の学科によっては
学ぶことができますが、興味のあるうちに自分なりに調べたり、
試してみたりすることは無駄になりません。
文字列を解析しながら実行するようなものが作れれば、それは
あなただけの言語と言えるでしょう。
これからも頑張ってくださいね。

(おにたま)

投稿者 usuaji : 23:47

2006年04月30日

【講座】「教えて!おにたま!!」

【講座】「教えて!おにたま!!」

僕はまだ現役バリバリの学生ですが、、
本気で、将来プログラマーの類の仕事に就き
いろいろなソフトウェアをつくりたい、などと思っています。
将来のことを考えたら、やはりHSPに限らず、
C,C++,C#、Visual Basic、Java 等などの
いろいろなプログラム言語にも
挑戦しておいた方がいいのでしょうか?

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
HSPスクリプトに関係のない質問も大歓迎ですよ。
Cafeさんは、学生ということですが、将来のことを今から
考えて目標を持つのは良いことだと思います。
プログラマーの仕事にも色々な種類があって、ビジネスで使う
計算のソフトを作ることだったたり、ゲームだったり、
ネットワークで通信するソフトだったりします。
しかし、どんなソフトでも書いた通り順番に命令を実行していく
という基本はHSPと変わりありません。
プログラム言語は、多くの種類があり得意な分野も違いますので、
何が良いということはありませんが、大切なのは多くのソフトが
どのような仕組みで動いているか、どうしてその仕組みが便利
なのかを知ることだと思います。
外国語と同じで、言語はあくまでも話をする手段であって、
伝える内容が大事ってことでしょうか…。
是非、頑張って夢を実現させてくださいね。

<彦左衛門さんからのおたより>

以前までHSP2.5を使っていたのですが
今まではソースの最後にくると自動的に終了していたのが
3.0ではストップしてしまいます
2.xのように終了させることはできるのでしょうか?

<こたえ>

HSP2.xからHSP3で変わったところの1つが、ソーススクリプトの最後で
自動的に終了しなくなったという点です。
HSP3では、「picload "hsp3ttl.jpg"」のように1行書くだけでも、
その結果を確認することができます。
終了させるためには、end命令を書く必要があります。
end命令が実行されると、実行中のプログラムを終了するので、
スクリプトの中で必要な場所に書いておくようにしてください。

(おにたま)

投稿者 usuaji : 22:51

2006年04月08日

【講座】「教えて!おにたま!!」

<聡さんからのおたより>

今HSPでプログラミングをしているのですが、本に、
「#pack命令を使えばファイルを1つにまとめられる」と書いてあったの
で、DLLと、LZHファイルをパックしたのですが、2つとも呼び出すことが
できません。
そして、そのファイルをプログラムと同じフォルダに置くとうまく実行し
ます。

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^

#pack命令は、実行ファイルの中に指定したファイルを埋め込んで使用す
るためのものですが、いくつか制約事項があります。

結論から言ってしまうと、残念ながらDLLやLZHファイルは埋め込んで使用
することができません。#pack命令で指定できるファイルと指定できない
ファイルの違いは何なのか、少しだけ説明してみたいと思います。

HSPで作成された実行ファイルの中身は、HSPのスクリプトからbload命令
やpicload命令などにより見ることができます。これらの機能は、HSPその
もののシステム(ランタイム)によって実現されています。

その一方、dllやexeといったファイルはWindowsのシステムそのものが持
つシステムによって操作され、HSPのシステム自身では扱うことができま
せん。

Windowsのシステムが読み込むことのできるファイルは、エクスプロー
ラー等で表示される通常のファイルだけで、HSPの実行ファイルに埋まっ
ているものは認識してくれません。テキストエディタに音声ファイルを読
み込ませるようなもので、フォーマットが一致せず開けないわけです。

このような制約から、システム側で扱っているファイルは#packで指定す
ることができません。具体的には、dllやexe、scrといったコードが含ま
れるファイル、midやmp3などMCIで演奏される音楽ファイル、さらに外部
のツールで開かれるファイル全般ということになります。

それでは、またまた。
HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り
待っていますよ。

(おにたま)

投稿者 usuaji : 14:24

2006年03月22日

【講座】「教えて!おにたま!!」

こんにちは。初投稿です!
今年の冬休みにhspでゲームプログラミング!という自由研究を作りま
した!
内容は最初から最後まで初心者用です・・・でも中身は濃いです!
2つ目は、HSP2.6のソースコードをHSP3.0で開くと「代入できない
変数・・・」と出てきてプログラムが実行できません。
どうしたらよいでしょうか?

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^
自由研究! 私にとっては懐かしい響きです。
題材にしてくれて嬉しいです。

HSP2.6のソースコードをHSP3.0で開くと(実行すると)エラーになるという
のは、きっとHSP3.0で使えなくなった命令が書かれているからだと思いま
す。
HSP3.0で使えなくなったと言っても、機能自体がなくなったのではなく、
きっと関数という別な形に姿を変えていることが多いです。
たとえば、HSP2.6にあったrnd命令。これは乱数を発生させて変数に代入
するという命令ですが、HSP3.0ではrnd関数に変更されています。
HSP2.6では、「rnd a,10」という書き方でしたが、
HSP3.0では「a=rnd(10)」というふうに変更しなければいけません。
どの命令が関数になったかは、マニュアル総合インデックスから、
「以前のバージョンからの変更点(アップデートガイド)」(update.htm)
を開くと書かれていますので参考にしてみてください。

それでは、またまた。
HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り待っ
ていますよ。

(おにたま)

投稿者 usuaji : 23:52

2006年03月03日

【講座】「教えて!おにたま!!」

<姫野さんからのおたより>

スクリプトの中で自動的に、「ime」や「capslock」を、
禁止にしたと思うのですが、むづかしいでしょうか?
netでいろいろ検索してみたのですが、
なかなかわかりませんでした。

<こたえ>

「教えて!おにたま!!」へのお便りありがとうございます(^^

残念ながらHSPの命令で直接、IMEを無効にしたり有効にするということは
できません。
ですが、最後の手段としてWindowsのAPIを利用することで実現することが
可能です。
imm32.dllにある、ImmAssociateContextというAPIを呼び出すことで、
IMEの変更を抑制することができます。だいたい以下のようなスクリプト
になります。

#uselib "imm32.dll"
#func ImmAssociateContext "ImmAssociateContext" int,int

a=""
input a:objid=stat ; 入力ボックスのidを調べる
ImmAssociateContext objinfo(objid,2),0 ; objidのIME変更を禁止する

この例では、objidという変数に入っているオブジェクトIDに対して、
IMEの変更を禁止させています。参考にしてみてください。
「CapsLock」の禁止については、もっと複雑になってしまいます。
ここは考え方を変えて、大文字でも小文字でも判定するようにスクリプト
を組んでみるというのは、いかがでしょうか?

それでは、またまた。

HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り待っています
よ。

(おにたま)

投稿者 usuaji : 02:02

2006年02月07日

【講座】「教えて!おにたま!!」

<koheさんからのおたより>

1.HSPで作れるのはパソコンで起動するゲームだけですか?
 (PSのゲームとかはどう作られているんでしょうか。)
2.HSP3の新しい本(3Dについて詳しくのってる)はでませんか?
3.HSPコンテストに中学生コーナーを作って欲しいです!!
4.notesaveでセーブしたデータを暗号化したいのですが…。

是非!教えてください。それがHSP界を発展させる…カモ(笑)


「教えて!おにたま!!」へのお便りありがとうございます(^^
HSPに限らず、PCのコトやプログラミング関係どんなことでもお便り
待っていますよ。

>HSPで作れるのはパソコンで起動するゲームだけですか?
> (PSのゲームとかはどう作られているんでしょうか。)

HSPは、今のところWindowsが動作するパソコンだけで動作します。
PS2とかxboxなど家庭用ゲーム機は、誰にでもプログラムを作れるように
できていないため、HSPで作ったソフトを起動させることはできません。
(家庭用ゲーム機のソフトは、メーカーで決められたツールと言語で
作られるのが普通です。)
しかし、将来もっとHSPが普及してWindows以外の機種でも動作させること
ができるようになる可能性は十分にあります。
また、yukiさんが作成したHSPLetのように、別な機種や言語上でHSPの
ソフトを動作させる試みも始まっています。
http://group-finity.com/HSP/HSPLet/

>HSP3の新しい本(3Dについて詳しくのってる)はでませんか?

HSP3の新しい本は、これからまだまだ出る予定です。
3Dはこれから重要になる要素だし、詳しい解説書が欲しいという人は多いと思っているので、力を入れていきたいと考えています。
また、書籍発売の予定が発表できるようになったら、このメルマガでも
お知らせすると思います。

>HSPコンテストに中学生コーナーを作って欲しいです!!

小学生コーナー(部門)は2005年に新設したんですよね。
中学生はもうオトナの仲間入りかな…ってことで、部門を作りは
しなかったのですが、協賛社が選ぶ賞のいくつかは、小中学生を対象に
しているものもありました。
部門としては作っていませんが、作者が中学生という申告をしている作品
については、将来性なども含めて審査の対象になっていると思ってくださ
い。もちろん要望が多ければ、中学生の部門を新設することも考えられま
すよ。

>notesaveでセーブしたデータを暗号化したいのですが…。

notesave命令で文字列を保存すると、そのままテキストファイルとして
開けることができます。
これを暗号化する場合には、保存する直前で内容をあとで戻せる程度に
改変してやる必要があります。
具体的なスクリプトは、ここでは挙げませんが、本体に同梱されて
いる「HSP ver3文字列のひみつ」というドキュメントを読むと
1文字1文字は、それぞれ数値として表わされているということが
わかると思います。
数値は、自由に計算して別な値に変えることができます。
そして、逆の計算をすればもとに戻ります。
暗号化と言ってもこの仕組みを利用しているだけなので、
挑戦してみてはどうでしょう。

(おにたま)

投稿者 usuaji : 21:32

2006年01月14日

【講座】教えて!おにたま!! 3DモデルZ軸の回転について

質問:
「HGIMG3でポリゴンモデルを回転させたいのですが、
X、Y軸に対してはモデルに対しての回転角度で行うようですが、
Z軸に対しては、一定の方向だけの回転角度で定められているような気が
します。
 理屈がわからないまま、X、Y軸もあわせて適当に変化させると、期待の
方向へ回転はしてるようですが、
これは、3Dの基本的な複雑な知識が必要なのでしょうか?!」

回答:

 HGIMG3を使ってくれて嬉しいです。

 ポリゴン(オブジェクト)の回転については、HGIMGもそうだったのです
が、回転の順番というものが存在します。X,Y,Z軸すべての回転を指定し
た場合でも、必ずZ軸→Y軸→X軸の順番に回転を行なった結果が表示され
ます。
 つまり、先に回転している軸の影響を受けることになるわけです。
 Z軸だけは、他の回転から影響を受けないため、このように見えるのだ
と思います。
 高機能な3Dソフトでは、回転の順番をX軸→Y軸→Z軸やY軸→X軸→Z軸な
ど任意に変更することができるようになっていますが、HGIMGでは複雑に
ならないように考慮してシンプルなZ軸→Y軸→X軸回転を基本にしていま
す。
 以上を覚えておくと、回転の結果が想像し易くなるかと思います。

 がんばってください。

(おにたま)

投稿者 usuaji : 03:35