Advertisement
Guest User

Untitled

a guest
Oct 4th, 2017
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haxe 11.43 KB | None | 0 0
  1. package entities;
  2.  
  3. import entities.npcs.Drone;
  4. import entities.npcs.Smarty;
  5. import entities.weapons.Grenade;
  6. import entities.weapons.Item;
  7. import entities.weapons.Bullet;
  8. import flixel.addons.nape.FlxNapeSpace;
  9. import flixel.addons.nape.FlxNapeSprite;
  10. import flixel.system.FlxAssets.FlxGraphicAsset;
  11. import flixel.tweens.FlxEase;
  12. import flixel.tweens.FlxTween;
  13. import flixel.group.FlxGroup;
  14. import flixel.addons.display.FlxExtendedSprite;
  15. import flixel.math.FlxRandom;
  16. import flixel.ui.FlxButton;
  17. import flixel.FlxG;
  18. import flixel.group.FlxGroup;
  19. import flixel.FlxObject;
  20. import flixel.math.FlxPoint;
  21. import flixel.util.FlxSave;
  22. import flixel.FlxState;
  23. import flixel.FlxSprite;
  24. import flixel.text.FlxText;
  25. import flixel.util.FlxColor;
  26. import flixel.util.FlxTimer;
  27. import flixel.math.FlxRandom;
  28. import flash.display.BlendMode;
  29. import flash.display.BitmapData;
  30. import flash.display.Sprite;
  31. import flash.geom.Matrix;
  32. import flixel.addons.nape.FlxNapeSprite;
  33. import flixel.addons.nape.FlxNapeSpace;
  34. import flixel.FlxG;
  35. import flixel.FlxSprite;
  36. import flixel.group.FlxGroup;
  37. import flixel.text.FlxText;
  38. import flixel.tweens.FlxEase;
  39. import flixel.tweens.FlxTween;
  40. import flixel.math.FlxAngle;
  41. import flixel.math.FlxPoint;
  42. import nape.callbacks.CbEvent;
  43. import nape.callbacks.CbType;
  44. import nape.callbacks.InteractionCallback;
  45. import nape.callbacks.InteractionListener;
  46. import nape.callbacks.InteractionType;
  47. import nape.geom.GeomPoly;
  48. import nape.geom.GeomPolyList;
  49. import nape.geom.Ray;
  50. import nape.geom.RayResultList;
  51. import nape.geom.Vec2;
  52. import nape.phys.Body;
  53. import nape.phys.BodyType;
  54. import nape.phys.Material;
  55. import nape.shape.Polygon;
  56. import particles.ParticlesGroup;
  57. import particles.BaseParticle;
  58. import states.StateGameplay;
  59. import states.StateInventory.SubStateWeapons;
  60. //import flixel.effects.FlxSpriteFilter;
  61. //import flash.filters.BlurFilter;
  62.  
  63. /**
  64.  * ...
  65.  * @author ...
  66.  */
  67. class Explodable extends FlxNapeSprite
  68. {  
  69.    
  70.     public function new(X:Float, Y:Float, ?SimpleGraphic:FlxGraphicAsset )
  71.     {
  72.         super(X, Y, SimpleGraphic,false);//don't create default body, we gonna tweak it
  73.            
  74.         antialiasing = true;
  75.        
  76.         createRectangularBody(width*0.95, height*0.95);//use less of the sprite so collision is smaller
  77.  
  78.         body.userData.flxSprite = this;
  79.            
  80.         setBodyMaterial(0.3, 1, 0.5);
  81.        
  82.         health = 5;
  83.        
  84.         //wait a bit, StateGameplay.instance.napeLevel might be null
  85.         new FlxTimer().start(0.5, function(timer:FlxTimer):Void
  86.         {
  87.             if (StateGameplay.instance.napeLevel != null)
  88.             {
  89.                 var groupTest:CbType = new CbType();
  90.                 var groupMap:CbType = new CbType();
  91.                 body.cbTypes.add(groupTest);
  92.  
  93.                 StateGameplay.instance.napeLevel.body.cbTypes.add(groupMap);
  94.  
  95.                 FlxNapeSpace.space.listeners.add(new InteractionListener(CbEvent.BEGIN, InteractionType.COLLISION, groupMap, groupTest, onColides));
  96.             }
  97.         } );
  98.  
  99.        
  100.     }
  101.    
  102.     function onColides(callback:InteractionCallback)
  103.     {
  104.         if (body != null)
  105.         {
  106.         //  trace("onColides - velocity: " + ZMath.vectorVelocity(body.velocity.x, body.velocity.y));
  107.            
  108.             var impact_force:Float = ZMath.vectorVelocity(body.velocity.x, body.velocity.y);
  109.             var impact_volume:Float = impact_force / 100;
  110.                    
  111.             if (impact_force >= 200)
  112.             {
  113.                 FlxG.sound.play("assets/sounds/physics/barrel_impact_hard"+FlxG.random.int(1,2)+".ogg",impact_volume).proximity(getMidpoint().x,getMidpoint().y,FlxG.camera.target, FlxG.width);
  114.             }
  115.             else
  116.             {
  117.                 FlxG.sound.play("assets/sounds/physics/barrel_impact_soft"+FlxG.random.int(1,3)+".ogg",impact_volume).proximity(getMidpoint().x,getMidpoint().y,FlxG.camera.target, FlxG.width);
  118.             }
  119.         }
  120.         else//body is null, most likely the little pieces created
  121.         {
  122.         //  trace(callback.int2.userData.flxSprite);
  123.              
  124.             //lets grab the body involved in the interaction
  125.             var orgPhySpr:FlxNapeSprite = callback.int2.userData.flxSprite;
  126.            
  127.             if (orgPhySpr != null)
  128.             {                  
  129.                 var impact_force:Float = ZMath.vectorVelocity(orgPhySpr.body.velocity.x, orgPhySpr.body.velocity.y);
  130.                 var impact_volume:Float = impact_force / 100;
  131.          
  132.                 //      trace("orgPhySpr::onColides- velocity: " + ZMath.vectorVelocity(orgPhySpr.body.velocity.x, orgPhySpr.body.velocity.y));
  133.  
  134.                 FlxG.sound.play("assets/sounds/physics/barrel_impact_soft"+FlxG.random.int(1,3)+".ogg",impact_volume).proximity(getMidpoint().x,getMidpoint().y,FlxG.camera.target, FlxG.width);
  135.             }
  136.         }
  137.     }
  138.    
  139.     public function explode():Void
  140.     {
  141.     //  trace("explode");
  142.             for (i in 0...15)
  143.             {
  144.             //  trace("cut?");
  145.                 var source:FlxPoint = FlxPoint.get(getMidpoint().x+FlxG.random.float(-50,50),getMidpoint().y+FlxG.random.float(-50,50));
  146.                 var mouse:FlxPoint = getMidpoint();
  147.  
  148.                 var deg:Float = source.angleBetween(mouse) - 90;
  149.                 var groundPoint = FlxPoint.get(source.x + (FlxG.height-source.y) / Math.tan(deg * FlxAngle.TO_RAD), FlxG.height);
  150.  
  151.                 var sP = Vec2.get(source.x, source.y);
  152.                 var eP = Vec2.get(groundPoint.x, groundPoint.y+1);  // +1 make sure no tiny gap in between groundPoint and groundY
  153.                 var ray = Ray.fromSegment(sP, eP);
  154.                
  155.                 if (ray.maxDistance > 0)
  156.                 {
  157.                     var rayResultList:RayResultList = FlxNapeSpace.space.rayMultiCast(ray);
  158.                     for (rayResult in rayResultList)
  159.                     {
  160.                         var orgBody:Body = rayResult.shape.body;
  161.                         if (orgBody.isStatic())
  162.                             continue;
  163.                         var orgPoly:Polygon = rayResult.shape.castPolygon;
  164.                         // If the shape's not polygon eg. a circle, it can't get cut
  165.                         // You can use a regular polygon to simulate a circle instead
  166.                         if (orgPoly == null)
  167.                             continue;
  168.                         var orgPhySpr:FlxNapeSprite = orgBody.userData.flxSprite;
  169.                         if (orgPhySpr != null)
  170.                             applyCut(orgPhySpr, sP, eP);
  171.                     }
  172.                 }
  173.                
  174.                 sP.dispose();
  175.                 eP.dispose();
  176.             }
  177.            
  178.     }
  179.    
  180.     override public function update(elapsed:Float):Void
  181.     {  
  182.         super.update(elapsed);
  183.        
  184.         if (!alive)
  185.         return;
  186.    
  187.    
  188.        
  189.         FlxG.collide(this, StateGameplay.instance.bullets, collided);
  190.         FlxG.overlap(this, StateGameplay.instance.players, overlapped);
  191.    
  192.    
  193.  
  194.     }
  195.    
  196.     private function collided(Sprite1:FlxObject, Sprite2:FlxObject):Void
  197.     {
  198.         if (Std.is(Sprite1, Explodable) && Std.is(Sprite2, Bullet))
  199.         {
  200.             var thisBarrel:Explodable = cast(Sprite1, Explodable);
  201.             var bullet:Bullet = cast(Sprite2, Bullet);
  202.  
  203.            
  204.             thisBarrel.attacker = bullet.owner;
  205.             thisBarrel.hurt(bullet.owner.activeGun.damage);
  206.            
  207.             if (thisBarrel.body != null)
  208.             {
  209.                 thisBarrel.body.applyImpulse(new Vec2(bullet.velocity.x, bullet.velocity.y  ));
  210.  
  211.                 ParticlesGroup.emit(bullet.getMidpoint(), BaseParticle.SPARKS, FlxG.random.int(4, 8));
  212.                 FlxG.sound.play("assets/sounds/guns/Riccochet" + FlxG.random.int(1, 5) + ".ogg", FlxG.random.float(0.5, 1.0));
  213.                 FlxG.sound.play("assets/sounds/physics/barrel_impact_hard" + FlxG.random.int(1, 2) + ".ogg" );
  214.                             FlxG.sound.play("assets/sounds/guns/metal"+FlxG.random.int(1,3)+".ogg",FlxG.random.float(0.5,1.0));
  215.  
  216.  
  217.             }  
  218.         }  
  219.     }  
  220.    
  221.     private function overlapped(Sprite1:FlxObject, Sprite2:FlxObject):Void
  222.     {
  223.         if (Std.is(Sprite1, Explodable) && Std.is(Sprite2, Player))
  224.         {
  225.             var thisBarrel:Explodable = cast(Sprite1, Explodable);
  226.             var player:Player = cast(Sprite2, Player);
  227.            
  228.             if (thisBarrel.body != null)     
  229.             thisBarrel.body.applyImpulse(new Vec2(player.velocity.x*.5, player.velocity.y*.5  ));
  230.         }
  231.     }
  232.    
  233.     private function applyCut(orgPhySpr:FlxNapeSprite, sP:Vec2, eP:Vec2):Void
  234.     {
  235.         var orgBody = orgPhySpr.body;
  236.         var geomPoly = new GeomPoly(orgBody.shapes.at(0).castPolygon.worldVerts);
  237.         var geomPolyList:GeomPolyList = geomPoly.cut(sP, eP, true, true);
  238.        
  239.         // Make current FlxNapeSprite graphic (may rotated) a reference BitmapData
  240.         var bmp = new BitmapData(Math.ceil(orgBody.bounds.width), Math.ceil(orgBody.bounds.height), true, 0x0);
  241.         var mat = new Matrix();
  242.         mat.translate( -orgPhySpr.origin.x, -orgPhySpr.origin.y);
  243.         mat.rotate(orgPhySpr.angle * FlxAngle.TO_RAD % 360);
  244.         mat.translate(orgBody.position.x - orgBody.bounds.x, orgBody.position.y - orgBody.bounds.y);
  245.         bmp.draw(orgPhySpr.pixels, mat);
  246.        
  247.         if (geomPolyList.length > 1)
  248.         {
  249.             for (cutGeomPoly in geomPolyList)
  250.             {  
  251.                 // Make a new body in world space
  252.                 var cutPoly = new Polygon(cutGeomPoly);
  253.                 var cutBody = new Body(BodyType.DYNAMIC);
  254.                 cutBody.setShapeMaterials(Material.steel());
  255.                 cutBody.shapes.add(cutPoly);
  256.                 cutBody.align();
  257.                 // too small piece cause problem when creating BitmapData
  258.                 if (cutBody.bounds.width < 2 && cutBody.bounds.height < 2)
  259.                     continue;
  260.                 cutBody.space = FlxNapeSpace.space;
  261.                
  262.                 // Sprite has ability to do polygon fill to fit new body's vertices
  263.                 var sprite = new Sprite();
  264.                 sprite.graphics.beginBitmapFill(bmp,
  265.                     new Matrix(1, 0, 0, 1,
  266.                         orgBody.bounds.x - cutBody.position.x,
  267.                         orgBody.bounds.y - cutBody.position.y));
  268.                 for (i in 0...cutPoly.localVerts.length)
  269.                 {
  270.                     var vert:Vec2 = cutPoly.localVerts.at(i);
  271.                     if (i == 0)
  272.                         sprite.graphics.moveTo(vert.x, vert.y);
  273.                     else
  274.                         sprite.graphics.lineTo(vert.x, vert.y);
  275.                 }
  276.                 sprite.graphics.endFill();
  277.                
  278.                 // don't create the unnecessary default body on construction, it will become a ghost!
  279.                 var cutPhySpr = new FlxNapeSprite(0, 0, null, false);
  280.            
  281.                 cutPhySpr.body = cutBody;
  282.                 // force the bitmap to be unique, or same-sized bmp will share one instance
  283.                 cutPhySpr.makeGraphic(Math.ceil(cutBody.bounds.width), Math.ceil(cutBody.bounds.height), 0x00ff0000, true);
  284.                 cutPhySpr.pixels.draw(sprite, new Matrix(1, 0, 0, 1, cutBody.worldCOM.x - cutBody.bounds.x, cutBody.worldCOM.y - cutBody.bounds.y));
  285.                 cutPhySpr.dirty = true;
  286.                 cutPhySpr.origin.set(cutBody.worldCOM.x - cutBody.bounds.x, cutBody.worldCOM.y - cutBody.bounds.y);
  287.                 cutPhySpr.reset(cutBody.worldCOM.x, cutBody.worldCOM.y);
  288.                 cutPhySpr.angle = cutBody.rotation * FlxAngle.TO_DEG;
  289.                 StateGameplay.instance.buttons_bases.add(cutPhySpr);
  290.                
  291.                 // apply small random impulse
  292.                 var pulseAgl:Float = FlxG.random.float() * Math.PI * 2;
  293.                 var power:Float = FlxG.random.float(800, 2000);//100, 250
  294.                 cutPhySpr.body.applyImpulse(Vec2.weak(
  295.                     power * Math.cos(pulseAgl), power * Math.sin(pulseAgl)
  296.                 ));
  297.                 cutBody.userData.flxSprite = cutPhySpr;
  298.                
  299.                 //give the created sprite a new fancy impact sound
  300.                 if (StateGameplay.instance.napeLevel != null)
  301.                 {
  302.                     var groupTest:CbType = new CbType();
  303.                     var groupMap:CbType = new CbType();
  304.                     cutPhySpr.body.cbTypes.add(groupTest);
  305.  
  306.                     StateGameplay.instance.napeLevel.body.cbTypes.add(groupMap);
  307.  
  308.                     FlxNapeSpace.space.listeners.add(new InteractionListener(CbEvent.BEGIN, InteractionType.COLLISION, groupMap, groupTest, onColides));
  309.                 }
  310.             }
  311.             orgPhySpr.kill();
  312.             orgPhySpr.destroyPhysObjects();
  313.         }
  314.     }
  315.    
  316.     override public function kill():Void
  317.     {
  318.         if (!alive)
  319.         return;
  320.    
  321.         //explode();
  322.            
  323.         super.kill();
  324.        
  325.     //  trace("kill");
  326.        
  327.         var daBomb:Grenade = new Grenade(0,0);
  328.                    
  329.         daBomb.owner = StateGameplay.instance.player;
  330.  
  331.         daBomb.x = x + width / 2 - daBomb.width / 2;       
  332.         daBomb.y = y + height / 2 - daBomb.height / 2;
  333.              
  334.         daBomb.kill();
  335.  
  336.         StateGameplay.instance.foreGroundStuff.add(daBomb);
  337.        
  338.        
  339.        
  340.    
  341.        
  342.        
  343.        
  344.        
  345.        
  346.     //  exists = true;
  347.     //  solid = false;
  348.  
  349.        
  350.     }
  351.    
  352.     override public function hurt(Damage:Float):Void
  353.     {
  354.  
  355.         if (!alive)
  356.         return;
  357.        
  358.     //  trace("hurt");
  359.    
  360.         if (health <= 1)
  361.         {
  362.             explode();
  363.         }
  364.        
  365.                     //FlxG.sound.play("impact", 0.2);
  366. //
  367.                     //FlxG.sound.play("bullet_hit1", 1);
  368.  
  369.          
  370.         super.hurt(Damage);
  371.        
  372.        
  373.     }
  374.    
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement