Colisão com box2D

9 respostas
H

Pessoal, estou desenvolvendo um jogo RPG isométrico onde a física é com o Box2D, porém, quando um personagem colide com outro esse outro é empurrado e quero que ele fique parado e o body dele tem que ser dynamic.

Obrigado.

9 Respostas

ViniGodoy

Por que o body dele tem que ser Dynamic? Não pode ser Kinematic?

H

na verdade seria o ideal pois, não preciso da gravidade, forças e etc… somente colisão mesmo. Porém se os kinematic não colidem?

ViniGodoy

Os kinematic bodies colidem normalmente, igual ao dynamic body. A única diferença é que eles não serão movimentados pelo motor de física.
São o tipo de corpo ideal para deixar em locais do cenário que se movem e que objetos físicos podem colidir.

H

Coloquei o personagem como DYNAMIC e um inimigo como KINEMATIC só que quando o personagem colide continua empurrando o kinematic.

ViniGodoy

Estranho, poste seu código. E veja o que diz a documentação oficial da box2d:

Se seu kinematic body está se movendo em resposta a força, é porque tem coisa errada no seu código.

H
function createPhysics(object)
  local physics = {}   
  local body = world:addBody(MOAIBox2DBody.DYNAMIC)
  if object.name == 'enemy' then  //COLOQUEI ESSA VERIFICAÇÃO SOMENTE PARA VERIFICAR SE É O PERSONAGEM OU O INIMIGO E DEFINIR O TIPO DE BODY
    local body = world:addBody(MOAIBox2DBody.KINEMATIC)    
  end
  local prop = object.renderer
  local x,y = object:getPos()
  local width, height = prop:getSize()
  local xMin, yMin, xMax, yMax = -width / 2, -height / 2, width / 2, height / 2   
  
  
  prop:setPos(xMin, yMin)
  prop:setParent(body)
  prop.body = body
  body.prop = prop     
  
  body:setTransform(x+32, y-16)    
  
  physics.body = body
  poly = {
    0, -16,
    32, 0,
    0, 16,
    -32, 0,
  }
  physics.fixture = body:addPolygon (poly)
  physics.fixture:setCollisionHandler ( onCollide, MOAIBox2DArbiter.ALL)  
  physics.fixture:setRestitution(0)
 
  body:setFixedRotation(0) 
  body:resetMassData()  
  return physics
end

function onCollide (event, fixtureA, fixtureB, arbiter)
  
	if event == MOAIBox2DArbiter.BEGIN then    
		print ( 'begin!')
	end
	
	if event == MOAIBox2DArbiter.END then
		print ( 'end!')
	end
	
	if event == MOAIBox2DArbiter.PRE_SOLVE then
		print ( 'pre!' )
	end
	
	if event == MOAIBox2DArbiter.POST_SOLVE then
		print ( 'post!' )  
	end
end
ViniGodoy

Que linguagem é essa? Isso certamente não é java.

ViniGodoy

Tópico movido para o fórum de outras linguagens. Por que abriu em Java Básico?

ViniGodoy

É difícil dizer qual é o problema. O MoaiSDK parece ter alterado bastante coisa do funcionamento básico da Box2D.
Na Box2D original, não existe esse método addBody, nem esses Arbiter de colisões.

Você seria obrigado a chamar createBody passando um BodyDef. E teria mais alguns passos na criação de um corpo físico. Você também teria que usar um listener de colisão no mundo.

Só lendo a documentação e entendendo direito o que as camadas inseridas na sua API fazem para saber se não é ela mesmo que está aplicando a força no kinematic body sem que você peça.

Criado 20 de abril de 2013
Ultima resposta 20 de abr. de 2013
Respostas 9
Participantes 2