AX

電霊ログ

私のやってるサイト、電子の言霊の活動ログ

カテゴリークラウド

タグリスト

最近のトラックバック

月別アーカイブ(タブ)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • [HSP3] つやつやギャラリー

サンプルスクリプト第一弾として、HSPコンテスト2009に応募して最終審査で落ちた(^^;)作品をほんの少し改善したものを掲載します。締め切り時間があと6時間くらいの所で、元々作って有った画像が回るスクリプトをベースに何とか形にした物なので、改善する余地はまだ幾分かありますけど。

「つやつやギャラリーv1.2」
#HSP3.2以降で実行してください
スクリプトのダウンロード


/*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    HSPコンテスト2009応募作品

    つやつやギャラリー Version 1.2
    作者 tyty
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/


    /* 初期化処理 */

    // ウィンドウタイトル設定
    title "つやつやギャラリー"

    // 変数初期化
    bg_r   = 255
    bg_g   = 255
    bg_b   = 255
    maxpix = 128
    ratio  = 0.0
    space  = 8
    max = 128
    x = (GINFO_WINX - maxpix) / 2
    y = (GINFO_WINY - maxpix) / 2

    // 配列変数初期化
    sdim files, 512, max
    dim posx, max
    dim posy, max
    dim order, max
    order = 0123456789
    ddim distance, max
    dim zx, max
    dim zy, max
    dim id, max
    dim margin, max

    // バッファー初期化

    /* 画像読み込み専用バッファー。
       ・サムネイル作成処理では、ここに一旦開いて、サイズ取得&サムネイル用バッファーに縮小コピーに使用
       ・クリック時の画像表示では、選択画像の読み込みに使用 */

    buffer 111

    // クリック時画像フェードに使うバッファーの初期化
    buffer 2640480          ; 暗くする時の色合成用
    buffer 3640480          ; 暗い状態から元に戻す為のメイン画像のコピー用

;・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

    /* 画像ファイルリストの作成 */

    // 選んだ画像の置いてあるフォルダーを対象に
    dialog "jpg"16
    if stat = 0    :end

    gsel 0
    mes "読み込み中・・・"

    // 改行区切りのファイルリストを取得
    dirlist flist, "*.jpg"1
    fnum  = stat

    // 読み込み数の上限を10個までにする
    if fnum >= 10 { lim = 10   }
    else          { lim = fnum }

    // ファイルリストを改行で切り分けて、配列に格納する
    i = 0
    repeat lim
        getstr file, flist, i
        i += strsize
        files(cnt) = file
    loop

    /* ファイルリストを元に、サムネイル用の画像作成 */

    i = 0
    repeat lim

        // ファイルの存在確認
        exist files(cnt)
        if strsize < 0    :continue

        // 画像ファイルを開いて画像のサイズを取得
        gsel 1
        picload files(cnt)
        gx = GINFO_SX
        gy = GINFO_SY

        // 縦横比の計算
        if gx >= gy {
            ratio = double(gy) / gx
            zx(i) = maxpix
            zy(i) = int(ratio * maxpix)
            margin(i) = maxpix - zy(i)
        } else {
            ratio = double(gx) / gy
            zx(i) = int(ratio * maxpix)
            zy(i) = maxpix
            margin(i) = 0
        }

        // 新しいバッファーを作成
        buffer GINFO_NEWID, zx(i), zy(i)        ; リサイズ後の大きさで未使用バッファーを作成
        id(i) = GINFO_SEL                       ; 0要素目から順番にサムネイル用バッファーIDを入れていく

        // 新しいバッファーに、サイズ取得時に読み込んだ画像を縮小コピー
        gzoom zx(i), zy(i), 100, gx, gy, 1  ; サムネイル用にリサイズする
        i++

    loop

    // 使用済みバッファーを出来るだけ開放
    buffer 111

;・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

    /* その他の設定 */

    gsel 0                      ; 描画先をメインウィンドウに
    randomize                   ; 乱数を不規則に
    onclick gosub *ON_CLICK     ; クリック時のジャンプを設定(選択画像の拡大)

;・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

