HyperCard tribute

当たり判定をする


 ボタン ball が、ボタン wall に当たると動かなくなるというものを作ってみます。
 2つのボタンを用意し、それぞれ、ball、wallと名前を付けて下さい。それぞれのボタンの位置は、以下の図の様に同じ水平線上に置いて下さい。

 ボタンballには以下のスクリプトを書き込みます。グローバル変数xには、ボタンballのx座標が入っています。スクリプト自体は、mainハンドラを呼び出すだけの簡単なものですから理解は簡単です。
 1 
 2 
 3 
 4 
 5 
 6 
on mouseUp
  global x
  put 100 into x
  set the loc of me to x,100
  main
end mouseUp

 カードには、mainハンドラを書き込みます。
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
on main
  global x
  repeat
    put x+1 into x
    set the loc of cd btn "ball" to x,100
    if loc of cd btn "ball" is within rect of cd btn "wall" then exit repeat
  end repeat
end main

  • if loc of cd btn "ball" is within rect of cd btn "wall" then exit repeat
     6行目は正しく、当たり判定に関わる部分です。ボタンballのloc座標が、ボタンwallのrect座標内にあるかどうかを判定します。rect座標は、左上の座標と右下の座標の4つのデータを持っています。
    「cd btn "ball"(カードボタン ball)」
      の
    「loc(中心座標)」
      が(is)
    「cd btn "wall"(カードボタン wall)」
      の
    「loc(中心座標)」
      に
    「if 〜 is within rect(含まれている)」
      ならば
    「exit repeat(repeatを抜ける)」

     当たり判定にはこの他にif文を用いる方法もありますが、スクリプトが複雑になりますし、後々の管理・変更も容易になりますので、簡単な当たり判定を行う場合は、今回の、オブジェクト内に入ったかどうかを用いた方が良いでしょう。ただし、HyperCardはカード上にたくさんのオブジェクトがあるとスピードの低下が著しくなりますので、多くの判定を必要とする場合やスピードを重視する場合はif文を用いた方が良い場合もあります。