2012-03-14 3 views
1

아래 코드는 내 현재 코드이며 무작위 각도의 벽과 공의 방향을 기준으로 적절한 굴절 각도로 내 공을 반사하려고합니다. 내 문제는 내가 찍은 것입니다. 기본적인 물리학 수업과 방정식 "입사각 = 굴절각"도 알기 때문에 이것은 as3의 첫해입니다. 그래서 제 코딩은 다소 조잡합니다. 각도가 꺼져있는 것 같습니다 ... 문제는 코드 "Bullet.hitTestObject (myblockadeHolder [t])"입니다. 감사합니다.물리학 각도 바운스 as3

stage.addEventListener(Event.ENTER_FRAME,rotate); 
var _trueRotation:Number; 
var _dx:Number; 
var _dy:Number; 
function rotate (e:Event){ 
// calculate rotation based on mouse X & Y 
    _dx = Turret.x - stage.mouseX; 
    _dy = Turret.y - stage.mouseY; 

    // which way to rotate 
    var rotateTo:Number = getDegrees(getRadians(_dx, _dy)); 

    // keep rotation positive, between 0 and 360 degrees 
    if (rotateTo > Turret.rotation + 180) rotateTo -= 360; 
    if (rotateTo < Turret.rotation - 180) rotateTo += 360; 

    // ease rotation 
    _trueRotation = (rotateTo - Turret.rotation - 90)/3; 

    // update rotation 
    Turret.rotation += _trueRotation;   
} 
//Turret Rotation 
//Create an array to hold multiple sprites 
var mySpriteHolder:Array = []; 
//Create a counter to keep track of the number of sprites 
var lbCounter:int = 0; 
//Maximum number of sprites on the canvas 
var maxLB:int = 1; 
//Keypress Code 
stage.addEventListener(MouseEvent.CLICK, dropBullet); 
//Function for the mouse event to fire bullet 
function dropBullet(evt:MouseEvent):void{ 

    var bcos:Number = Math.cos((Turret.rotation - 90) * Math.PI/180); 
    var bsin:Number = Math.sin((Turret.rotation - 90) * Math.PI/180); 

    //starting x and y 
    var startx:int = Turret.x + (70 * bcos); 
    var starty:int = Turret.y + (70 * bsin); 
    //calculates where the bullet needs to go by aiming in front of the gun 
    var endx:int = Turret.x + (100 * bcos); 
    var endy:int = Turret.y + (100 * bsin); 

    var Bullet:MovieClip = new bullet(); 

    Bullet.x = startx; 
    Bullet.y = starty; 

    Bullet.xspeed = (endx - startx)/5; 
    Bullet.yspeed = (endy - starty)/5; 

    mySpriteHolder.push(Bullet); 
    stage.addChild(Bullet); 

    //this calls the move down function 
    stage.addEventListener(Event.ENTER_FRAME,BulletFire); 
} 
//Function to shoot bullet 
var Points:Number = 0; 
var Life:Number = 100; 
stage.addEventListener(Event.ENTER_FRAME, TextCounter); 
function BulletFire(evt:Event):void{ 
    var Bullet:MovieClip; 
    //Use a for loop to move the Bullets 
    for(var i:int=mySpriteHolder.length-1; i>=0; i--){ 
     Bullet = mySpriteHolder[i]; 
    //Bounds Collision 
    if(Bullet.hitTestObject(Up)){ 
     Bullet.yspeed*=-1; 
    } 
    if(Bullet.hitTestObject(Lower)){ 
     Bullet.yspeed*=-1; 
    } 
    if(Bullet.hitTestObject(Left)){ 
     Bullet.xspeed*=-1; 
    } 
    if(Bullet.hitTestObject(Right)){ 
     Bullet.xspeed*=-1; 
    } 
    if(Bullet.hitTestObject(Tank)){ 
     stage.removeChild(Bullet); 
     mySpriteHolder.splice(i,1); 
     lbCounter --; 
     Life -= 10; 
    } 
    //Blockade Collision 
    for(var t in myBlockadeHolder){ 
      if(Bullet.hitTestObject(myBlockadeHolder[t])){ 
       _trueRotation*=2 
      var newAngle = (180 - (_trueRotation) - (smallangle))*-1; 
      var newXspeed = Math.cos(newAngle); 
      var newYspeed = Math.sin(newAngle); 
      Bullet.xspeed = newXspeed+2.5; 
      Bullet.yspeed = newYspeed+2.5; 

      } 
     } 
    //Target Collision 
     for(var c in mytargetHolder){ 
      if(Bullet.hitTestObject(mytargetHolder[c])){ 
      stage.removeChild(Bullet); 
      mySpriteHolder.splice(i,1); 
      lbCounter --; 
      Points += 10; 
      mytargetHolder[c].y = Math.random()*380 + 10; 
      mytargetHolder[c].x = Math.random()*380 + 10; 
       while(mytargetHolder[c].hitTestObject(Turret)){ 
        mytargetHolder[c].y = Math.random()*380 + 10; 
        mytargetHolder[c].x = Math.random()*380 + 10; 
       } 
      } 
      for(var a in mytargetHolder){ 
       for(var s in mytargetHolder){ 
        while(mytargetHolder[a].hitTestObject(mytargetHolder[s])&& a!=s){ 
         mytargetHolder[a].y = Math.random()*380 + 10; 
         mytargetHolder[a].x = Math.random()*380 + 10; 
        } 
       } 
       for(var g in myBlockadeHolder){ 
        while(mytargetHolder[a].hitTestObject(myBlockadeHolder[g])&& a!=g){ 
         mytargetHolder[a].y = Math.random()*380 + 10; 
         mytargetHolder[a].x = Math.random()*380 + 10; 
        } 
       } 
      } 
     } 
     Bullet.y += Bullet.yspeed; 
     Bullet.x += Bullet.xspeed; 
    } 
}//Bullet Code 
stage.addEventListener(Event.ENTER_FRAME, HealthCheck); 
function HealthCheck(e:Event):void{ 
    if(Life<=0){ 
     stage.removeEventListener(MouseEvent.CLICK, dropBullet); 
     stage.removeEventListener(Event.ENTER_FRAME, BulletFire); 
     stage.removeEventListener(Event.ENTER_FRAME, droptarget); 
     stage.removeEventListener(Event.ENTER_FRAME, dropblockade); 
    } 
}//Health Code 
//variables for blockade 
var myblockadeSprite:Sprite; 
//blockade is the linkage name in the library 
var blockade:Blockade; 
//Create an array to hold multiple sprites 
var myBlockadeHolder:Array = new Array(); 
//Create a counter to keep track of the number of sprites 
var LbCounter:int = 0; 
//Maximum number of sprites on the canvas 
var maxlb:int = 6; 
//Keypress Code 
stage.addEventListener(Event.ENTER_FRAME, dropblockade); 
//Function for the mouse event to fire blockade 
function dropblockade(evt:Event):void{ 
    for(var i:int=0;i<maxlb; i++){ 
     //PLACE DO LOOP INSIDE TO GENERATE EMPTY IN RANDOM COORDS 
     //add the blockades to the canvas 
     myblockadeSprite = new Sprite(); 
     stage.addChild(myblockadeSprite); 
     //Get the actual picture from the library 
     blockade = new Blockade(); 
     myblockadeSprite.addChild(blockade); 
     //Going to load up the array with the sprites 
     myBlockadeHolder[i] = myblockadeSprite; 
     myBlockadeHolder[i].y = Math.random()*390 + 10; 
     myBlockadeHolder[i].x = Math.random()*390 + 10; 
     myBlockadeHolder[i].rotation = Math.random()*360; 
     while(myBlockadeHolder[i].hitTestObject(Tank)){ 
      myBlockadeHolder[i].y = Math.random()*390 + 10; 
      myBlockadeHolder[i].x = Math.random()*390 + 10; 
     } 
    } 
    for(var t:int=0;t<maxlb; t++){ 
     for(var d:int=0;d<maxlb; d++){ 
      while(myBlockadeHolder[t].hitTestObject(myBlockadeHolder[d])&& t!=d){ 
      myBlockadeHolder[t].y = Math.random()*390 + 10; 
      myBlockadeHolder[t].x = Math.random()*390 + 10; 
      } 
     } 
    } 
    stage.removeEventListener(Event.ENTER_FRAME, dropblockade); 
}//Blockade Code 
//variables for target 
var mytargetSprite:Sprite; 
//target is the linkage name in the library 
var target:Target; 
//Create an array to hold multiple sprites 
var mytargetHolder:Array = new Array(); 
//Create a counter to keep track of the number of sprites 
var TargetCounter:int = 0; 
//Maximum number of sprites on the canvas 
var maxtrgs:int = 3; 
//Keypress Code 
stage.addEventListener(Event.ENTER_FRAME, droptarget); 
function droptarget(evt:Event):void{ 
    for(var i:int=0;i<maxtrgs; i++){ 
     //PLACE DO LOOP INSIDE TO GENERATE EMPTY IN RANDOM COORDS 
     //add the targets to the canvas 
     mytargetSprite = new Sprite(); 
     stage.addChild(mytargetSprite); 
     //Get the actual picture from the library 
     target = new Target(); 
     mytargetSprite.addChild(target); 
     //Going to load up the array with the sprites 
     mytargetHolder[i] = mytargetSprite; 
     mytargetHolder[i].y = Math.random()*390 + 10; 
     mytargetHolder[i].x = Math.random()*390 + 10; 
     while(mytargetHolder[i].hitTestObject(Tank)){ 
      mytargetHolder[i].y = Math.random()*390 + 10; 
      mytargetHolder[i].x = Math.random()*390 + 10; 
     } 
    } 
    for(var t:int=0;t<maxtrgs; t++){ 
     for(var d:int=0;d<maxtrgs; d++){ 
      while(mytargetHolder[t].hitTestObject(mytargetHolder[d])&& t!=d){ 
      mytargetHolder[t].y = Math.random()*390 + 10; 
      mytargetHolder[t].x = Math.random()*390 + 10; 
      } 
     } 
     for(var w:int=0;w<maxtrgs; w++){ 
      while(mytargetHolder[t].hitTestObject(myBlockadeHolder[w])&& t!=w){ 
      mytargetHolder[t].y = Math.random()*390 + 10; 
      mytargetHolder[t].x = Math.random()*390 + 10; 
      } 
     } 
    } 
    stage.removeEventListener(Event.ENTER_FRAME, droptarget); 
}//Target Code 
function getRadians(delta_x:Number, delta_y:Number):Number{ 
    var r:Number = Math.atan2(delta_y, delta_x); 

    if (delta_y < 0){ 
     r += (2 * Math.PI); 
     } 
    return r; 
} 

/** 
* Get degrees 
* @param radians Takes radians 
* @return Returns degrees 
*/ 
function getDegrees(radians:Number):Number{ 
    return Math.floor(radians/(Math.PI/180)); 
} 
function TextCounter(e:Event):void{ 
    PointCounter.text = String(Points); 
    LifeCounter.text = String(Life); 
} 

답변

1

저는 실제로 물리학 자 아니지만이 문제를 해결하는 데 도움이되는 기사/학습서로 안내 할 수 있습니다. 그렇다면 답안으로 고정 코드를 올리십시오.이 질문에 대한 더 나은 /보다 직접적인 대답이기 때문입니다. 그렇지 않다면 잘만하면 다른 사람이 더 좋은 답변을 찾을 수 있습니다.

http://blog.generalrelativity.org/actionscript-30/dynamic-circlecircle-collision-detection-in-actionscript-3/