プログラミング

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

aliens.vbs [プログラミング]

2008年5月17日

先日配布の、oyagameを利用したゲーム、aliensのコードを少しばかり解説。

'''''''''''''''''''''''''''''''''''''
' The license of this script is GPL '
'                                   '
'''''''''''''''''''''''''''''''''''''
option explicit
dim SDL,IMG,Mix,i

set SDL=CreateObject("sfcmini.oyagame")
execute SDL.ConstVBS
call SDL.Init(SDL_INIT_EVERYTHING)
set IMG=CreateObject("sfcmini.oyagame")
call IMG.LoadLibrary("SDL_image.dll","IMG_")
set Mix=CreateObject("sfcmini.oyagame")
call Mix.LoadLibrary("SDL_mixer.dll","Mix_")

まず、ライセンスはGPL。これは、CでできたオリジナルのaliensがGPLであることによる。

oyagame 0.0.3.2α [プログラミング]

2008年5月15日

微調整をかねて、SDLのゲームをoyagameに移植。選んだのは、aliensという非常にシンプルなゲーム。ソースコードの大きさが手ごろだったのでこれを選び、VBScriptに移植した。下の画像は、oyagame/VBScriptでの実行画面。

aliens

oyagame 0.0.3.0α [プログラミング]

2008年5月10日

Pygame入門を参考にしながら、どんなことができればSDLがちゃんと使えたことになるか確認しながら開発を行っている。前回の0.0.2.3αでは、ウィンドウが表示できることが分かった。次は、このウィンドウに画像を表示させるというところだろう。

set SDL=CreateObject("sfcmini.oyagame")
execute SDL.ConstVBS
SDL.Init(SDL_INIT_EVERYTHING)
set surface=SDL.SetVideoMode(200,100,32,SDL_RESIZABLE+SDL_HWSURFACE+SDL_DOUBLEBUF)
call SDL.WM_SetCaption("Hello oyagame",0)
set temp=SDL.CreateStructure("SDL_Surface",SDL.LoadBMP_RW(SDL.RWFromFile("block.bmp", "rb"), 1))
set image=SDL.ConvertSurface ( temp, surface.format, SDL_SWSURFACE )
SDL.FreeSurface(temp)
call SDL.UpperBlit(image,image.clip_rect,surface,surface.clip_rect)
SDL.Flip(surface)
set ev=SDL.CreateStructure("SDL_Event")
do
  SDL.WaitEvent(ev)
  select case ev.type
    case SDL_KEYDOWN
      if ev.key_keysym_sym=SDLK_ESCAPE then exit do
  end select
loop until ev.type=SDL_QUIT
WScript.Quit

実行結果:
oyagame

OyaGame 0.0.2.3α [プログラミング]

2008年5月3日

例によって、バックアップの意味もかねて、アルファーバージョンのOyaGameを公開。

実行画面(+ソースコード)はこんな感じ。
VBScript

oyagame 開発中 [プログラミング]

2008年4月28日

先日、ふとしたことからpygameの存在を知り、少しばかり虜になってしまっている。

これは何かと言うと、SDL (Simple DirectMedia Layer)を、Pythonで使えるようにしたものだ。要するに、Pythonでゲームを作成するためのツールである。同様のものに、Ruby/SDLがある。

何が私を虜にさせるかというと、gameという名なのである。20年以上前になるが、GAMEというプログラミング言語があった。BASICと良く似ているが、これが流行した当時、この言語の一番の特徴は実行速度にあった。BASICと比べてとにかく速かったその理由は、コンパイルが可能であったことである。これを使って、MZ-80で、数え切れないほどのゲームを作成したものだ。

SFC mini ver 1.0.5 β [プログラミング]

2008年4月24日

Windows Vista対応の、SFC mini バージョン 1.0.5 ベータをリリースしました。利用の際は、1.0.1に上書きした後にinstall.vbsを実行してください。

とりあえず、ベータバージョンとします。もし不具合がある場合は、お知らせいただければうれしいです。

次の正式バージョンは 1.1.0 の予定で、現在の 1.0.5 のメモリ管理を少し見直し、ヘルプファイルを少し書き直してリリースの予定です。同時に、SFC mini のためのフォーラムを暫定的に立ち上げるかもしれません。

SFC mini ver 1.0.5 βは、SourceForge.jp からダウンロード可能です。

