//////////////////////////////////////////////////////////////////////////////// // time_sanctuary.hsp // Last Modified:2007/09/03-17:58. // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // // ※動かなくなった破片の描画位置がずれてたので修正(ソースコード版のみ) // // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // // ※CPU負荷を減らすために心がけたこと // -await命令の第一パラメータは 33にすると極端にCPU負荷が下がる上、 // 30FPS程度になってディスプレイのリフレッシュレート的に○ // (WindowsのSpeelの分解能の仕様の関係上、32以上でSleep()を呼ぶ仕様?) // -font命令で使うフォントサイズの種類は一定以下に抑える(8種類くらい?) // (HSP内部でフォントキャッシュを管理してるのかも。 // フォントキャッシュの上限を上回ると古いのから破棄されて極端に重くなるって感じ) // -いちいち破片を一つ一つ描いてたら負荷が高くなるので、 // 動かなくなった奴はキャッシュバッファに転送してしまって後で纏めて描くようにする // -まごころ // //////////////////////////////////////////////////////////////////////////////// // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // 定数 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // 各バッファで何が起こってるか知りたかったら // 次行先頭のセミコロン消すべし ;/*/ #define _buffer buffer /*/ #define _buffer screen /**/ // バッファ #enum MAIN_BUFFER_ID=0 #enum NUMBER_BUFFER_ID=2 #enum BACKGROUND_BUFFER_ID #enum PIECE_BUFFER_ID // エリアプロパティ #enum _a_x_=0 #enum _a_y_ #enum _a_width_ #enum _a_size_ // パーティクルプロパティ(破片) #enum _p_x_=0 #enum _p_y_ #enum _p_sx_ #enum _p_sy_ #enum _p_width_ #enum _p_num_ #enum _p_cord_ #enum _p_rad_ #enum _p_rad_speed_ #enum _p_used_ #enum _p_size_ #const PIECES_CAPACITY 400 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // メイン // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // 数字バッファ初期化 _buffer NUMBER_BUFFER_ID boxf fontsize = 64 font "MS ゴシック", fontsize, 16 repeat 60 pos cnt \ 10 * fontsize, cnt / 10 * fontsize color 0x55, 0x55, 0x55 mes strf( "%2d", cnt ) loop // たねうえ randomize gettime(7) // 占有エリア初期化 gosub*initArea // 止まった破片をキャッシュ _buffer PIECE_BUFFER_ID boxf // 一時バッファに _buffer BACKGROUND_BUFFER_ID boxf // 破片 ddim pieces, _p_size_, PIECES_CAPACITY // とりあえず _m = gettime(5) ;chgdisp 1, 640, 480 ;bgscr 0, 640, 480, 1, 0, 0 repeat gsel BACKGROUND_BUFFER_ID redraw 1 : await 33 : redraw 0 // 画面初期化 color boxf // 破片キャッシュから転送 pos 0, 0 gmode 2, ginfo_winx, ginfo_winy gcopy PIECE_BUFFER_ID fontsize_3 = fontsize / 3 s = gettime(6) if( _s != s ) { // 秒が変った瞬間 index = 0 // 破片を登録 repeat 9 index++ dup piece, pieces.0.index if( piece._p_used_ ) { continue cnt // 先客いた } // 先客いない // 破片を登録 piece._p_x_ = double( areas._a_x_._s + areas._a_width_ / 3 * ( cnt \ 3 ) ) piece._p_y_ = double( areas._a_y_._s + areas._a_width_ / 3 * ( cnt / 3 ) ) piece._p_cord_ = double( cnt ) power = 5.0 rad = atan( cnt / 3 - 1, cnt \ 3 - 1 ) + 0.1 * ( rnd( 100 ) - 50 ) piece._p_sx_ = power * cos( rad ) piece._p_sy_ = power * sin( rad ) piece._p_rad_speed_ = double( rnd( 100 ) - 50 ) piece._p_num_ = double( _s ) piece._p_width_ = double( areas._a_width_._s ) / 3 piece._p_used_ = double( 1 ) loop } _s = s // 破片書く repeat PIECES_CAPACITY dup piece, pieces.0.cnt if( piece._p_used_ ) { // 使われてるやつ書く num = int( piece._p_num_ ) x = fontsize * ( num \ 10 ) + fontsize_3 * ( int( piece._p_cord_ ) \ 3 ) y = fontsize * ( num / 10 ) + fontsize_3 * ( int( piece._p_cord_ ) / 3 ) piece._p_x_ += piece._p_sx_ piece._p_y_ += piece._p_sy_ piece._p_sx_ *= 0.98 piece._p_sy_ *= 0.98 piece._p_rad_ += piece._p_rad_speed_ piece._p_rad_speed_ *= 0.98 pos piece._p_x_, piece._p_y_ color gmode 5, fontsize_3, fontsize_3, 0xff grotate NUMBER_BUFFER_ID, x, y, 0.01 * piece._p_rad_, piece._p_width_, piece._p_width_ // スピードが遅いなら止まったも同然な if( piece._p_sx_ * piece._p_sx_ + piece._p_sy_ * piece._p_sy_ < 0.1 ) { // 破片登録抹消 piece._p_used_ = 0.0 // 破片のキャッシュをバッファに描画 // 次回以降はキャッシュバッファから転送するようにする gsel PIECE_BUFFER_ID pos piece._p_x_, piece._p_y_ color gmode 5, fontsize_3, fontsize_3, 0xff grotate NUMBER_BUFFER_ID, x, y, 0.01 * piece._p_rad_, piece._p_width_, piece._p_width_ gsel BACKGROUND_BUFFER_ID } } loop if( s != 0 && ( zoomSpeed == 0 || zoomSpeed > 23 ) ) { // 周りの数字を書く repeat 60 - s, s offx = 0 offy = 0 dup area, areas.0.cnt font "MS ゴシック", area._a_width_, 16 if( cnt == s ) { if( gettime( 7 ) > 300 ) { f = gettime( 7 ) / 80 offx = rnd( f ) - f / 2 offy = rnd( f ) - f / 2 color 0x66, 0x66, 0x66 pos area._a_x_ + _offx, area._a_y_ + _offy mes cnt _offx = offx _offy = offy } } color 0x99, 0x99, 0x99 pos area._a_x_ + offx, area._a_y_ + offy mes cnt loop } m = gettime(5) if( _m != m ) { // 分が変った zoomSpeed = 1 } _m = m // 真ん中の数字 fsize = 72 font "MS ゴシック", fsize, 16 time = strf( "%2d:", gettime(4) ) + strf( "%02d", gettime( 5 ) ) pos ( ginfo_winx - strlen( time ) / 2 * fsize ) / 2 - 16, ( ginfo_winy - fsize ) / 2 - 14 v = 0xff // 輝度 if( s == 0 && ( zoomSpeed != 0 && zoomSpeed < 23 ) ) { v = 0xff - gettime( 7 ) * 0xff / 1000 // ミリ秒の値にしたがって暗くしてく time = _time } else { _time = time } color v, v, v mes time // メインバッファに gsel pos 0, 0 if( zoomSpeed ) { zoomSpeed++ if( zoomSpeed < 23 ) { // 近づきちゅう zoomCount += zoomSpeed } else { // 遠ざかりちゅう zoomCount += 23 - zoomSpeed } if( zoomSpeed == 23 ) { // 密着中 gosub*initArea // 破片キャッシュ初期化 gsel PIECE_BUFFER_ID color : boxf boxf gsel BACKGROUND_BUFFER_ID } if( zoomSpeed == 44 ) { zoomSpeed = 0 zoomCount = 0 } // ズーム処理 gzoom ginfo_winx, ginfo_winy, BACKGROUND_BUFFER_ID, zoomCount, zoomCount, ginfo_winx - zoomCount * 2, ginfo_winy - zoomCount * 2, 0 } else { // ズームしてないから // 普通に gmode 0, ginfo_winx, ginfo_winy gcopy BACKGROUND_BUFFER_ID } loop *initArea // 数字をどこに配置するか // 表示がかぶらないような場所を探索し、確保する dim areas, _a_size_, 60 repeat 60 dup area, areas.0.cnt area._a_width_ = 32 + rnd(8) * 5 area._a_x_ = rnd(ginfo_winx - area._a_width_) area._a_y_ = rnd(ginfo_winy - area._a_width_) oc = cnt captureble = 1 repeat 60 if( cnt == oc ) { continue } dup area2, areas.0.cnt // かぶる if( ( area._a_x_ < area2._a_x_ + area2._a_width_ ) && ( area2._a_x_ < area._a_x_ + area._a_width_ ) && ( area._a_y_ < area2._a_y_ + area2._a_width_ ) && ( area2._a_y_ < area._a_y_ + area._a_width_ ) ) { // やりなおし captureble = 0 break } loop color if( captureble == 0 ) { continue cnt } loop return /* * TODO: * * FIXME: * * NOTE: * */