*MAIN

    // サムネイル画像の回転処理
    repeat

        redraw 0

        // 背景色を描画
        color bg_r, bg_g, bg_b
        boxf 00GINFO_WINXGINFO_WINY

        // ギャラリーの回転弧度を計算
        rad = 6.283 / 256 * cnt                 ; 一周するのに256ループ(手抜き)

        // 座標計算
        repeat lim
            tmp = rad + M_PI * 2 / lim * cnt    ; radをベースに各画像を等間隔で配置
            posx(cnt) = x + cos( tmp ) * x      ; tmpを元にX座標を計算
            posy(cnt) = y + sin( tmp ) * 32     ; tmpを元にY座標を計算
            distance(cnt) = sin( tmp ) + 1      ; ソート処理用に奥行きを計算
        loop

        // 奥行きを元に表示順をソーティング
        repeat lim
            i = cnt
            // 最大値を捜索
            repeat lim - (1 + cnt), 1 + cnt
                if distance(order(i)) > distance(order(cnt))    :i = cnt
            loop

            // 探した値同士を交換
            if cnt ! i {
                tmp = order(cnt)
                order(cnt) = order(i)
                order(i) = tmp
            }
        loop

        // 画面にサムネイル画像と映り込みを描画
        repeat lim
            // 使用する変数を用意
            i   = order(cnt)        ; 記述の簡略化のためにソート後のインデックスを代入
            ref = 1.75              ; 映り込み反射の長さ、2にすると半分になる(1.0~)

            // 画像本体を表示
            gmode 0
            pos posx(i), margin(i) + posy(i)
            gcopy id(i), 00, zx(i), zy(i)

            // 床の反射を表示
            repeat zy(i)
                gmode 3, zx(i), 1192.0 - (192.0 / zy(i) * (ref * cnt))
                pos posx(i), margin(i) + posy(i) + zy(i) + space + cnt
                gcopy id(i), 0, zy(i) - (ref * cnt)
            loop
        loop

        // どの画像の上にマウスポインタがあるかを調べる(secect変数に選択画像IDが入る)
        select = -1
        repeat lim
            // 奥行きの手前にある物から探す
            i = order(lim - cnt - 1)
            // マウスの位置から選択座標を判断
            if (mousex > posx(i)) & (mousex < posx(i) + zx(i)) {
            if (mousey > posy(i) + margin(i)) & (mousey < posy(i) + zy(i) + margin(i)) {
                    // 選択されていたら、選択画像の周りに枠を表示
                    boxsize = 4                                 ; ボックスの枠サイズ
                    color bg_r ^ 255, bg_g ^ 255, bg_b ^ 255    ; 背景色の補色
                    // 枠描画
                    boxf posx(i), posy(i) + margin(i), posx(i) + zx(i), posy(i) + margin(i) + boxsize
                    boxf posx(i) + zx(i) + 1, posy(i) + margin(i), posx(i) + zx(i) - boxsize, posy(i) + margin(i) + zy(i)
                    boxf posx(i) + zx(i), posy(i) + margin(i) + zy(i) + 1, posx(i), posy(i) + zy(i) + margin(i) - boxsize
                    boxf posx(i), posy(i) + margin(i), posx(i) + boxsize, posy(i) + margin(i) + zy(i)
                    select = i      ; 選択画像のIDを代入
                    break           ; 選択されていたらそこでループを抜ける
                }
            }
        loop

        redraw 1
        await 20

    loop

;・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

/* クリック時のジャンプ先 */

