読者です 読者をやめる 読者になる 読者になる

ChikenHeart

自分自身の備忘録と活動日誌

Game A Week を始めることにした。それと敵に視界判定を持たせた。

プログラミング ゲーム開発

ちゃんと調べてないけどオランダの何某さんが提唱した「Game A Week」。

aba.hatenablog.com

 このエントリをみて、ひとまず期間を決めてやらないと自分は絶対ゲームを完成させないなと思った。

一週間という期間を決めてゲーム作りをすることに決めた。

スタートを何時にするとか決めるとまたダラダラ先延ばしにするのが目に見えてたので、このエントリを見た日から始めることに決めた。(2016/09/16)

 

 GameMakerで作っていくことになると思うし、Tutorialは終わらせているから初回は今日まででもいいのかなと思ったり。

本日0時を目途に作成する!GameStartからClear!まで作れるようにしよう。

ちなみに作っているのは、一般的なPlatformGameです。2Dシューティング

 

 金曜日に、Platformの基礎部分を作って、昨日は敵を作っていた。

特に敵に攻撃性を持たせることをずっとやってたと思う。

 

ここから、やってた内容の話。

 

「視界内に入ってきたプレイヤーに向けて攻撃する。」

この視界内というのが曲者で、

「視界内に入ってきたプレイヤーに向けて攻撃する、ただし間に障害物がある場合には無視する。」

というのと同義。後半部分をちゃんと書かないとだめだった。

 

まず、視界の実装。

【GameMaker:Studio】内積を使って視野内かどうかの判定をする – 2dgames.jp

ここを参照して、視界を設定した。

 

 次に障害物の無視は、「敵とプレイヤーの間にものがあるか」を判定した。

使ったのは、「collision_line(x1,y1,x2,y2,obj,prec,notme)」

collision_line() - Game Maker まとめWiki

とりあえず障害物は全部壁オブジェクトの子に設定する。

これによって、見えるとこにいるのか?が簡易的に判定できる。

自分はこれでいく、もっといい方法があれば教えてください・・・

 

 「視界内に入ってきたプレイヤーに向けて攻撃する、ただし間に障害物がある場合には無視する。」のソースが以下の通り

  1. //(敵)自身とプレイヤーの距離測定
  2. self.distance = point_distance(x,y,obj_player.x,obj_player.y)
  3. //視線ベクトル
  4. var x1 = lengthdir_x(1,direction)
  5. var y1 = lengthdir_y(1,direction)
  6. //プレイヤーへの方向ベクトル
  7. var x2 = obj_player.x - x;
  8. var y2 = obj_player.y - y;
  9. //正規化して内積を求める。
  10. var dot = dot_product_normalised(x1,y1,x2,y2);
  11. //内積からプレイヤーとの角度を求める
  12. var rad = arccos(dot);
  13. self.angle = radtodeg(rad);
  14. //自身とプレイヤー間に障害物があるか?
  15. p_invisible = collision_line(x,y,obj_player.x,obj_player.y,obj_wall,false,false);
  16. //発見判定
  17. if(self.angle > self.view)
  18. {
  19. self.is_find = false;
  20. }
  21. else if(self.distance > dist)
  22. {
  23. self.is_find = false;
  24. }
  25. else if (p_invisible)
  26. {
  27. self.is_find = false;
  28. }
  29. else
  30. {
  31. self.is_find = true;
  32. }

以上です。

因みに内積に関して紹介しているページのサンプルプロジェクトには、視界を描画するコードも乗ってたので、実装してみるといいかも。デバッグの役に立つ。

 

意外となんとかなるもんだなあ、今日も頑張ります。