2024/01/31(水) [n年前の日記]
#1 [basic] FreeBASICでTIC-80風のHelloWorld
Windows10 x64 22H2 + FreeBASIC 1.10.1 を触ってるけれど、せっかくだから TIC-80風の Hello World を書いてみようかなと思いついた。
TIC-80 は Fantsy Console (Fatntasy Computer)の一種。テキストエディタ、ドットエディタ、マップエディタ、サウンドエディタ、ミュージックエディタが、1ファイルの中に全部入っているので、すぐにゲーム制作が始められる。
このジャンルのアプリでは、PICO-8(有償アプリ)が有名だけど、TIC-80は無料で利用できる。(有償版もある。)
_TIC-80 tiny computer
その TIC-80 は、起動直後にサンプルファイルが既にロードされてる状態で始まるのだけど。そのサンプルと似たような処理を書けるなら、ひとまず FreeBASIC でも、2Dピコピコゲーム程度なら書けそうだ、と分かるのではないかなと…。
TIC-80 は Fantsy Console (Fatntasy Computer)の一種。テキストエディタ、ドットエディタ、マップエディタ、サウンドエディタ、ミュージックエディタが、1ファイルの中に全部入っているので、すぐにゲーム制作が始められる。
このジャンルのアプリでは、PICO-8(有償アプリ)が有名だけど、TIC-80は無料で利用できる。(有償版もある。)
_TIC-80 tiny computer
その TIC-80 は、起動直後にサンプルファイルが既にロードされてる状態で始まるのだけど。そのサンプルと似たような処理を書けるなら、ひとまず FreeBASIC でも、2Dピコピコゲーム程度なら書けそうだ、と分かるのではないかなと…。
◎ サンプルソース :
そんなわけで書いてみた。
_helloliketic80.bas
使っている画像は以下。
_obj.bmp
_obj.png
_helloliketic80.bas
' game main loop #ifdef __FB_WIN32__ ' Windowsの場合、mmsystemを利用 #include "windows.bi" #include "win/mmsystem.bi" #endif ' 画像読み込み用ライブラリ FBImage を使う場合は以下のコメントアウトを外す ' #include once "FBImage.bi" ' fbgfxモードを使う #Include "fbgfx.bi" Using fb ' 時間計測用の変数 Dim As Double start_time, prev_time, now_time, delta, one_frame, next_time Dim As Integer frame_count Dim As String fps_text = "FPS" Dim As Integer scrw, scrh ' ウインドウサイズ Dim As Integer imgw, imgh ' 画像サイズ ' カレントディレクトリを exeファイルのある場所にする chdir exepath() ' ウインドウサイズと色深度を指定 scrw = 512 scrh = 288 Screenres scrw, scrh, 32 ' 画像読み込み #ifdef __FBImage_bi__ ' FBImageを利用して読み込む場合 var img = LoadRGBAFile("obj.png") #Else ' FreeBASIC標準のbmp読み込みを使う場合 Dim img As any ptr = ImageCreate(128, 64) Bload "obj.bmp", img #endif ' 画像の幅と高さを取得 imageinfo img, imgw, imgh #ifdef __FB_WIN32__ ' タイマー精度を1msecに向上 timeBeginPeriod(1) #endif ' 1フレームあたりの本来の時間 Dim As Double MAX_FPS = 60.0 one_frame = 1.0 / MAX_FPS ' 開始時間を取得 start_time = Timer prev_time = start_time frame_count = 0 Dim As Boolean running = True Dim As Double x, y x = scrw / 2 y = scrh / 2 Dim As Double anime_t = 0.0 ' メインループ While (running) ' 前回フレームから何秒経過したか取得。単位は秒(小数点以下有り) now_time = Timer If now_time >= prev_time Then delta = now_time - prev_time Else delta = one_frame End If prev_time = now_time next_time = now_time + one_frame If now_time >= start_time Then If (now_time - start_time) >= 1.0 Then ' 1秒経過したのでFPSを取得 fps_text = "FPS: " & frame_count start_time += 1.0 frame_count = 0 End If Else start_time = now_time End If ' ESCキー、qキー、ウインドウの閉じるボタンを検出 Dim As String k = inkey$ If k = Chr$(27) Or k = "q" Or k = Chr$(255) + "k" Then ' メインループ終了 running = False End If ' キャラを移動 Dim As Double spd = 4.0 * MAX_FPS * delta If MultiKey(SC_LEFT ) Then x -= spd If MultiKey(SC_RIGHT) Then x += spd If MultiKey(SC_UP ) Then y -= spd If MultiKey(SC_DOWN ) Then y += spd ' アニメ表示用カウンタを更新 anime_t += delta ' 描画開始 ScreenLock ' 画面クリア color RGB(255, 255, 255), RGB(52, 164, 255) cls ' 画像を描画 Dim As Integer n, sx, sy, sw, sh n = Int(anime_t / 0.3) Mod 2 ' 0 or 1 sw = (imgw / 2) ' 幅 sh = imgh ' 高さ sx = sw * n ' 描画元 x sy = 0 ' 描画元 y Put (x - (sw / 2), y - (sh / 2)), img, (sx, sy) - Step(sw, sh), TRANS ' 文字列を描画 Draw String (10, 10), fps_text Draw String (scrw / 2 - (8 * 6), scrh * 0.8), "HELLO WORLD" ' 描画終了 ScreenUnlock If Timer < next_time Then ' 本来の1フレーム時間がまだ経過してないので sleep させる Dim As Double wait_ms = (next_time - Timer) * 1000.0 If wait_ms > 0.0 Then sleep wait_ms End If frame_count += 1 Wend ' キーバッファを空にする While Inkey <> "": Wend #ifdef __FB_WIN32__ ' タイマー精度を本来のスペックに戻す timeEndPeriod(1) #endif ' 画像を使い終わったので破棄 ImageDestroy img
使っている画像は以下。
_obj.bmp
_obj.png
◎ 少し解説 :
TIC-80 のサンプルと比べたら、無駄にソースが長くなるなと…。やってることは同じなのに…。ゲーム制作に特化した環境と、どんなアプリも作れる汎用性を重視している環境では、こういうところで違いが出てくるのかもしれない。
さておき。FreeBASIC でキー入力を検出するためには、一般的には Inkey を使うけれど、カーソルキー押しっぱなしでキャラを移動させたりする時は MultiKey() を使う。この MultiKey() を使う時は、fbgfxモードとやらを有効にしないといけないらしい。
FreeBASICで時間を取得したい時は、Timer を使う。単位は秒で、小数点以下の値も入ってくるから、ミリ秒も測定できる。ほとんどの場合、PCが起動してからの時間を返してくるけれど、動かしてるOSによってどのあたりが開始時間になるかは異なる。
Windows上で FreeBASIC を動かした際、標準状態だと sleep の精度が荒いけれど、1ミリ秒の精度にしたいときは、マルチメディア関連の機能を使う。Linux の場合は標準状態で1ミリ秒の精度なので気にしなくていい。
FreeBASIC は標準状態だと bmp画像の読み込みしかできない。png画像も読み込みたい時は、何かしらの画像ライブラリを使うことになる。今回は FBImage という画像ライブラリを使って実験していた。
FBImage のインストールは、以前の日記を参考に。
_FreeBASICで画像描画 - mieki256's diary
画像描画は Put を使う。文字の描画は Draw String を使う。
描画開始時に ScreenLock を呼んで、描画が終わったら ScreenUnlock を呼べば、画面のちらつきを防止できる、という話を見かけたので一応やっている。
さておき。FreeBASIC でキー入力を検出するためには、一般的には Inkey を使うけれど、カーソルキー押しっぱなしでキャラを移動させたりする時は MultiKey() を使う。この MultiKey() を使う時は、fbgfxモードとやらを有効にしないといけないらしい。
' fbgfxモードを使う #Include "fbgfx.bi" Using fb ' ... ' キャラを移動 Dim As Double spd = 4.0 * MAX_FPS * delta If MultiKey(SC_LEFT ) Then x -= spd If MultiKey(SC_RIGHT) Then x += spd If MultiKey(SC_UP ) Then y -= spd If MultiKey(SC_DOWN ) Then y += spd
FreeBASICで時間を取得したい時は、Timer を使う。単位は秒で、小数点以下の値も入ってくるから、ミリ秒も測定できる。ほとんどの場合、PCが起動してからの時間を返してくるけれど、動かしてるOSによってどのあたりが開始時間になるかは異なる。
' 前回フレームから何秒経過したか取得。単位は秒(小数点以下有り) now_time = Timer If now_time >= prev_time Then delta = now_time - prev_time Else delta = one_frame End If prev_time = now_time next_time = now_time + one_frame
Windows上で FreeBASIC を動かした際、標準状態だと sleep の精度が荒いけれど、1ミリ秒の精度にしたいときは、マルチメディア関連の機能を使う。Linux の場合は標準状態で1ミリ秒の精度なので気にしなくていい。
#ifdef __FB_WIN32__ ' Windowsの場合、mmsystemを利用 #include "windows.bi" #include "win/mmsystem.bi" #endif ' ... #ifdef __FB_WIN32__ ' タイマー精度を1msecに向上 timeBeginPeriod(1) #endif ' ... #ifdef __FB_WIN32__ ' タイマー精度を本来のスペックに戻す timeEndPeriod(1) #endif
FreeBASIC は標準状態だと bmp画像の読み込みしかできない。png画像も読み込みたい時は、何かしらの画像ライブラリを使うことになる。今回は FBImage という画像ライブラリを使って実験していた。
' 画像読み込み用ライブラリ FBImage を使う場合は以下のコメントアウトを外す ' #include once "FBImage.bi" ' ... ' 画像読み込み #ifdef __FBImage_bi__ ' FBImageを利用して読み込む場合 var img = LoadRGBAFile("obj.png") #Else ' FreeBASIC標準のbmp読み込みを使う場合 Dim img As any ptr = ImageCreate(128, 64) Bload "obj.bmp", img #endif ' 画像の幅と高さを取得 imageinfo img, imgw, imgh ' ... ' 画像を使い終わったので破棄 ImageDestroy img
FBImage のインストールは、以前の日記を参考に。
_FreeBASICで画像描画 - mieki256's diary
画像描画は Put を使う。文字の描画は Draw String を使う。
描画開始時に ScreenLock を呼んで、描画が終わったら ScreenUnlock を呼べば、画面のちらつきを防止できる、という話を見かけたので一応やっている。
◎ 昔のBASICらしい画面にしてみた :
前述のように、一応書けたのだけど。これってどうも、「BASICで書いてますよー」感が弱いなと…。
もうちょっと手直ししてみた。
_helloliketic80ascii.bas
よし。見た目がBASICらしくなった。
いや、自分、最初に使ってたPCが、グラフィック画面が無くて文字しか表示できない MZ-700 だったもんで…。PC-8801 や FM-7 や X1 使ってた人の「BASIC感」は、たぶん違うんだろうなあ…。
もうちょっと手直ししてみた。
_helloliketic80ascii.bas
' game main loop #ifdef __FB_WIN32__ ' Windowsの場合、mmsystemを利用 #include "windows.bi" #include "win/mmsystem.bi" #endif ' fbgfxモードを使う #Include "fbgfx.bi" Using fb ' 時間計測用の変数 Dim As Double start_time, prev_time, now_time, delta, one_frame, next_time Dim As Integer frame_count Dim As String fps_text = "FPS" Dim As Integer scrw, scrh ' ウインドウサイズ ' ウインドウサイズと色深度を指定 scrw = 512 scrh = 288 Screenres scrw, scrh, 32 #ifdef __FB_WIN32__ timeBeginPeriod(1) ' タイマー精度を1msecに向上 #endif ' 1フレームあたりの本来の時間 Dim As Double MAX_FPS = 60.0 one_frame = 1.0 / MAX_FPS ' 開始時間を取得 start_time = Timer prev_time = start_time frame_count = 0 Dim As Boolean running = True Dim As Double x, y x = scrw / 2 y = scrh / 2 Dim As Double anime_t = 0.0 ' メインループ While (running) ' 前回フレームから何秒経過したか取得。単位は秒(小数点以下有り) now_time = Timer If now_time >= prev_time Then delta = now_time - prev_time Else delta = one_frame End If prev_time = now_time next_time = now_time + one_frame If now_time >= start_time Then If (now_time - start_time) >= 1.0 Then ' 1秒経過したのでFPSを取得 fps_text = "FPS: " & frame_count start_time += 1.0 frame_count = 0 End If Else start_time = now_time End If ' ESCキー、qキー、ウインドウの閉じるボタンを検出 Dim As String k = inkey$ If k = Chr$(27) Or k = "q" Or k = Chr$(255) + "k" Then ' メインループ終了 running = False End If ' キャラを移動 Dim As Double spd = 4.0 * MAX_FPS * delta If MultiKey(SC_LEFT ) Then x -= spd If MultiKey(SC_RIGHT) Then x += spd If MultiKey(SC_UP ) Then y -= spd If MultiKey(SC_DOWN ) Then y += spd ' アニメ表示用カウンタを更新 anime_t += delta ' 描画開始 ScreenLock ' 画面クリア color RGB(255, 255, 255), RGB(52, 164, 255) cls ' キャラクターを描画 Dim As Integer n = Int(anime_t / 0.5) Mod 2 ' 0 or 1 If n = 0 Then Draw String (x, y + 8 * 0), "+-----+" Draw String (x, y + 8 * 1), ":O O:" Draw String (x, y + 8 * 2), ": :" Draw String (x, y + 8 * 3), ": --- :" Draw String (x, y + 8 * 4), "+-----+" Draw String (x, y + 8 * 5), " H H " Else Draw String (x, y + 8 * 0), "+-----+" Draw String (x, y + 8 * 1), ":- -:" Draw String (x, y + 8 * 2), ": :" Draw String (x, y + 8 * 3), ": - :" Draw String (x, y + 8 * 4), "+-----+" Draw String (x, y + 8 * 5), " H H " End If ' 文字列を描画 Draw String (10, 10), fps_text Draw String (scrw / 2 - (8 * 6), scrh * 0.8), "HELLO WORLD" ' 描画終了 ScreenUnlock If Timer < next_time Then ' 本来の1フレーム時間がまだ経過してないので sleep させる Dim As Double wait_ms = (next_time - Timer) * 1000.0 If wait_ms > 0.0 Then sleep wait_ms End If frame_count += 1 Wend ' キーバッファを空にする While Inkey <> "": Wend #ifdef __FB_WIN32__ timeEndPeriod(1) ' タイマー精度を本来のスペックに戻す #endif
よし。見た目がBASICらしくなった。
いや、自分、最初に使ってたPCが、グラフィック画面が無くて文字しか表示できない MZ-700 だったもんで…。PC-8801 や FM-7 や X1 使ってた人の「BASIC感」は、たぶん違うんだろうなあ…。
[ ツッコむ ]
#2 [prog] smpegをMinGWでビルドできるか再挑戦してみたけど挫折した
Windows10 x64 22H2 + MinGW (gcc 6.3.0) で、SDL 1.x関連ライブラリをビルドできないものか試している。
先日は smpeg 0.4.4 のビルドに失敗して SDL_mixer もビルドできなかったけど。ググってたら、smpeg_0.4.5+cvs20030824.orig.tar.gz を入手できた。
_0.4.5+cvs20030824-8build1 : smpeg package : Ubuntu
smpeg 0.4.4 はビルドできなかったけど、0.4.5 ならビルドできるのではないか。試してみる。
smpeg 0.4.5 の時と同じ修正作業をする。
make してみたけど、以前と同様にダメだった。大量にエラーが出る。
やはり MinGW (gcc 6.3.0) のバージョンが合ってないのだろうか?
先日は smpeg 0.4.4 のビルドに失敗して SDL_mixer もビルドできなかったけど。ググってたら、smpeg_0.4.5+cvs20030824.orig.tar.gz を入手できた。
_0.4.5+cvs20030824-8build1 : smpeg package : Ubuntu
smpeg 0.4.4 はビルドできなかったけど、0.4.5 ならビルドできるのではないか。試してみる。
◎ smpeg 0.4.5のビルドに挑戦 :
msys.bat を実行して、その上で作業する。
続けて make を打つけれど、その前にいくつかのファイルを修正しないといけない。
_MinGW + SDL 環境の構築
生成された Makefile の147行目を修正。
_smpegのコンパイル
MPEGaudio.h の最後に以下を追加。
audio/huffmantable.cpp を修正。
_Package: smpeg | Debian Sources
ようやく make。
しかし、アセンブラソース、video/mmxflags_asm.S のところでエラーが出た。
手詰まり。すんなり行かなかったな…。
tar zxvf smpeg_0.4.5+cvs20030824.orig.tar.gz cd smpeg-0.4.5+cvs20030824.orig ./configure --prefix=/mingw --disable-opengl-player --enable-mmx --disable-gtk-player --disable-gtktest
続けて make を打つけれど、その前にいくつかのファイルを修正しないといけない。
_MinGW + SDL 環境の構築
生成された Makefile の147行目を修正。
LIBS = -L/mingw/lib -lmingw32 -lSDLmain -lSDL -mwindows -lm ↓ LIBS = -L/mingw/lib -lmingw32 -lSDLmain -lSDL -mwindows -lm -lstdc++
_smpegのコンパイル
MPEGaudio.h の最後に以下を追加。
void Play_MPEGaudioSDL(void *udata, Uint8 *stream, int len); int Play_MPEGaudio(MPEGaudio *audio, Uint8 *stream, int len); #ifdef THREADED_AUDIO int Decode_MPEGaudio(void *udata); #endif
audio/huffmantable.cpp を修正。
_Package: smpeg | Debian Sources
> diff -u huffmantable.cpp.orig huffmantable.cpp --- huffmantable.cpp.orig Thu Aug 26 13:37:52 1999 +++ huffmantable.cpp Tue Jan 30 23:41:55 2024 @@ -9,6 +9,7 @@ #include "config.h" #endif +#include <climits> #include "MPEGaudio.h" static const unsigned int @@ -550,11 +551,11 @@ const HUFFMANCODETABLE MPEGaudio::ht[HTN]= { - { 0, 0-1, 0-1, 0, 0, htd33}, + { 0, UINT_MAX, UINT_MAX, 0, 0, htd33}, { 1, 2-1, 2-1, 0, 7,htd01}, { 2, 3-1, 3-1, 0, 17,htd02}, { 3, 3-1, 3-1, 0, 17,htd03}, - { 4, 0-1, 0-1, 0, 0, htd33}, + { 4, UINT_MAX, UINT_MAX, 0, 0, htd33}, { 5, 4-1, 4-1, 0, 31,htd05}, { 6, 4-1, 4-1, 0, 31,htd06}, { 7, 6-1, 6-1, 0, 71,htd07}, @@ -564,7 +565,7 @@ {11, 8-1, 8-1, 0,127,htd11}, {12, 8-1, 8-1, 0,127,htd12}, {13,16-1,16-1, 0,511,htd13}, - {14, 0-1, 0-1, 0, 0, htd33}, + {14, UINT_MAX, UINT_MAX, 0, 0, htd33}, {15,16-1,16-1, 0,511,htd15}, {16,16-1,16-1, 1,511,htd16}, {17,16-1,16-1, 2,511,htd16},
ようやく make。
make
しかし、アセンブラソース、video/mmxflags_asm.S のところでエラーが出た。
$ make Making all in audio make[1]: Entering directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/audio' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/audio' Making all in video make[1]: Entering directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/video' /bin/sh ../libtool --mode=compile gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"smpeg\" -DVERSION=\"0.4.5\" -Dsocklen_t=int -I. -I. -g -O2 -I/mingw/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main -DUSE_MMX -DTHREADED_AUDIO -DNDEBUG -I.. -DNOCONTROLS -I.. -I../audio -I../video -c mmxflags_asm.S gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"smpeg\" -DVERSION=\"0.4.5\" -Dsocklen_t=int -I. -I. -g -O2 -I/mingw/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main -DUSE_MMX -DTHREADED_AUDIO -DNDEBUG -I.. -DNOCONTROLS -I.. -I../audio -I../video -c mmxflags_asm.S -o mmxflags_asm.o mmxflags_asm.S: Assembler messages: mmxflags_asm.S:6: Warning: .type pseudo-op used outside of .def/.endef ignored. mmxflags_asm.S:6: Error: junk at end of line, first unrecognized character is `f' mmxflags_asm.S:12: Warning: .type pseudo-op used outside of .def/.endef ignored. mmxflags_asm.S:12: Error: junk at end of line, first unrecognized character is `c' mmxflags_asm.S:57: Warning: .size pseudo-op used outside of .def/.endef ignored. mmxflags_asm.S:57: Error: junk at end of line, first unrecognized character is `c' make[1]: *** [mmxflags_asm.lo] Error 1 make[1]: Leaving directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/video' make: *** [all-recursive] Error 1
手詰まり。すんなり行かなかったな…。
◎ 再度 smpeg 0.4.4のビルドに挑戦 :
cd .. tar zxvf smpeg-0.4.4.tar.gz cd smpeg-0.4.4 ./configure --prefix=/mingw --disable-opengl-player --disable-gtk-player --disable-gtktest
smpeg 0.4.5 の時と同じ修正作業をする。
- Makefile を修正。
- MPEGaudio.h を修正。
- audio/huffmantable.cpp を修正。
make してみたけど、以前と同様にダメだった。大量にエラーが出る。
D:/MinGW/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0x34): undefined reference to `_Unwind_SjLj_Register' D:/MinGW/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0x87): undefined reference to `_Unwind_SjLj_Unregister' D:/MinGW/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0xb7): undefined reference to `_Unwind_SjLj_Resume' ... D:/MinGW/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x461): undefined reference to `_Unwind_SjLj_Register' D:/MinGW/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x5d4): undefined reference to `_Unwind_SjLj_Unregister' D:/MinGW/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x6c6): undefined reference to `_Unwind_SjLj_Unregister'
やはり MinGW (gcc 6.3.0) のバージョンが合ってないのだろうか?
[ ツッコむ ]
#3 [prog] MinGW 5.1.4のインストールを試みた
smpeg 0.4.4 を Windows10 x64 22H2 + MinGW (gcc 6.3.0)上でビルドできない。古いバージョンの MinGW ならビルドできるのか気になってきたので、あえて MinGW 5.1.4 + msys 1.0.11 をインストールしてみた。
◎ ファイルを入手 :
以下のファイルを入手。
_MinGW - Minimalist GNU for Windows - Browse /OldFiles/MinGW 5.1.4 at SourceForge.net
_MinGW - Minimalist GNU for Windows - Browse /OldFiles at SourceForge.net
MinGW-5.1.4.exe MSYS-1.0.11-2004.04.30-1.exe
_MinGW - Minimalist GNU for Windows - Browse /OldFiles/MinGW 5.1.4 at SourceForge.net
_MinGW - Minimalist GNU for Windows - Browse /OldFiles at SourceForge.net
◎ インストール :
今回は、D:/MinGW514/ というフォルダを作成して、その中に、MinGW/ と msys/ というフォルダを作成。そこに、MinGW 5.1.4 と msys 1.0.11 をインストールしてみた。
MinGW-5.1.4.exe を実行すると、ウイザード形式で色々尋ねてきて、そのうちインストールフォルダも尋ねてくる。D:\MinGW514\MinGW\ を指定してインストールした。最後に、ネットから必要なパッケージを自動でダウンロードして、自動で解凍してインストールしてくれた。
MSYS-1.0.11-2004.04.30-1.exe を実行すると、これもウイザード形式で色々尋ねてくる。インストール場所と、MinGW のインストール場所も尋ねてきた。
MinGW-5.1.4.exe を実行すると、ウイザード形式で色々尋ねてきて、そのうちインストールフォルダも尋ねてくる。D:\MinGW514\MinGW\ を指定してインストールした。最後に、ネットから必要なパッケージを自動でダウンロードして、自動で解凍してインストールしてくれた。
MSYS-1.0.11-2004.04.30-1.exe を実行すると、これもウイザード形式で色々尋ねてくる。インストール場所と、MinGW のインストール場所も尋ねてきた。
◎ 初期設定 :
インストール後、msys/1.0/etc/ 内で、fstab.sample を fstab にリネームコピー。fstab を編集して、/mingw の場所を指定し直し。
#Win32_Path Mount_Point D:/MinGW514/MinGW /mingw D:/Perls/strawberry/5.32.1.1-x64/perl /perl #c:/ActiveState/perl /perl
◎ msys.batを実行 :
msys.bat を実行すると、rxvt が開く。
余談。MSYS-1.0.11-2004.04.30-1.exe に入っている、rxvt の初期サイズやフォントサイズは、msys.bat の最後のほうで、コマンドラインオプションを指定する形で設定されているけれど。「-fn Terminal-18」と言った感じでフォント種類を変更しようとしても、各文字の間に妙な空白が入った状態で表示されてしまう。どうやら、 デフォルト設定の -fn Courier-18 というフォント種類しか受け付けないようだなと…。MSYS 1.10.10 版ならそういうことにはならないそうだけど、探しても見つからなかった。
_MinGW及びMSYS - Hirotake Itoh's memo by PukiWiki
余談。MSYS-1.0.11-2004.04.30-1.exe に入っている、rxvt の初期サイズやフォントサイズは、msys.bat の最後のほうで、コマンドラインオプションを指定する形で設定されているけれど。「-fn Terminal-18」と言った感じでフォント種類を変更しようとしても、各文字の間に妙な空白が入った状態で表示されてしまう。どうやら、 デフォルト設定の -fn Courier-18 というフォント種類しか受け付けないようだなと…。MSYS 1.10.10 版ならそういうことにはならないそうだけど、探しても見つからなかった。
_MinGW及びMSYS - Hirotake Itoh's memo by PukiWiki
◎ SDLのビルド :
SDL-1.2.15.tar.gz をビルドしてみようとしたけれど…。
処理が進まない。Cコンパイラは実行形式を作れない、と言ってきた。
すんなりビルドできるのであれば、と思って試用してみたけれど、いきなり最初から躓いてしまった。
バージョンも色々古いから、他の作業で使うとも思えないし…。コントロールパネル経由でアンインストールしておいた。残念。
tar zxvf SDL-1.2.15.tar.gz cd SDL-1.2.15 ./configure --prefix=/mingw
$ ./configure --prefix=/mingw checking build system type... i686-pc-mingw32 checking host system type... i686-pc-mingw32 checking for gcc... gcc checking for C compiler default output file name... configure: error: C compiler cannot create executables See `config.log' for more details.
処理が進まない。Cコンパイラは実行形式を作れない、と言ってきた。
すんなりビルドできるのであれば、と思って試用してみたけれど、いきなり最初から躓いてしまった。
バージョンも色々古いから、他の作業で使うとも思えないし…。コントロールパネル経由でアンインストールしておいた。残念。
◎ 余談 :
これ、何度も書くけど。MSYS2 なら、SDL 1.x も SDL2 もパッケージになって用意されていて、例えば以下のような感じで SDL_mixer だろうと smpeg だろうとインストールできるから苦労しないです。SDL 1.x や SDL2 を使って何か作りたいなら、MSYS2 を使えばOKです。
FreeBASIC で SDL 1.x を使いたい時も、reimp を使って、Visual C++用ライブラリ(.lib)を MinGW用ライブラリ(.a)に変換すれば、ひとまず使えちゃうので…。SDL2 なら、MinGW用ライブラリファイルも公式に配布されてるので…。
単に、今現在入手できる MinGW (gcc 6.3.0) で SDL 1.x 関係のビルドってできるのかな、難しいのかな、と気になってやってるだけなので…。
とりあえず、tiff (libtiff) と smpeg がビルドできないけれど、それ以外ならビルドできたので、機能を一部持ってない SDL_image と SDL_mixer でもいいなら、作れそうではあるなと…。実験してみて、そこまでは分かった…。
pacman -S mingw-w64-i686-SDL_mixer pacman -S mingw-w64-i686-smpeg
FreeBASIC で SDL 1.x を使いたい時も、reimp を使って、Visual C++用ライブラリ(.lib)を MinGW用ライブラリ(.a)に変換すれば、ひとまず使えちゃうので…。SDL2 なら、MinGW用ライブラリファイルも公式に配布されてるので…。
単に、今現在入手できる MinGW (gcc 6.3.0) で SDL 1.x 関係のビルドってできるのかな、難しいのかな、と気になってやってるだけなので…。
とりあえず、tiff (libtiff) と smpeg がビルドできないけれど、それ以外ならビルドできたので、機能を一部持ってない SDL_image と SDL_mixer でもいいなら、作れそうではあるなと…。実験してみて、そこまでは分かった…。
[ ツッコむ ]
以上、1 日分です。