2015-05-09 26 views
0

我在試圖找出遊戲機制時碰到過一個理論寫作塊。基本上,我想有兩個直到它們碰撞的圓圈,當它們碰撞時,它們開始收縮,直到它們的半徑爲0,並且它們再次開始增長,碰撞等。OOP中的物理碰撞檢測,包含一個對象的兩次迭代

我明白物理碰撞是如何工作的,我瞭解如何使用圓形包圍盒來檢測碰撞。我不明白的是如何創建對象「circle」的兩次迭代,並檢測同一對象的兩次迭代之間的碰撞。如何引用或檢測函數中的兩個不同的圓圈?我也希望這可擴展,所以我可以有3,4或更多的圈子互相交流。

如果這樣做沒有意義,這裏的一些代碼,我的工作:

local function screenTap(event) 
    circle = display.newCircle(event.x, event.y, 3) 
end 

display.currentStage:addEventListener("tap", screenTap) 

當點擊屏幕,圓的半徑3.我還沒有完全想通了,那裏出現如何隨着時間推移增長半徑,但這是我可以研究的。

這是在Lua中,但我並不需要Lua中的代碼答案。任何指針(heh)或幫助表示讚賞。

回答

2

爲什麼用物理射擊?

您有(至少)兩個圓,這意味着(對於每一對,你看圓的)你有兩個點p ,P 和半徑ř,R 。

取上述兩種點的差異(p v = P -p ),並判斷該矢量的長度(或 「點差」):DIST =(P v。 x + p v.y )1/2。如果r + r ≥ dist,則兩個圓圈重疊 - 即存在碰撞。


當點擊屏幕,一個圓圈在那裏出現的半徑3.我還沒有完全想出如何隨時間而增加的半徑,這件事情我可以研究。

看來你現在在做什麼,你沒有任何點或可用的圓形表示,只是畫在屏幕上的東西?或者,也許你有一個變量存儲最近的圈子(你「忘記」所有其他圈子?)

如果是這樣的話,那麼做你想做的事情是不可能的。您需要在某處存儲圓的座標,半徑和當前狀態(增長或縮小),例如,在一個數組中。

創建一個對象

的兩次迭代是完全沒有意義的事情。迭代與循環有關。你可能混淆層:你所說的「對象」可能是一個類和你所說的「迭代」是一個對象實例?

如何引用或檢測函數中的兩個不同圓圈?

您需要對圈子的信息有一些表示。 (看起來你沒有這個。)如果你有這個,那麼你只需要看看你存儲事物的變量(或者將你的信息傳遞給那個函數)。


因爲我已經建立了這個在不久前,這裏的一些代碼,你也許可以適應:

SPEED = 40 
circles = { } 

-- called once per frame (dt is the time since the last frame) 
function love.update(dt) 
    -- grow/shrink 
    for i, circle in ipairs(circles) do 
     local dir = circle.direction == "grow" and 1 or -1 
     circle.r = circle.r + SPEED*dir*dt 
     if circle.r <= 0 then 
      circle.r, circle.direction = -circle.r, "grow" 
     end 
    end 
    -- collide 
    for i, c1 in ipairs(circles) do 
     for j, c2 in ipairs(circles) do 
      if i ~= j then 
       if c1.r + c2.r > ((c2.x-c1.x)^2 + (c2.y-c1.y)^2)^(1/2) then 
        c1.direction, c2.direction = "shrink", "shrink" 
       end 
      end 
     end 
    end 
end 

-- called once per frame, draws the circles 
function love.draw() 
    for i, circle in ipairs(circles) do 
     love.graphics.circle("fill", circle.x, circle.y, circle.r) 
    end 
end 

-- add new circles on click 
function love.mousepressed(x, y, btn) 
    circles[#circles+1] = { x = x, y = y, r = 0, direction = "grow" } 
end 

-- you can press escape to quit 
keys = { 
    escape = love.event.quit, 
} 
function love.keypressed(k) 
    local action = keys[k] 
    if action then return action(k) end 
end 

(如果你想運行此爲-是:你需要love2d,然後只需將上面的文件粘貼到文件main.lua中,然後在該目錄中運行love .,或者等同地將包含的文件夾拖到love2d可執行文件或類似的東西上即可。)

+0

一切都會讓很多現在感覺,這正是我所期待的。謝謝! –