LoginSignup
28

More than 5 years have passed since last update.

弾幕の初歩(距離系と角度系)

Last updated at Posted at 2015-01-03

ゲームといえば弾撃ちかな!ってことで、
UnityとかCCActionとかいろんな便利なAPIに頼り切りな昨今、あらためて低レイヤーで汎用的な弾幕の打ち方を学んでいきます。
最後にvxとvyを各々エンジンのupdate関数に組み込めば動きます。

距離系

2点間の距離の差をもとにした弾撃ちです。
2点間の距離は、平方根を利用して出します。
具体的には「(AX - BX)の2乗 + (AY - BY)の2乗」の平方根が距離

もっと知るなら「2点間の距離の公式」
三平方の定理はどうしても避けられなさそうです
http://www.geisya.or.jp/~mwm48961/math/distance1j.htm

ex1.js

//targetX,Yがターゲットの座標、bulletX,Yが弾の座標
var targetX = 680;
var targetY = 1200;
var bulletX = 10;
var bulletY = 10;

//弾とターゲットの距離(平方根で求める)
var distance = Math.sqrt((targetX-bulletX)*(targetX-bulletX)+(targetY-bulletY)*(targetY-bulletY));

//弾速
var speed = 30;

//加速度(X,Yそれぞれ)
var vx = (targetX-bulletX) / distance * speed;
var vy = (targetY-bulletY) / distance * speed;

//アップデート内で座標を更新すると動く
function update(){
  x += vx;
  y += vy;
}

角度系

角度をもとにした弾撃ち。
三角関数が深くわからなくても使えます。(自分も怪しい・・)
あと角度は大体ラジアンに変換するので慣れましょう。

ex2.js
//初期座標(bulletX,bulletY)からangleの角度へ移動
var bulletX = 0;
var bulletY = 0; 

//弾速
var speed = 30;

//30度の方向に撃つ
var angle = 30;

//加速度(途中で角度→ラジアンに変換)
var vx = Math.cos(Math.PI / 180 * angle) * speed;
var vy = Math.sin(Math.PI / 180 * angle) * speed;

//アップデート内で座標を更新すると動く
function update(){
  x += vx;
  y += vy;
}

もっと深く学べる書籍

今回のコードは下の書籍から着想を得ました。C++系のコードですがおすすめです。
シューティングゲームアルゴリズムマニアックス
http://www.amazon.co.jp/%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%83%9E%E3%83%8B%E3%82%A2%E3%83%83%E3%82%AF%E3%82%B9-C-magazine-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4797327316

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28