*ON_CLICK

    // クリック時のズーム処理を何コマでアニメーションするか
    #define ANIME 10

    // 左クリックされた時の処理
    if wparam = 1 {

        // マウスの下に画像がある時だけ実行
        if select > -1 {
    
            /* クリックされた画像を大きく表示 */

            // 画像表示のための準備

            // 一時的にクリック無効化
            onclick 0

            // ファイルの存在確認
            exist files(select)
            if strsize < 0 {
                // エラー。クリックを有効化して、サブルーチンジャンプを抜ける
                dialog "ファイルが読み込めません"
                onclick 1
                return
            }

            // バッファーに画像読み込み、画像サイズの記憶
            gsel 1                              ; 画像読み込み用バッファー
            picload files(select)               ; マウスで選択したサムネイル画像のファイル名で開く
            gx = GINFO_SX
            gy = GINFO_SY

            // 縦横比の計算
            if gx >= gy {
                ratio = double(gy) / gx
                zx2   = 500
                zy2   = int(ratio * 500)
            } else {
                ratio = double(gx) / gy
                zx2   = int(ratio * 420)
                zy2   = 420
            }

            /* 画像を開く際のエフェクト */

            // 暗くする時のベース色
            gsel 2
            boxf                        ; 黒色でバッファーを塗りつぶす

            // 暗い状態から復帰するためのメイン画像のコピー
            gsel 3
            pos 00
            gcopy 000640480     ; サムネイル回転画面を複製

            // 暗くする
            gsel 0
            repeat ANIME1
                redraw 0
                gmode 3640480180 / ANIME
                pos 00
                gcopy 200
                redraw 1
                await 20
            loop

            // 画像ズームフェードから復帰するため、画面が暗くなった状態のメイン画面を複製
            gsel 2
            pos 00
            gcopy 000640480

            // 画像をズームしながら表示
            gsel 0
            gmode 0
            repeat ANIME1
                redraw 0
                pos (640 - zx2 / ANIME * cnt) / 2 , (480 - zy2 / ANIME * cnt) / 2
                gzoom zx2 / ANIME * cnt, zy2 / ANIME * cnt100, gx, gy, 1
                redraw 1
                await 15
            loop

            /* 画像のファイル名を表示 */

            // 文字の描画サイズを得るため、画面外にファイ名を表示
            redraw 0
            pos 6400
            mes files(i)

            // 画面の中央(X座標)に、袋文字の枠用ファイル名を表示
            color 0                 ; 袋文字の枠の色
            repeat 3  :_y = cnt
            repeat 3  :_x = cnt
                pos (640 - GINFO_MESX) / 2 + _x, 480 - GINFO_MESY - 3 + _y
                mes files(i)
            loop
            loop

            // 袋文字の中央に袋文字中身の文字を表示
            color 255255200     ; 袋文字の中の色
            pos (640 - GINFO_MESX) / 2 + 1480 - GINFO_MESY - 3 + 1
            mes files(i)
            redraw 1

            /* クリック待ち待機ループ */

            // 左クリックで復帰(何故か起動直後一回目のクリック判定がおかしいのでフラグで対処)
            flg = 0
            repeat
                await 100
                stick key
                if flg = 0       :key = 0    :flg++
                if key = 256     :break
            loop

            /* 画像を閉じる際のエフェクト */

            // 画像の縮小効果
            repeat ANIME1
                redraw 0
                pos 00
                gcopy 200640480
                pos (640 - zx2 / ANIME * (ANIME - cnt)) / 2 , (480 - zy2 / ANIME * (ANIME - cnt)) / 2
                gzoom zx2 / ANIME * (ANIME - cnt), zy2 / ANIME * (ANIME - cnt), 100, gx, gy, 1
                redraw 1
                await 15
            loop

            // 明るくする
            repeat ANIME1
                redraw 0
                gmode 3640480180 / ANIME * cnt
                pos 00
                gcopy 300
                redraw 1
                await 20
            loop

            /* 処理をメインに戻す前に後片付け */

            // 使用済みバッファーを出来るだけ開放
            buffer 111
            // メイン画面を描画先に
            gsel 0
            // 一時的なクリック無効化の解除
            onclick 1

        }

    }

    // 右クリックされた時の処理
    if wparam = 2 {

        /* 背景色の変更 */

        // 背景色の元をランダムに決定
        tmp = 2
        repeat 3
            r(cnt) = rnd(tmp + 1)       ; 0 ~ 2 の乱数を、赤、青、緑、分生成
        loop

        // 乱数からそれぞれの色成分を計算
        bg_r = r(0) * (256 / tmp) - (r(0) ! 0)      ; 背景色赤 : 0 or 127 or 255
        bg_g = r(1) * (256 / tmp) - (r(1) ! 0)      ; 背景色緑 : 0 or 127 or 255
        bg_b = r(2) * (256 / tmp) - (r(2) ! 0)      ; 背景色青 : 0 or 127 or 255

    }

    return

;・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
関連記事

コメント

コメントの投稿

   管理者にだけ表示を許可する
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。