SysAllocString [プログラミング]

2008年4月22日

SFC miniの一部の機能がVistaで動かない件について、一ヶ月悩んだのがうそのような出来事が…。

原因はほぼ一つのことに絞られれていた。SFC miniから文字列を出力した場合、WSHの側でそれを使用した後に例外が出て止まる。mallocやnewやdeleteなどをいくらいじっても駄目。

で、思いついたのが、当然ではあるのだが、Google先生に聞いてみること。今回の件の実装については、"pVarResult->bstrVal="というソースコードが必ずあるはず。で、『"pVarResult->bstrVal"』という検索語で調べてみた。

4つ目に、このブログのエントリーが。これはまずいと思ったけれど、その少し下に、『pvarResult->bstrVal = SysAllocString(wStrValue);』と言う文字が。SysAllocString!!!なんと心地いい名の関数であることか。これだと思い、テストコードに挿入。いとも簡単にエラーが無くなった。1ヶ月悩んだのがまるで嘘であったかのように…。

色々調べると、次のページあたりが参考になりそう。

WinAPI: BSTR
BSTR 用のメモリの割り当てと解放

SysAllocStringを使っていなかったのは規約違反であったということらしい。

これで、Vista対応版のSFC miniの新しいバージョンをリリースするめどが、ほぼついた。

JScriptのFunctionオブジェクト [プログラミング]

2008年4月16日

ネットサーフィンしていて、たまたま見つけた情報。

jscriptで自作COMからイベントを発生させたい - Visual C++/CLI その他 - Visual Studio User Group:
から、抜粋。

なお、関数オブジェクトは、DISPIDが0(DISPID_VALUE)で、名前が"anonymous"というメソッドを持ったCOMオブジェクトのようです。 MSDN内でもまとまった記述はなく、色々と苦労して調査しましたよ。

JScriptの関数もオブジェクトとして扱われていることは知っていたが、これをCOMオブジェクトとして扱うと、上記のようなことになるらしい。お宝を見つけた気がするので、忘れないようにメモ。

VB.NETでのテストプログラムは、こちら。このリンクは、IDispatchの.NETからの呼び出しの参考にもなる。ちなみに、Native C++からの呼び出しの例は、こちら

Vistaにおいて、VBScriptスクリプト中で管理者権限に移行する方法 [プログラミング]

2008年4月12日

SFC mini用の新しいinstall.vbsが完成。

option explicit
Dim wmi,os,value,wsh,sha,sfo
Set sfo=CreateObject("Scripting.FileSystemObject")

do while WScript.Arguments.Count=0 and WScript.Version>=5.7

  'Check if Vista
  Set wmi = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
  Set os = wmi.ExecQuery ("SELECT * FROM Win32_OperatingSystem")
  For Each value in os
    if left(value.Version,3)<6.0 then exit do 'Exit if not Vista
  Next

  'Run this script as admin.
  Set sha=CreateObject("Shell.Application")
  sha.ShellExecute "wscript.exe",""""+WScript.ScriptFullName+""" vista","","runas"

  WScript.Quit
loop

'Current directory may be moved to system32, maybe not.
Set wsh=CreateObject("WScript.Shell")
wsh.run "regsvr32.exe """+sfo.GetAbsolutePathName(WScript.ScriptFullName & "\..\" & "sfcmini.dll")+""""

Vistaかどうかのチェック方法として、『WSHのバージョンが5.7以上』かつ『Windowsのバージョンが6.0以上』で調べている。これに該当する場合、Shell.ApplicationオブジェクトのShellExecuteメソッドを利用して管理者権限でwscript.exeを起動しなおす(このとき、引数に『vista』を指定)。最後に、regsvr32.exeを実行して終了。

QIQを試してみた [プログラミング]

2008年4月7日

今度は、もどきではないクロージャの、PHPでの実装について。

先日の記事、『PHPでクロージャもどき』を書いた後、hsurさんからの指摘などもいただいて色々調べた結果、先の記事の方法ではcreate_functionを使う不便さを除けば、一般的なクロージャの機能は一通りそろえていることは分かった。

一方で、create_functionの不便さはいかんともしがたいと思っていた矢先、知ったのがこれ:
続々・Zend Engine Hack (クロージャもあるよ) (拡張モジュールもあるよ) - 讃容日記:
<<前の記事   後の記事>>