Changeset 7807 for 2016/27/ohjaajat


Ignore:
Timestamp:
2016-07-05 17:19:37 (3 years ago)
Author:
tesatapa
Message:

Tiedostot omiin luokkiinsa.
InteractableObject?, ja pelaaja ja testball voidaan nostaa kyytiin

Location:
2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore
Files:
4 added
3 edited

Legend:

Unmodified
Added
Removed
  • 2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore/Ohjelma.cs

    r7653 r7807  
    66    static void Main(string[] args) 
    77    { 
    8         using (VenienteFragore game = new VenienteFragore()) 
     8        using (VenienteFragore.VenienteFragore game = new VenienteFragore.VenienteFragore()) 
    99        { 
    1010#if !DEBUG 
  • 2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore/VenienteFragore.cs

    r7806 r7807  
    77using Jypeli.Widgets; 
    88 
    9 class SimplePlatformCharacter : SimplePhysics.Object 
     9 
     10 
     11 
     12 
     13 
     14 
     15namespace VenienteFragore 
    1016{ 
    11     public bool IsGrounded { get; private set; } 
    12  
    13     public Direction FacingDirection { get; private set; } 
    14  
    15     public SimplePlatformCharacter(double width, double height) : base(width, height) 
     17    public class VenienteFragore : SimplePhysics.Game 
    1618    { 
    17         FacingDirection = Direction.Right; 
    18     } 
    19  
    20     public void Walk(double speed) 
    21     { 
    22         if (speed > 0) FacingDirection = Direction.Right; 
    23         if (speed < 0) FacingDirection = Direction.Left; 
    24         Velocity = new Vector(speed, Velocity.Y); 
    25     } 
    26  
    27     public override void Update(Time time) 
    28     { 
    29         base.Update(time); 
    30         IsGrounded = Game.Collisions(this, new Vector(0, -2), true).Count > 0; 
     19        private delegate void ObjectMethod(Vector position, double width, double height, Dictionary<string, string> properties); 
     20        private Dictionary<string, ObjectMethod> objectMethods; 
     21 
     22        private List<Player> advenae = new List<Player>(); 
     23 
     24        public VenienteFragore() : base(tileSize: 50) 
     25        { 
     26        } 
     27 
     28        public override void Begin() 
     29        { 
     30 
     31 
     32            objectMethods = new Dictionary<string, ObjectMethod>(); 
     33            objectMethods.Add("ball", TestBall); 
     34            objectMethods.Add("player", CreatePlayer); 
     35            objectMethods.Add("moving", CreateMovingPlatform); 
     36 
     37            var tileMap = TiledTileMap.FromLevelAsset("thehub"); 
     38            tileMap.SetTileMethod("Tiilet", TileMethod); 
     39            tileMap.SetObjectMethod("Oliot", CreateObject); 
     40            tileMap.SetTileMethod("Etuala", Foreground); 
     41            tileMap.Execute(); 
     42 
     43            Gravity = new Vector(0, -800); 
     44 
     45            Camera.ZoomToLevel(); 
     46 
     47 
     48            Level.Background.Color = Color.Beige; 
     49 
     50            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); 
     51        } 
     52 
     53        private void CreateObject(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties) 
     54        { 
     55            objectMethods[name](position, width, height, properties); 
     56        } 
     57 
     58        void TestBall(Vector position, double width, double height, Dictionary<string, string> properties) 
     59        { 
     60            var testObject = new InteractableObject(TileSize * 0.99, TileSize * 0.99); 
     61            testObject.Position = position; 
     62            testObject.Color = Color.DarkGreen; 
     63            testObject.Shape = Shape.Circle; 
     64            testObject.RestitutionX = 0.5; 
     65            testObject.RestitutionY = 0.5; 
     66            testObject.CollisionIgnoreGroup = 1; 
     67            testObject.OnInteractedWith += Pickup; 
     68            Add(testObject); 
     69        } 
     70 
     71        void CreatePlayer(Vector position, double width, double height, Dictionary<string, string> properties) 
     72        { 
     73            CreatePlayer1(position, width, height); 
     74            var p = CreatePlayer2(position, width, height); 
     75            p.Destroy(); 
     76            SetGeneralKeys(); 
     77        } 
     78 
     79        Player CreatePlayer1(Vector position, double width, double height) 
     80        { 
     81            if (advenae.Count > 0 && !advenae[0].IsVisible) { advenae[0].Reappear(); return advenae[0]; }; 
     82 
     83            Player advenA = MakePlayer(position, width, height, 1, new List<Key> { Key.Up, Key.Down, Key.Left, Key.Right, Key.Enter }); 
     84            advenA.Color = Color.HotPink; 
     85            advenae.Add(advenA); 
     86            return advenA; 
     87        } 
     88 
     89 
     90        Player CreatePlayer2(Vector position, double width, double height) 
     91        { 
     92            if (advenae.Count > 1 && !advenae[1].IsVisible) { advenae[1].Reappear(); return advenae[1]; }; 
     93 
     94            Player advenA = MakePlayer(position, width, height, 2, new List<Key> { Key.W, Key.S, Key.A, Key.D, Key.E }); 
     95            advenA.Color = Color.Harlequin; 
     96            advenae.Add(advenA); 
     97            return advenA; 
     98        } 
     99 
     100        private void SetMovementKeys(Player adven, List<Key> keys) 
     101        { 
     102            Keyboard.Listen(keys[3], ButtonState.Down, Walk, null, adven, 200.0); 
     103            Keyboard.Listen(keys[2], ButtonState.Down, Walk, null, adven, -200.0); 
     104            Keyboard.Listen(keys[0], ButtonState.Down, Jump, null, adven); 
     105            Keyboard.Listen(keys[1], ButtonState.Pressed, Crouch, null, adven, true); 
     106            Keyboard.Listen(keys[1], ButtonState.Released, Crouch, null, adven, false); 
     107            Keyboard.Listen(keys[4], ButtonState.Pressed, Interact, null, adven); 
     108            // Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven); 
     109 
     110        } 
     111 
     112        private void Interact(Player adven) 
     113        { 
     114            //Jos kannetaan jotain, viskataan se 
     115            SimplePhysics.Object carryed = adven.Carrying; 
     116            if (carryed != null) //Throw 
     117            { 
     118                adven.Carrying = null; 
     119                double dir = adven.FacingDirection == Direction.Left ? -1 : 1; 
     120                carryed.Velocity = new Vector(dir * 350, 350); 
     121                carryed.Position = carryed.Position + new Vector(dir * 10, 30); 
     122                //Pitäisiköhän oma aliohjelma tehdä 
     123                carryed.IgnoresGravity = false; 
     124                carryed.IgnoresCollisionResponse = false; 
     125            } 
     126 
     127            Vector pingPoint = adven.Position + (adven.FacingDirection == Direction.Left ? new Vector(-adven.Width, 0) : new Vector(adven.Width, 0)); 
     128            List<GameObject> interactedObjects = GetObjectsAt(pingPoint); 
     129 
     130            GameObject sphere = new GameObject(1, 1); 
     131            sphere.Position = pingPoint; 
     132            sphere.Shape = Shape.Circle; 
     133            sphere.Color = new Color(100, 0, 100, 25); 
     134            Add(sphere, 1); 
     135 
     136            TimerAddons.Until(() => sphere.Width == 100.0, delegate { sphere.Width += 1; sphere.Height += 1; }, 0.01, sphere.Destroy); 
     137 
     138            foreach (GameObject item in interactedObjects) 
     139            { 
     140                InteractableObject obj = item as InteractableObject; 
     141                if (obj == null) 
     142                    continue; 
     143                obj.InteractWith(adven); 
     144            } 
     145        } 
     146 
     147 
     148        void Pickup(SimplePhysics.Object player, InteractableObject target) 
     149        { 
     150            Player adven = player as Player; 
     151            if (adven.Carrying == null) 
     152            { 
     153                adven.Carrying = target; 
     154                target.IgnoresGravity = true; 
     155                target.IgnoresCollisionResponse = true; 
     156                //Lentävän palikan nostaminen  
     157            } 
     158 
     159        } 
     160 
     161 
     162        /*  
     163         private void SetMovementKeys(Player adven, Key up, Key down, Key left, Key right, Key morph) 
     164         { 
     165             Keyboard.Listen(right, ButtonState.Down, Walk, null, adven, 200.0); 
     166             Keyboard.Listen(left, ButtonState.Down, Walk, null, adven, -200.0); 
     167             Keyboard.Listen(up, ButtonState.Down, Jump, null, adven); 
     168             Keyboard.Listen(down, ButtonState.Pressed, Crouch, null, adven, true); 
     169             Keyboard.Listen(down, ButtonState.Released, Crouch, null, adven, false); 
     170 
     171             Keyboard.Listen(morph, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player"); 
     172 
     173         } 
     174         */ 
     175 
     176        private void SetGeneralKeys() 
     177        { 
     178            Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); advenae = new List<Player>(); Begin(); }, "Lopeta peli"); 
     179            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); 
     180 
     181            //Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven); 
     182            Keyboard.Listen(Key.X, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 2); 
     183            Keyboard.Listen(Key.RightShift, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 1); 
     184            Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, () => { advenae[0].Reappear(); advenae[0].X = Level.Left - advenae[0].Width; }, ""); 
     185        } 
     186 
     187 
     188        private Player MakePlayer(Vector position, double width, double height, int playerNum, List<Key> keys) 
     189        { 
     190            Player adven = new Player(TileSize * 0.99, TileSize * 1.98); 
     191            adven.Position = position; 
     192            adven.Friction = 0.2; 
     193            adven.Tag = "player"; 
     194            adven.Crushed += adven.Destroy; 
     195            //adven.Destroyed += delegate { advenae.Remove(adven); }; 
     196            adven.CollisionIgnoreGroup = playerNum; 
     197            adven.PlayerNumber = playerNum; 
     198            //adven.AddCollisionHandler("player", HandleMorphing); 
     199            adven.ControlKeys = keys; 
     200            adven.OnInteractedWith += Pickup; 
     201            Add(adven); 
     202 
     203            adven.AddCollisionHandler("death", (a, b) => adven.Destroy()); 
     204 
     205            SetMovementKeys(adven, keys); 
     206 
     207            return adven; 
     208        } 
     209 
     210        /// <summary> 
     211        /// Sotku 
     212        /// </summary> 
     213        /// <param name="playerNro">Sen pelaajan numero, joka haluaa toimia</param> 
     214        private void SplitOrMorph(int playerNro) 
     215        { 
     216            //if (advenae.FindAll(o => o.IsVisible == true).Count == 1) 
     217            if (!advenae[playerNro - 1].IsVisible && advenae[1 - playerNro + 1].IsVisible) 
     218            { 
     219                Split(advenae[1 - playerNro + 1]); 
     220            } 
     221            else 
     222            { 
     223                Morph(advenae[1 - playerNro + 1]); 
     224            } 
     225        } 
     226 
     227        private void Morph(Player adven) 
     228        { 
     229            if (advenae.FindAll(o => o.IsVisible == true).Count != 2) return; 
     230 
     231            if (Vector.Distance(advenae[0].Position, advenae[1].Position) < adven.Width * 1.5) 
     232            { 
     233                Player destroyable = advenae.Find(o => o.PlayerNumber != adven.PlayerNumber); 
     234 
     235                /*destroyable.ControlKeys.ForEach(delegate (Key key) 
     236                { 
     237                    Keyboard.Disable(key); 
     238                });*/ 
     239 
     240                destroyable.Destroy(); 
     241            } 
     242 
     243            //TODO: Eeppinen hypäytys takaisin? Samalla voisi ajastimella tarkastaa jatkuvasti, ovatko pelaajat tarpeeksi lähellä toisiaan. 
     244            /* 
     245            Vector center = new Vector(); 
     246 
     247            for (int i = 0; i < advenae.Count; i++) 
     248            { 
     249                center = (advenae[i].Position - center) * 0.5; 
     250            } 
     251            foreach (Player item in advenae) 
     252            { 
     253                item.Velocity = (center - item.Position) * 3.0; 
     254            } 
     255            morphing = true; 
     256            Timer.SingleShot(2.0, delegate { morphing = false; }); 
     257            */ 
     258        } 
     259 
     260        void Split(Player adven) 
     261        { 
     262            if (advenae.FindAll(o => o.IsVisible == true).Count == 2) return; 
     263 
     264            Player advenNew = new Player(adven.Width, adven.Height); 
     265            switch (adven.PlayerNumber) 
     266            { 
     267                case 1: 
     268                    advenNew = CreatePlayer2(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height); 
     269                    break; 
     270                case 2: 
     271                    advenNew = CreatePlayer1(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height); 
     272                    break; 
     273                default: 
     274                    break; 
     275            } 
     276 
     277            advenNew.Position = adven.Position + new Vector(adven.Width, 0); 
     278 
     279            if (Collisions(advenNew, Vector.Zero, true).Count > 0) 
     280            { 
     281                advenNew.Destroy(); 
     282                return; 
     283            } 
     284 
     285            advenNew.ControlKeys.ForEach(delegate (Key key) 
     286            { 
     287                Keyboard.Enable(key); 
     288            }); 
     289        } 
     290 
     291        void Walk(Player pelaaja, double nopeus) 
     292        { 
     293            pelaaja.Walk(nopeus); 
     294        } 
     295 
     296        private void Jump(SimplePlatformCharacter player) 
     297        { 
     298            if (player.IsGrounded) 
     299                player.Velocity = new Vector(player.Velocity.X, 500); 
     300        } 
     301 
     302        private void Crouch(Player player, bool crouch) 
     303        { 
     304            player.Crouch = crouch; 
     305        } 
     306 
     307        private void CreateMovingPlatform(Vector position, double width, double height, Dictionary<string, string> properties) 
     308        { 
     309            var dirX = double.Parse(properties["directionx"]); 
     310            var dirY = double.Parse(properties["directiony"]); 
     311            var distance = double.Parse(properties["distance"]); 
     312            var platform = new MovingPlatform(position, new Vector(dirX, dirY), distance, width, height); 
     313            Add(platform); 
     314        } 
     315 
     316        private void Foreground(int x, int y, Image image, string layerName, Dictionary<string, string> properties) 
     317        { 
     318            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true }; 
     319            tile.Image = image; 
     320            tile.IgnoresCollisionResponse = true; 
     321            Add(tile, 3); 
     322            SetTile(x, y, tile); 
     323        } 
     324 
     325        private void TileMethod(int x, int y, Image image, string layerName, Dictionary<string, string> properties) 
     326        { 
     327            var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true }; 
     328            tile.Image = image; 
     329            Add(tile); 
     330            SetTile(x, y, tile); 
     331 
     332            if (properties.ContainsKey("type")) 
     333            { 
     334                var features = properties["type"].Split(','); 
     335                foreach (var feature in features) 
     336                { 
     337                    ApplyFeature(tile, feature); 
     338                } 
     339            } 
     340        } 
     341 
     342        private void ApplyFeature(SimplePhysics.Object tile, string feature) 
     343        { 
     344            switch (feature) 
     345            { 
     346                case "ice": 
     347                    tile.Friction = 0.0; 
     348                    break; 
     349 
     350                case "death": 
     351                    tile.Tag = "death"; 
     352                    break; 
     353 
     354                case "oneway": 
     355                    tile.OneWayPlatform = true; 
     356                    break; 
     357 
     358                case "break": 
     359                    tile.AddCollisionHandler("player", (t, player) => 
     360                    { 
     361                        if (player.Top <= tile.Bottom) 
     362                        { 
     363                            tile.Destroy(); 
     364                        } 
     365                    }); 
     366                    break; 
     367                default: 
     368                    throw new Exception("Unknown tile feature: " + feature); 
     369            } 
     370        } 
    31371    } 
    32372} 
    33  
    34 class Player : SimplePlatformCharacter 
    35 { 
    36     public bool IsCrouching { get; private set; } 
    37  
    38     public bool Crouch { get; set; } 
    39     public int PlayerNumber { get; set; } 
    40     public SimplePhysics.Object Carrying { get; set; } 
    41  
    42     private readonly double fullHeight; 
    43     private readonly double crouchHeight; 
    44  
    45     public List<Key> ControlKeys; 
    46  
    47     public Player(double width, double height) : base(width, height) 
    48     { 
    49         fullHeight = height; 
    50         crouchHeight = height / 2.0 - 1.0; 
    51     } 
    52  
    53     public void Reappear() 
    54     { 
    55         IsVisible = true; 
    56         IgnoresCollisionResponse = false; 
    57         IgnoresGravity = false; 
    58     } 
    59  
    60     public override void Destroy() 
    61     { 
    62         IsVisible = false; 
    63         IgnoresCollisionResponse = true; 
    64         IgnoresGravity = true; 
    65         Position = new Vector(Double.MinValue, Double.MinValue); 
    66     } 
    67  
    68     public override void Update(Time time) 
    69     { 
    70         if (!IsCrouching && Crouch) 
    71         { 
    72             var oldBottom = Bottom; 
    73             Height = crouchHeight; 
    74             Bottom = oldBottom; 
    75             IsCrouching = true; 
    76         } 
    77  
    78         if (IsCrouching && !Crouch) 
    79         { 
    80             var oldBottom = Bottom; 
    81             Height = fullHeight; 
    82             Bottom = oldBottom; 
    83             IsCrouching = false; 
    84  
    85             if (Game.Collisions(this, Vector.Zero, true).Count > 0) 
    86             { 
    87                 Height = crouchHeight; 
    88                 Bottom = oldBottom; 
    89                 IsCrouching = true; 
    90             } 
    91         } 
    92  
    93         //Tämä tänne ehkä? 
    94         if (Carrying != null) 
    95         { 
    96             Carrying.X = this.X; 
    97             Carrying.Bottom = this.Top; 
    98         } 
    99  
    100         base.Update(time); 
    101     } 
    102 } 
    103  
    104 public static class TimerAddons 
    105 { 
    106     public static void Until(Func<bool> predicate, Action action, double tickInterval = 0.1, Action onEnd = null) 
    107     { 
    108         Timer timer = new Timer(); 
    109         timer.Interval = tickInterval; 
    110         timer.Timeout += delegate 
    111         { 
    112             if (predicate()) 
    113             { 
    114                 timer.Stop(); 
    115                 //Wut? this actually exists now in C#.. looks ugly as hell but is shorther than: 
    116                 //if(onEnd != null) onEnd(); 
    117                 if (onEnd != null) 
    118                     onEnd.Invoke(); 
    119             } 
    120             else 
    121             { 
    122                 action(); 
    123                 //or action.Invoke(); 
    124             } 
    125         }; 
    126         timer.Start(); 
    127  
    128     } 
    129 } 
    130  
    131  
    132 public class VenienteFragore : SimplePhysics.Game 
    133 { 
    134     private delegate void ObjectMethod(Vector position, double width, double height, Dictionary<string, string> properties); 
    135     private Dictionary<string, ObjectMethod> objectMethods; 
    136  
    137     private List<Player> advenae = new List<Player>(); 
    138  
    139     public VenienteFragore() : base(tileSize: 50) 
    140     { 
    141     } 
    142  
    143     public override void Begin() 
    144     { 
    145  
    146  
    147         objectMethods = new Dictionary<string, ObjectMethod>(); 
    148         objectMethods.Add("ball", TestBall); 
    149         objectMethods.Add("player", CreatePlayer); 
    150         objectMethods.Add("moving", CreateMovingPlatform); 
    151  
    152         var tileMap = TiledTileMap.FromLevelAsset("thehub"); 
    153         tileMap.SetTileMethod("Tiilet", TileMethod); 
    154         tileMap.SetObjectMethod("Oliot", CreateObject); 
    155         tileMap.SetTileMethod("Etuala", Foreground); 
    156         tileMap.Execute(); 
    157  
    158         Gravity = new Vector(0, -800); 
    159  
    160         Camera.ZoomToLevel(); 
    161  
    162  
    163         Level.Background.Color = Color.Beige; 
    164  
    165         Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); 
    166     } 
    167  
    168     private void CreateObject(Vector position, double width, double height, Angle angle, Shape shape, string name, Dictionary<string, string> properties) 
    169     { 
    170         objectMethods[name](position, width, height, properties); 
    171     } 
    172  
    173     void TestBall(Vector position, double width, double height, Dictionary<string, string> properties) 
    174     { 
    175         var testObject = new SimplePhysics.Object(TileSize * 0.99, TileSize * 0.99); 
    176         testObject.Position = position; 
    177         testObject.Color = Color.DarkGreen; 
    178         testObject.Shape = Shape.Circle; 
    179         testObject.RestitutionX = 0.5; 
    180         testObject.RestitutionY = 0.5; 
    181         testObject.CollisionIgnoreGroup = 1; 
    182         Add(testObject); 
    183     } 
    184  
    185     void CreatePlayer(Vector position, double width, double height, Dictionary<string, string> properties) 
    186     { 
    187         CreatePlayer1(position, width, height); 
    188         var p = CreatePlayer2(position, width, height); 
    189         p.Destroy(); 
    190         SetGeneralKeys(); 
    191     } 
    192  
    193     Player CreatePlayer1(Vector position, double width, double height) 
    194     { 
    195         if (advenae.Count > 0 && !advenae[0].IsVisible) { advenae[0].Reappear(); return advenae[0]; }; 
    196  
    197         Player advenA = MakePlayer(position, width, height, 1, new List<Key> { Key.Up, Key.Down, Key.Left, Key.Right, Key.Enter }); 
    198         advenA.Color = Color.HotPink; 
    199         advenae.Add(advenA); 
    200         return advenA; 
    201     } 
    202  
    203  
    204     Player CreatePlayer2(Vector position, double width, double height) 
    205     { 
    206         if (advenae.Count > 1 && !advenae[1].IsVisible) { advenae[1].Reappear(); return advenae[1]; }; 
    207  
    208         Player advenA = MakePlayer(position, width, height, 2, new List<Key> { Key.W, Key.S, Key.A, Key.D, Key.E }); 
    209         advenA.Color = Color.Harlequin; 
    210         advenae.Add(advenA); 
    211         return advenA; 
    212     } 
    213  
    214     private void SetMovementKeys(Player adven, List<Key> keys) 
    215     { 
    216         Keyboard.Listen(keys[3], ButtonState.Down, Walk, null, adven, 200.0); 
    217         Keyboard.Listen(keys[2], ButtonState.Down, Walk, null, adven, -200.0); 
    218         Keyboard.Listen(keys[0], ButtonState.Down, Jump, null, adven); 
    219         Keyboard.Listen(keys[1], ButtonState.Pressed, Crouch, null, adven, true); 
    220         Keyboard.Listen(keys[1], ButtonState.Released, Crouch, null, adven, false); 
    221         Keyboard.Listen(keys[4], ButtonState.Pressed, Interact, null, adven); 
    222         // Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven); 
    223  
    224     } 
    225  
    226     private void Interact(Player adven) 
    227     { 
    228         //Jos kannetaan jotain, viskataan se 
    229         SimplePhysics.Object carryed = adven.Carrying;  
    230         if( carryed != null) //Throw 
    231         { 
    232             adven.Carrying = null; 
    233             double dir = adven.FacingDirection == Direction.Left ? -1 : 1; 
    234             carryed.Velocity = new Vector(dir * 350, 350); 
    235             carryed.Position = carryed.Position + new Vector(dir * 10, 30); 
    236             //Pitäisiköhän oma aliohjelma tehdä 
    237             carryed.IgnoresGravity = false; 
    238             carryed.IgnoresCollisionResponse = false; 
    239         } 
    240  
    241         Vector pingPoint = adven.Position + (adven.FacingDirection == Direction.Left ? new Vector(-adven.Width, 0) : new Vector(adven.Width, 0)); 
    242         List<GameObject> interactedObjects = GetObjectsAt(pingPoint); 
    243  
    244         GameObject sphere = new GameObject(1, 1); 
    245         sphere.Position = pingPoint; 
    246         sphere.Shape = Shape.Circle; 
    247         sphere.Color = new Color(100, 0, 100, 25); 
    248         Add(sphere, 1); 
    249  
    250         TimerAddons.Until(() => sphere.Width == 100.0, delegate { sphere.Width += 1; sphere.Height += 1; }, 0.01, sphere.Destroy); 
    251  
    252         foreach (GameObject item in interactedObjects) 
    253         { 
    254             SimplePhysics.Object obj = item as SimplePhysics.Object; 
    255             if (obj == null) 
    256                 continue; 
    257             InteractWith(adven, obj); 
    258         } 
    259     } 
    260  
    261  
    262     private void InteractWith(Player adven, SimplePhysics.Object interactedWith) 
    263     { 
    264         if(adven.Carrying == null) 
    265         { 
    266             adven.Carrying = interactedWith; 
    267             interactedWith.IgnoresGravity = true; 
    268             interactedWith.IgnoresCollisionResponse = true; 
    269             //Lentävän palikan nostaminen  
    270         } 
    271     } 
    272  
    273  
    274  
    275  
    276     /*  
    277      private void SetMovementKeys(Player adven, Key up, Key down, Key left, Key right, Key morph) 
    278      { 
    279          Keyboard.Listen(right, ButtonState.Down, Walk, null, adven, 200.0); 
    280          Keyboard.Listen(left, ButtonState.Down, Walk, null, adven, -200.0); 
    281          Keyboard.Listen(up, ButtonState.Down, Jump, null, adven); 
    282          Keyboard.Listen(down, ButtonState.Pressed, Crouch, null, adven, true); 
    283          Keyboard.Listen(down, ButtonState.Released, Crouch, null, adven, false); 
    284  
    285          Keyboard.Listen(morph, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player"); 
    286  
    287      } 
    288      */ 
    289  
    290     private void SetGeneralKeys() 
    291     { 
    292         Keyboard.Listen(Key.R, ButtonState.Pressed, () => { ClearAll(); advenae = new List<Player>(); Begin(); }, "Lopeta peli"); 
    293         Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); 
    294  
    295         //Keyboard.Listen(keys[4], ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player back to 1 player", adven); 
    296         Keyboard.Listen(Key.X, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 2); 
    297         Keyboard.Listen(Key.RightShift, ButtonState.Pressed, SplitOrMorph, "Splits or morphs the player", 1); 
    298         Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, () => { advenae[0].Reappear(); advenae[0].X = Level.Left - advenae[0].Width; }, ""); 
    299     } 
    300  
    301  
    302     private Player MakePlayer(Vector position, double width, double height, int playerNum, List<Key> keys) 
    303     { 
    304         Player adven = new Player(TileSize * 0.99, TileSize * 1.98); 
    305         adven.Position = position; 
    306         adven.Friction = 0.2; 
    307         adven.Tag = "player"; 
    308         adven.Crushed += adven.Destroy; 
    309         //adven.Destroyed += delegate { advenae.Remove(adven); }; 
    310         adven.CollisionIgnoreGroup = playerNum; 
    311         adven.PlayerNumber = playerNum; 
    312         //adven.AddCollisionHandler("player", HandleMorphing); 
    313         adven.ControlKeys = keys; 
    314         Add(adven); 
    315  
    316         adven.AddCollisionHandler("death", (a, b) => adven.Destroy()); 
    317  
    318         SetMovementKeys(adven, keys); 
    319  
    320         return adven; 
    321     } 
    322  
    323     /// <summary> 
    324     /// Sotku 
    325     /// </summary> 
    326     /// <param name="playerNro">Sen pelaajan numero, joka haluaa toimia</param> 
    327     private void SplitOrMorph(int playerNro) 
    328     { 
    329         //if (advenae.FindAll(o => o.IsVisible == true).Count == 1) 
    330         if(!advenae[playerNro-1].IsVisible && advenae[1 - playerNro + 1].IsVisible) 
    331         { 
    332             Split(advenae[1 - playerNro + 1]); 
    333         } 
    334         else 
    335         { 
    336             Morph(advenae[1 - playerNro + 1]); 
    337         } 
    338     } 
    339  
    340     private void Morph(Player adven) 
    341     { 
    342         if (advenae.FindAll(o => o.IsVisible == true).Count != 2) return; 
    343  
    344         if (Vector.Distance(advenae[0].Position, advenae[1].Position) < adven.Width * 1.5) 
    345         { 
    346             Player destroyable = advenae.Find(o => o.PlayerNumber != adven.PlayerNumber); 
    347  
    348             /*destroyable.ControlKeys.ForEach(delegate (Key key) 
    349             { 
    350                 Keyboard.Disable(key); 
    351             });*/ 
    352  
    353             destroyable.Destroy(); 
    354         } 
    355  
    356         //TODO: Eeppinen hypäytys takaisin? Samalla voisi ajastimella tarkastaa jatkuvasti, ovatko pelaajat tarpeeksi lähellä toisiaan. 
    357         /* 
    358         Vector center = new Vector(); 
    359  
    360         for (int i = 0; i < advenae.Count; i++) 
    361         { 
    362             center = (advenae[i].Position - center) * 0.5; 
    363         } 
    364         foreach (Player item in advenae) 
    365         { 
    366             item.Velocity = (center - item.Position) * 3.0; 
    367         } 
    368         morphing = true; 
    369         Timer.SingleShot(2.0, delegate { morphing = false; }); 
    370         */ 
    371     } 
    372  
    373     void Split(Player adven) 
    374     { 
    375         if (advenae.FindAll(o => o.IsVisible == true).Count == 2) return; 
    376  
    377         Player advenNew = new Player(adven.Width, adven.Height); 
    378         switch (adven.PlayerNumber) 
    379         { 
    380             case 1: 
    381                 advenNew = CreatePlayer2(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height); 
    382                 break; 
    383             case 2: 
    384                 advenNew = CreatePlayer1(adven.Position + new Vector(adven.Width, 0), adven.Width, adven.Height); 
    385                 break; 
    386             default: 
    387                 break; 
    388         } 
    389  
    390         advenNew.Position = adven.Position + new Vector(adven.Width, 0); 
    391  
    392         if (Collisions(advenNew, Vector.Zero, true).Count > 0) 
    393         { 
    394             advenNew.Destroy(); 
    395             return; 
    396         } 
    397  
    398         advenNew.ControlKeys.ForEach(delegate (Key key) 
    399         { 
    400             Keyboard.Enable(key); 
    401         }); 
    402     } 
    403  
    404     void Walk(Player pelaaja, double nopeus) 
    405     { 
    406         pelaaja.Walk(nopeus); 
    407     } 
    408  
    409     private void Jump(SimplePlatformCharacter player) 
    410     { 
    411         if (player.IsGrounded) 
    412             player.Velocity = new Vector(player.Velocity.X, 500); 
    413     } 
    414  
    415     private void Crouch(Player player, bool crouch) 
    416     { 
    417         player.Crouch = crouch; 
    418     } 
    419  
    420     private void CreateMovingPlatform(Vector position, double width, double height, Dictionary<string, string> properties) 
    421     { 
    422         var dirX = double.Parse(properties["directionx"]); 
    423         var dirY = double.Parse(properties["directiony"]); 
    424         var distance = double.Parse(properties["distance"]); 
    425         var platform = new MovingPlatform(position, new Vector(dirX, dirY), distance, width, height); 
    426         Add(platform); 
    427     } 
    428  
    429     private void Foreground(int x, int y, Image image, string layerName, Dictionary<string, string> properties) 
    430     { 
    431         var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true }; 
    432         tile.Image = image; 
    433         tile.IgnoresCollisionResponse = true; 
    434         Add(tile, 3); 
    435         SetTile(x, y, tile); 
    436     } 
    437  
    438     private void TileMethod(int x, int y, Image image, string layerName, Dictionary<string, string> properties) 
    439     { 
    440         var tile = new SimplePhysics.Object(TileSize, TileSize) { IsStatic = true }; 
    441         tile.Image = image; 
    442         Add(tile); 
    443         SetTile(x, y, tile); 
    444  
    445         if (properties.ContainsKey("type")) 
    446         { 
    447             var features = properties["type"].Split(','); 
    448             foreach (var feature in features) 
    449             { 
    450                 ApplyFeature(tile, feature); 
    451             } 
    452         } 
    453     } 
    454  
    455     private void ApplyFeature(SimplePhysics.Object tile, string feature) 
    456     { 
    457         switch (feature) 
    458         { 
    459             case "ice": 
    460                 tile.Friction = 0.0; 
    461                 break; 
    462  
    463             case "death": 
    464                 tile.Tag = "death"; 
    465                 break; 
    466  
    467             case "oneway": 
    468                 tile.OneWayPlatform = true; 
    469                 break; 
    470  
    471             case "break": 
    472                 tile.AddCollisionHandler("player", (t, player) => 
    473                 { 
    474                     if (player.Top <= tile.Bottom) 
    475                     { 
    476                         tile.Destroy(); 
    477                     } 
    478                 }); 
    479                 break; 
    480             default: 
    481                 throw new Exception("Unknown tile feature: " + feature); 
    482         } 
    483     } 
    484 } 
  • 2016/27/ohjaajat/VenienteFragore/VenienteFragore/VenienteFragore/VenienteFragore.csproj

    r7734 r7807  
    111111  </ItemGroup> 
    112112  <ItemGroup> 
     113    <Compile Include="InteractableObject.cs" /> 
    113114    <Compile Include="MovingPlatform.cs" /> 
     115    <Compile Include="Player.cs" /> 
     116    <Compile Include="SimplePlatformCharacter.cs" /> 
    114117    <Compile Include="TiledTileMap.cs" /> 
     118    <Compile Include="TimerAddons.cs" /> 
    115119    <Compile Include="VenienteFragore.cs" /> 
    116120    <Compile Include="Properties\AssemblyInfo.cs" /> 
Note: See TracChangeset for help on using the changeset viewer.