Class: Miyako::CollisionsEx

Inherits:
Delegator
  • Object
show all
Defined in:
lib/Miyako/API/collision.rb

Overview

コリジョン管理クラス

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(collisions = []) ⇒ CollisionsEx

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

利用できる要素はCollisionEx,CircleCollisionEx(か、その派生)のみ

collisions

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

返却値

作成されたインスタンス



938
939
940
941
# File 'lib/Miyako/API/collision.rb', line 938

def initialize(collisions=[])
  @collisions = Array.new(collisions)
  @collision = nil
end

Instance Attribute Details

#collisionObject

Returns the value of attribute collision.



932
933
934
# File 'lib/Miyako/API/collision.rb', line 932

def collision
  @collision
end

Instance Method Details

#__getobj__Object

:nodoc:



943
944
945
# File 'lib/Miyako/API/collision.rb', line 943

def __getobj__ #:nodoc:
  @collisions
end

#__setobj__(obj) ⇒ Object

:nodoc:



947
948
# File 'lib/Miyako/API/collision.rb', line 947

def __setobj__(obj) #:nodoc:
end

#add(collision) ⇒ Object

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

collision

コリジョン

返却値

自分自身を返す



995
996
997
998
# File 'lib/Miyako/API/collision.rb', line 995

def add(collision)
  @collisions << collision
  return self
end

#append(collisions) ⇒ Object

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

collisions

コリジョンの配列

返却値

自分自身を返す



1003
1004
1005
1006
# File 'lib/Miyako/API/collision.rb', line 1003

def append(collisions)
  @collisions.concat(collisions)
  return self
end

#collision?(c) ⇒ Boolean

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

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

c

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

返却値

コリジョンの配列。

Returns:

  • (Boolean)


1013
1014
1015
1016
# File 'lib/Miyako/API/collision.rb', line 1013

def collision?(c)
  return nil if @collision and !@collision.collision?(c)
  collision_inner(c, []){|cc,c| cc.collision?(c) }
end

#cover?(c) ⇒ Boolean

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

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

c

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

返却値

コリジョンの配列。

Returns:

  • (Boolean)


1043
1044
1045
1046
# File 'lib/Miyako/API/collision.rb', line 1043

def cover?(c)
  return nil if @collision and !@collision.collision?(c)
  collision_inner(c, []){|cc,c| cc.cover?(c) }
end

#covered?(c) ⇒ Boolean

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

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

c

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

返却値

コリジョンの配列。

Returns:

  • (Boolean)


1063
1064
1065
1066
# File 'lib/Miyako/API/collision.rb', line 1063

def covered?(c)
  return nil if @collision and !@collision.collision?(c)
  collision_inner(c, []){|cc,c| cc.covers?(c) }
end

#covers?(c) ⇒ Boolean

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

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

c

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

返却値

コリジョンの配列。

Returns:

  • (Boolean)


1053
1054
1055
1056
# File 'lib/Miyako/API/collision.rb', line 1053

def covers?(c)
  return nil if @collision and !@collision.collision?(c)
  collision_inner(c, []){|cc,c| cc.covers?(c) }
end

#deep_dupObject

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

返却値

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



961
962
963
964
# File 'lib/Miyako/API/collision.rb', line 961

def deep_dup
  ret = self.dup
  ret.deep_dup_collision
end

#deep_dup_collisionObject

:nodocs:



954
955
956
957
# File 'lib/Miyako/API/collision.rb', line 954

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

#disposeObject

オブジェクトを解放する

返却値

なし



1070
1071
1072
1073
1074
# File 'lib/Miyako/API/collision.rb', line 1070

def dispose
  @collisions.clear
  @collisions = nil
  @collision = nil
end

#from_childrenObject

現在所持している配列から最大範囲のコリジョンを作成する

ただし、配列が空の時はnilを返す

返却値

生成したコリジョン(CollisionExクラスのインスタンス)



969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
# File 'lib/Miyako/API/collision.rb', line 969

def from_children
  return nil if @collisions.empty?
  array = []
  @collisions.each{|cc|
    if cc.class.method_defined?(:from_children)
      col = cc.from_children
      next unless col
      array << col.rect.to_square.to_a
    else
      rect = cc.rect.dup
      rect[0] += cc.pos[0]
      rect[1] += cc.pos[1]
      array << rect.to_square.to_a
    end
  }
  el = array.shift
  if array.length >= 1
    array = el.zip(*array)
    el = [array[0].min, array[1].min, array[2].max, array[3].max]
  end
  CollisionEx.new(Rect.new(el[0], el[1], el[2]-el[0]+1, el[3]-el[1]+1), Point.new(0,0))
end

#initialize_copy(obj) ⇒ Object

:nodoc:



950
951
952
# File 'lib/Miyako/API/collision.rb', line 950

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

#meet?(c) ⇒ Boolean

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

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

c

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

返却値

コリジョンの配列。

Returns:

  • (Boolean)


1033
1034
1035
1036
# File 'lib/Miyako/API/collision.rb', line 1033

def meet?(c)
  return nil if @collision and !@collision.collision?(c)
  collision_inner(c, []){|cc,c| cc.meet?(c) }
end