マウスカーソルオンで、タイルを光らせる | HotSoupProcessorの記録

HotSoupProcessorの記録

コンピューター言語 HotSoupProcessor の練習記録です

ちょっと触っていなかったので復習も兼ねて、
簡単そうなプログラムを作ってみました。ニコニコ

「カーソルが乗ると、色が変る」

でもこれじゃさすがに簡単そうだったので
「カーソルが乗ると、じわっと色が変る」
にしてみました。
もちろん、離れるときもじわっと戻ります。

------
; タイルのマス目上にマウスカーソルがあると、そのタイルがじわっと光る
  screen 0, 400, 300
  nTileSize = 50

  ; タイルの色
  ; 暗い色
  dim naBlack, 3
  naBlack = 0, 0, 50
  ; 明るい色
  dim naWhite, 3
  naWhite = 255, 255, 0
  ; じわっと光るステップ数(ステータスの値に使用する)
  nShineStep = 100

  ; 全タイルに、光状態のステータスを持たせる[ 0 ~ nShineStep ]
  nTileNum_x = int( ginfo_sx / nTileSize )
  nTileNum_y = int( ginfo_sy / nTileSize )
  dim naShineStatus, nTileNum_x, nTileNum_y
  for i, 0, nTileNum_x, 1
    for j, 0, nTileNum_y, 1
      naShineStatus(i,j) = 0
    next
  next

  ; 関数の使い方がよくわからないため使用するグローバル変数
  ; DrawOneTile()で使用
  ; タイルのx方向index
  gnX = 0
  ; タイルのy方向index
  gnY = 0
  ; 光らせる度合い(最大nShineStep)
  gnShine = 0


; メイン処理
*DrawMain
  redraw 0

  ; タイルを描く
  gosub *DrawTile

  redraw 1
  
  await 5
  goto *DrawMain
  
  stop


; タイルを描く
*DrawTile
  nTileNum_x = int( ginfo_sx / nTileSize )
  nTileNum_y = int( ginfo_sy / nTileSize )

  ; マウスがあるタイルを調べる
  mouse_i = int( mousex / nTileSize )
  mouse_j = int( mousey / nTileSize )

  for i, 0, nTileNum_x, 1
    for j, 0, nTileNum_y, 1
      ; マウスがある場合は光らせる
      if( (i=mouse_i) and (j=mouse_j) ){
        if( naShineStatus(i,j) < nShineStep ){  // 最大に光っていないタイルのみ
          naShineStatus(i,j) = naShineStatus(i,j) + 3  // 光るのは暗くするより早く
          // ※最後、少しmaxを超えるけど気にしない
        }
      }else{
        ; マウスがない場合は暗くさせる
        if( naShineStatus(i,j) > 0 ){  // もともと明るいタイルのみ
          naShineStatus(i,j) = naShineStatus(i,j) - 1
        }
      }
      
      ; 描画
      gnX = i
      gnY = j
      gnShine = naShineStatus(i,j)
      gosub *DrawOneTile
    next
  next
  
  return


; 指示があったタイルを1つだけ描く
; ※ 関数の使い方がよくわからないので、ひとまずグローバル変数で。。(恥
;    よくわからない点メモ
;      ・moduleを定義しないといけないのか?
;      ・変数は基本的にローカル変数なのか?
;      ・グローバル変数も使いたいときはどう記述するか?
; 引数
; gnX:タイルのx方向index
; gnY:タイルのy方向index
; gnShine:光らせる度合い(最大nShineStep)
*DrawOneTile
  ; 色の計算
  if( gnShine<=0 ){
    nR = naBlack(0)
    nG = naBlack(1)
    nB = naBlack(2)
  }else:if( gnShine>=nShineStep ){
    nR = naWhite(0)
    nG = naWhite(1)
    nB = naWhite(2)
  }else{
    nR = naBlack(0) + int( (gnShine*(naWhite(0) - naBlack(0)))/nShineStep )
    nG = naBlack(1) + int( (gnShine*(naWhite(1) - naBlack(1)))/nShineStep )
    nB = naBlack(2) + int( (gnShine*(naWhite(2) - naBlack(2)))/nShineStep )
  }

  ; 背景
  color nR, nG, nB
  boxf i*nTileSize, j*nTileSize, (i+1)*nTileSize, (j+1)*nTileSize
  
  ; 上のふち
  color 0, 0, 0
  line gnX*nTileSize, gnY*nTileSize, (gnX+1)*nTileSize, gnY*nTileSize
  
  ; 左のふち
  line gnX*nTileSize, gnY*nTileSize, gnX*nTileSize, (gnY+1)*nTileSize
  
  return
----------
アルゴリズムの問題なので、
HSP的に、特に難しい技術は使っていません。
長いけど、読めばわかるという感じ。

すべてのタイルごとにステータスを持って、
マウスカーソルの位置を見て、それを変えて、
それを元に色を決定する
というロジックです。



以前やったかもしれないけども、
内部関数の使い方がわからなかったので使いませんでしたあせる

じゃ、それは次の課題かなぁ。