Refactor collider to collaborate with linked_list.
The only use of a collider is intertwined with the ship list, so I can combine the "prepare to yoink" and "populate collider" and "iterate list" steps, and I can combine the "hide" and "yoink" steps. This doesn't save tokens now but it's about to, when I use the eship collider to test pship collision.
This commit is contained in:
		| @@ -259,28 +259,11 @@ function updategame() | |||||||
|  |  | ||||||
| 	-- many bullets and many enemy ships; | 	-- many bullets and many enemy ships; | ||||||
| 	-- use bucket collider for efficiency | 	-- use bucket collider for efficiency | ||||||
|  |  local eship_collider = collider.new{from=eships} | ||||||
|  |  | ||||||
|  local eship_collider, pp = collider.new(), eships |  | ||||||
|  eships:strip(function(s) |  | ||||||
|   eship_collider:insert(s) |  | ||||||
|   s.prev = pp |  | ||||||
|   pp = s |  | ||||||
| end) |  | ||||||
|  |  | ||||||
|  -- lose tokens, save time: |  | ||||||
|  -- unroll `strip` to avoid |  | ||||||
|  -- function call overhead |  | ||||||
|  pbullets:strip(function(pb) |  pbullets:strip(function(pb) | ||||||
|   for es in all(eship_collider:get_collisions(pb)) do |   for es in all(eship_collider:get_collisions(pb)) do | ||||||
|    if es:hitbullet(pb) then |    if (es:hitbullet(pb)) eship_collider:yoink(es) | ||||||
|     eship_collider:hide(es) |  | ||||||
|     es.prev.next=es.next |  | ||||||
|     if es.next then |  | ||||||
|      es.next.prev = es.prev |  | ||||||
|     else |  | ||||||
|      eships.tail = es.prev |  | ||||||
|     end |  | ||||||
|    end |  | ||||||
|    if (pb:hitship(es)) return true |    if (pb:hitship(es)) return true | ||||||
|   end |   end | ||||||
|  end) |  end) | ||||||
| @@ -1446,6 +1429,21 @@ end | |||||||
| collider = mknew{ | collider = mknew{ | ||||||
|  init = function(x) |  init = function(x) | ||||||
|   x.suppress = {} |   x.suppress = {} | ||||||
|  |   local p, n = x.from, x.from.next | ||||||
|  |   while n do | ||||||
|  |    -- insert | ||||||
|  |    for i in all(collider_indexes(hurtbox(n))) do | ||||||
|  |     local a = x[i] | ||||||
|  |     if not a then | ||||||
|  |      a = {} | ||||||
|  |      x[i] = a | ||||||
|  |     end | ||||||
|  |     add(a, n) | ||||||
|  |    end | ||||||
|  |    -- prepare yoink | ||||||
|  |    n.prev = p | ||||||
|  |    p = n | ||||||
|  |   end | ||||||
|  end, |  end, | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1459,21 +1457,15 @@ function collider_indexes(box) | |||||||
|  return ret |  return ret | ||||||
| end | end | ||||||
|  |  | ||||||
| function collider:insert(item) | function collider:yoink(item) | ||||||
|  -- todo: separate "big items" list? |  | ||||||
|  local bdx = collider_indexes(hurtbox(item)) |  | ||||||
|  for i in all(bdx) do |  | ||||||
|   local x = self[i] |  | ||||||
|   if not x then |  | ||||||
|    x = {} |  | ||||||
|    self[i] = x |  | ||||||
|   end |  | ||||||
|   add(x, item) |  | ||||||
|  end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| function collider:hide(item) |  | ||||||
|  self.suppress[item]=true |  self.suppress[item]=true | ||||||
|  |  local p,n = item.prev,item.next | ||||||
|  |  p.next = n | ||||||
|  |  if n then | ||||||
|  |   n.prev = p | ||||||
|  |  else | ||||||
|  |   self.from.tail = p | ||||||
|  |  end | ||||||
| end | end | ||||||
|  |  | ||||||
| function collider:get_collisions(item) | function collider:get_collisions(item) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user