2012-04-15 3 views
2

J'ai quelques problèmes avec les formes personnalisées en couronne.Corona SDK corps physiques personnalisés

Voici mon code et ce qu'il fait, c'est que j'ajoute des sphères à la scène afin qu'elles tombent dans un panier, ce panier est l'objet forme personnalisée que j'ai défini dans la fonction newBasket(), le problème c'est que le panier entre en collision avec l'objet au sol mais il ne heurte pas les sphères et je ne sais pas pourquoi, s'il vous plaît quelqu'un m'aider ici, je ne trouve pas de solution ailleurs, merci d'avance.

_W = display.contentWidth 
_H = display.contentHeight 

--Physics 
local physics = require("physics") 
physics.start() 
physics.setDrawMode("debug") 

-- iOS 
display.setStatusBar(display.HiddenStatusBar) 

-- screen boundaries 
local ground = display.newRect(0, _H, _W, 5) 
local leftWall = display.newRect(0,0,1,_H) 
local rightWall = display.newRect(_W,0,1,_H) 
physics.addBody(ground, "static", {friction = .2, bounce = .1}) 
physics.addBody(leftWall, "static", {friction = .2, bounce = .1}) 
physics.addBody(rightWall, "static", {friction = .2, bounce = .1}) 

local function newBasket() 
    local body = display.newImage("assets/basket.png") 
    body.x = 0 body.y = 0 

    local physics_body = {} 
    physics_body["basket"] = { 
     { 
      --LeftArm 
      density = 10, friction = 10, bounce = 0.15, 
      shape = {-126, 40, -110, 40, -140, -64, -156, -64} 

     }, 

     { 
      --Bottom 
      density = 10, friction = 1, bounce = 0, 
      shape = {-121, 60, 125, 60, 128, 40, -126, 40} 

     }, 
     { 
      --RightArm 
      density = 10, friction = 10, bounce = 0.15, 
      shape = {113, 40, 129, 40, 158, -64, 143, -64} 

     } 

    } 
    physics.addBody(body, unpack(physics_body["basket"])) 

    return body 
end 

local basket = newBasket() 
basket.x = _W * .5 basket.y = _H - 100 

local function newPlanet() 

    local planets = { 
     {img = "bigBall.png", radius = 45}, 
     {img = "mediumBall.png", radius = 30}, 
     {img = "smallBall.png", radius = 20} 
    } 

    local n = math.random(1,3) 

    local img = "assets/" .. planets[n].img 
    local ball = display.newImage(img) 
    ball.x = math.random((_W * 0.5) -100, (_W * 0.5) + 100) ball.y = 0 

    physics.addBody(ball, {bounce = 0.3, radius = planets[n].radius}) 
end 

local function spawnPlanets(number) 

    local function spawn(e) 
     newPlanet() 

     if(e.count == number) then 
      timer.cancel(tmr) 
      tmr = nil 
     end 
    end 

    tmr = timer.performWithDelay(500, spawn, number) 
end 

spawnPlanets(20) 

Répondre

3

Selon le manual: Si est spécifié une forme

, alors les limites du corps suivent le polygone prévu par la forme. Notez que le nombre maximum de côtés par forme est de huit, et tous les angles doivent être convexes. [...] Les coordonnées de forme doivent être définies dans le sens des aiguilles d'une montre, et la forme résultante doit être uniquement convexe.

Vous avez donc deux problèmes en cours d'exécution. D'abord, les formes doivent être définies dans le sens des aiguilles d'une montre, comme je l'ai fait dans l'exemple ci-dessous. Deuxièmement, toutes les formes doivent être convexes (même des formes de corps complexes) afin que vous ne puissiez rien faire qui se retourne sur lui-même comme un croissant de lune ou un panier.

Malheureusement, cela signifie que vous devez fabriquer votre panier en 3 formes distinctes. En outre, comme ils sont maintenant des formes séparées, ils ne resteront pas collés ensemble quand ils tombent (sauf si vous utilisez joints). Je viens de faire le panier 3 corps statiques et le mettre dans le bon endroit pour commencer:

local function newBasket() 
    local physics_body = {} 
    physics_body["basket"] = { 
     { 
      --LeftArm 
      density = 10, friction = 10, bounce = 0.15, 
      shape = {-126, 40, -156, -64, -140, -64, -110, 40 } 

     }, 

     { 
      --Bottom 
      density = 10, friction = 1, bounce = 0, 
      shape = {-121, 60,-126, 40, 128, 40, 125, 60 } 

     }, 
     { 
      --RightArm 
      density = 10, friction = 10, bounce = 0.15, 
      shape = {113, 40, 143, -64, 158, -64, 129, 40 } 

     } 

    } 
    for k,shape in pairs(physics_body["basket"]) do 
     local body = display.newRect(0, 0, 200, 100) 
     body.x = display.contentCenterX 
     body.y = display.contentHeight - 60 

     physics.addBody(body, 'static', shape) 
    end 
end 

newBasket() 
+0

Vous êtes monsieur génial !, ouais je suivais un vieux tutoriel sur les objets physic complexes et le type défini les formes Dans l'ordre du CounterClokwise, j'ai lu la documentation mais je ne comprenais pas pourquoi ce mec fonctionnait bien, j'ai même essayé d'utiliser les formes dans le sens des aiguilles d'une montre mais je n'ai pas travaillé ... j'ai encore besoin de comprendre ce qui s'est passé. pour "phrase que vous avez faite là, vous avez déclaré un newRect? ... hmm et que contentCenter et Height sont le centre local du corps de la physique je suppose, alors pourquoi avez-vous déclaré un newRect? – ershin69

+0

J'ai utilisé un rectangle parce que je n'avais pas vos images et dans Corona, vos corps physiques doivent être attachés à des objets d'affichage. Vous pouvez simplement remplacer le newRect par l'image de votre choix. display.contentCenterX est le centre de l'écran. – six8