“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

131.HSPでゲームを作ろう:シューティングゲームっぽい何か その8

さらに前回の続き。
特定のビットに対して、値をセットする関数を作る。こっちはちょっと面倒だった。
単純に考えると、特定のビットだけを0にして、そのビットとの和(OR)を取ればいいと思った。
まず、取得と同じ要領でマスクを作って、全ビットを反転。反転したマスクと元の値でANDを取る。
そうすれば、セットするビットだけを0にできそう。そして設定値とのORを取る。
と、書いては見たものの、結構処理が面倒w
んで、論理演算の偉い人に教えてもらって、割と楽に演算できた。
こんな感じ。

あとは、適当に値をセットすると、ビット数をオーバーする可能性があるので、limit関数で下限と上限を調整した。

これで、スプライトのESI_OPTIONの値を32ビット分使い分けできるようになった。
ま、32ビット目は符号フラグになるから、実質31ビットなわけだが、そこまでのビットは使わずに賄えた。
ソースにするとこんな感じ。

  #defcfunc set_spOpt int p1,int p2,int p3
  ;ESI_OPTIONに項目の値を設定するための関数
  ;p1 ESI_OPTIONの現在の値
  ;p2 OPTIONに設定する項目番号
  ;p3 設定する値

    ;項目定義(できるならモジュール変数にしたいのだが…)
    dim Optbit,5 ;各値のビット数
    Optbit=3,3,3,1,3
    dim Optbitpos,5 ;各値が右から何ビット目から始まるか
    Optbitpos=0,3,6,9,10
    
    fun_ret=0
    ;マスクパターンを生成する
    maskp=0
    masknum=1
    for i,0,Optbit(p2)
      maskp=maskp+masknum
      masknum=masknum*2
    next
    ;設定する値がビット数の範囲内になるようにlimitで調整する
    fun_setnum=p3
    fun_setnum=limit(p3,0,maskp)

    ;マスクを項目が始まるビット数まで左シフト
    maskp=maskp << Optbitpos(p2)
    
    ;設定値を項目が始まるビット数まで左シフト
    fun_setnum=fun_setnum << Optbitpos(p2)

    ;値を設定
    ;前半の論理式でmaskpのビットを0にして、設定したい値とorを取る
    fun_ret=p1 & maskp ^ p1 | fun_setnum

    return fun_ret