Class: Miyako::Collisions

Inherits:
Object show all
Extended by:
Forwardable
Includes:
Enumerable
Defined in:
lib/Miyako/API/collision.rb

Overview

コリジョン管理クラス

複数のコリジョンと元オブジェクトを配列の様に一括管理できる 当たり判定を一括処理することで高速化を図る

Instance Method Summary collapse

Constructor Details

#initialize(collisions = [], points = []) ⇒ Collisions

コリジョンのインスタンスを作成する

points引数の各要素は、以下の3つの条件のどれかに適合する必要がある。しない場合は例外が発生する 1)の要素を持つ配列 2)Point構造体、Rect構造体、もしくはSquare構造体 3)x,yメソッドを持つ

collisions

コリジョンの配列。デフォルトは []

points

位置情報の配列。デフォルトは []

返却値

作成されたインスタンス


720
721
722
# File 'lib/Miyako/API/collision.rb', line 720

def initialize(collisions=[], points=[])
  @collisions = Array.new(collisions).zip(points)
end

Instance Method Details

#[](idx) ⇒ Object

インデックス形式でのコリジョン・本体の取得

判定に引っかかったコリジョンが一つでもあれば、すべてのコリジョンの配列を返す 当たり判定に引っかかったコリジョンが無い場合はnilを返す

idx

配列のインデックス番号

返却値

インデックスに対応したコリジョンと本体との対


770
771
772
# File 'lib/Miyako/API/collision.rb', line 770

def [](idx)
  return @collisions[idx]
end

#add(collision, point) ⇒ Object

コリジョンと位置情報を追加する

point引数は、以下の3つの条件のどれかに適合する必要がある。しない場合は例外が発生する 1)の要素を持つ配列 2)Point構造体、Rect構造体、もしくはSquare構造体 3)x,yメソッドを持つ

collisions

コリジョン

point

位置情報

返却値

自分自身を返す


748
749
750
751
# File 'lib/Miyako/API/collision.rb', line 748

def add(collision, point)
  @collisions << [collision, point]
  return self
end

#append(collisions, points) ⇒ Object

インスタンスに、コリジョンと位置情報の集合を追加する

points引数の各要素は、以下の3つの条件のどれかに適合する必要がある。しない場合は例外が発生する 1)の要素を持つ配列 2)Point構造体、Rect構造体、もしくはSquare構造体 3)x,yメソッドを持つ

collisions

コリジョンの配列

points

位置情報の配列

返却値

自分自身を返す


761
762
763
764
# File 'lib/Miyako/API/collision.rb', line 761

def append(collisions, points)
  @collisions.concat(collisions.zip(points))
  return self
end

#clearObject

インデックス形式でのコリジョン・本体の取得

idx

配列のインデックス番号

返却値

インデックスに対応したコリジョンと本体との対


785
786
787
788
# File 'lib/Miyako/API/collision.rb', line 785

def clear
  @collisions.clear
  return self
end

#collision?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素がcと重なっている)

重なったコリジョンが一つでもあれば、最初に引っかかったコリジョンを返す 重なったコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

コリジョンと本体の対。

Returns:

  • (Boolean)

815
816
817
# File 'lib/Miyako/API/collision.rb', line 815

def collision?(c, pos)
  return @collisions.detect{|cc| c.collision?(pos, cc[0], cc[1])}
end

#collision_all?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素とcが重なっている)

重なったコリジョンが一つでもあれば、すべてのコリジョンの配列を返す 重なったコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

コリジョンと本体の対の配列。

Returns:

  • (Boolean)

865
866
867
# File 'lib/Miyako/API/collision.rb', line 865

def collision_all?(c, pos)
  return @collisions.select{|cc| c.collision?(pos, cc[0], cc[1])}
end

#cover?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素とcのどちらかが、もう一方にすっぽり覆われている))

覆われたコリジョンが一つでもあれば、最初に引っかかったコリジョンを返す 覆われたコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

領域が覆われていれば true を返す

Returns:

  • (Boolean)

835
836
837
# File 'lib/Miyako/API/collision.rb', line 835

def cover?(c, pos)
  return @collisions.detect{|cc| c.cover?(pos, cc[0], cc[1])}
end

#cover_all?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素かcがもう一方を覆っている))

覆われたコリジョンが一つでもあれば、すべてのコリジョンの配列を返す 覆われたコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

コリジョンと本体の対の配列。

Returns:

  • (Boolean)

885
886
887
# File 'lib/Miyako/API/collision.rb', line 885

def cover_all?(c, pos)
  return @collisions.select{|cc| c.cover?(pos, cc[0], cc[1])}
end

#covered?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素のどれかがcに覆われている))

覆われたコリジョンが一つでもあれば、最初に引っかかったコリジョンを返す 覆われたコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

領域が覆われていれば true を返す

Returns:

  • (Boolean)

855
856
857
# File 'lib/Miyako/API/collision.rb', line 855

def covered?(c, pos)
  return @collisions.detect{|cc| c.covered?(pos, cc[0], cc[1])}
end

#covered_all?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素がcに覆われている))

覆われたコリジョンが一つでもあれば、すべてのコリジョンの配列を返す 覆われたコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

コリジョンと本体の対の配列。

Returns:

  • (Boolean)

905
906
907
# File 'lib/Miyako/API/collision.rb', line 905

def covered_all?(c, pos)
  return @collisions.select{|cc| c.covered?(pos, cc[0], cc[1])}
end

#covers?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素のどれかがcを覆っている))

覆われたコリジョンが一つでもあれば、最初に引っかかったコリジョンを返す 覆われたコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

領域が覆われていれば true を返す

Returns:

  • (Boolean)

845
846
847
# File 'lib/Miyako/API/collision.rb', line 845

def covers?(c, pos)
  return @collisions.detect{|cc| c.covers?(pos, cc[0], cc[1])}
end

#covers_all?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素が領域がcを覆っている))

覆われたコリジョンが一つでもあれば、すべてのコリジョンの配列を返す 覆われたコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

コリジョンと本体の対の配列。

Returns:

  • (Boolean)

895
896
897
# File 'lib/Miyako/API/collision.rb', line 895

def covers_all?(c, pos)
  return @collisions.select{|cc| c.covers?(pos, cc[0], cc[1])}
end

#deep_dupObject

要素も複製した複製インスタンスを返す

返却値

複製したインスタンスを返す


735
736
737
738
# File 'lib/Miyako/API/collision.rb', line 735

def deep_dup
  ret = self.dup
  ret.deep_dup_collision
end

#deep_dup_collisionObject

:nodocs:


728
729
730
731
# File 'lib/Miyako/API/collision.rb', line 728

def deep_dup_collision #:nodocs:
  @collisions = @collisions.deep_dup
  return self
end

#delete(idx) ⇒ Object

コリジョン・本体の削除

idx

配列のインデックス番号

返却値

削除したコリジョンと本体との対

インデックスが範囲外の時はnilが返る


778
779
780
# File 'lib/Miyako/API/collision.rb', line 778

def delete(idx)
  return @collisions.delete_at(idx)
end

#disposeObject

オブジェクトを解放する

返却値

なし


920
921
922
923
# File 'lib/Miyako/API/collision.rb', line 920

def dispose
  @collisions.clear
  @collisions = nil
end

#eachObject

タッピングを行う

ブロックを渡すことにより、タッピングを行う ブロック内の引数は、|コリジョン,本体|の2が渡される

返却値

自分自身を返す


794
795
796
797
# File 'lib/Miyako/API/collision.rb', line 794

def each
  @collisions.each{|cb| yield cb[0], cb[1] }
  return self
end

#initialize_copy(obj) ⇒ Object

:nodoc:


724
725
726
# File 'lib/Miyako/API/collision.rb', line 724

def initialize_copy(obj) #:nodoc:
  @collisions = @collisions.dup
end

#meet?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素のどれかがcとピクセル単位で隣り合っている)

隣り合ったコリジョンが一つでもあれば、最初に引っかかったコリジョンを返す 隣り合ったコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

隣り合っていれば true を返す

Returns:

  • (Boolean)

825
826
827
# File 'lib/Miyako/API/collision.rb', line 825

def meet?(c, pos)
  return @collisions.detect{|cc| c.meet?(pos, cc[0], cc[1])}
end

#meet_all?(c, pos) ⇒ Boolean

当たり判定を行う(配列要素がcとピクセル単位で隣り合っている)

隣り合ったコリジョンが一つでもあれば、すべてのコリジョンの配列を返す 隣り合ったコリジョンが無い場合はnilを返す

c

判定対象のコリジョンインスタンス

pos

cの位置(Point/Rect/Square構造体、もしくは2要素の配列)

返却値

コリジョンと本体の対の配列。

Returns:

  • (Boolean)

875
876
877
# File 'lib/Miyako/API/collision.rb', line 875

def meet_all?(c, pos)
  return @collisions.select{|cc| c.meet?(pos, cc[0], cc[1])}
end

#tap(idx) {|@collisions[idx][0], @collisions[idx][1]| ... } ⇒ Object

タッピングを行う

ブロックを渡すことにより、タッピングを行う ブロック内の引数は、|コリジョン,本体|の2が渡される

idx

配列のインデックス

返却値

自分自身を返す

Yields:

  • (@collisions[idx][0], @collisions[idx][1])

804
805
806
807
# File 'lib/Miyako/API/collision.rb', line 804

def tap(idx)
  yield @collisions[idx][0], @collisions[idx][1]
  return self
end