Example #1
0
        public CollisionTahPageControl(CollisionItem argCollisionEntry)
        {
            InitializeComponent();
            collisionEntry = argCollisionEntry;
            Text           = Path.GetFileName(collisionEntry.tah.path);

            TDCGExplorer.TDCGExplorer.SetToolTips(Text);

            DataTable data = new DataTable();

            data.Columns.Add(TextResource.CollisionFrom, Type.GetType("System.String"));
            data.Columns.Add(TextResource.CollisionTo, Type.GetType("System.String"));
            data.Columns.Add(TextResource.CollisionedTAH, Type.GetType("System.String"));
            foreach (ArcsCollisionRecord col in collisionEntry.entries)
            {
                ArcsDatabase db = TDCGExplorer.TDCGExplorer.ArcsDB;
                // 衝突した先のtahを取得する.
                ArcsTahEntry to = db.GetTah(col.toTahID);
                // 既に同じ名前で追加していないか調べる.
                ArcsTahFilesEntry fromfile = db.GetTahFilesEntry(col.fromFilesID);
                ArcsTahFilesEntry tofile   = db.GetTahFilesEntry(col.toFilesID);
                DataRow           row      = data.NewRow();
                string[]          content  = { fromfile.GetDisplayPath(), tofile.GetDisplayPath().ToLower(), to.shortname };
                row.ItemArray = content;
                data.Rows.Add(row);
            }
            dataGridView.DataSource            = data;
            dataGridView.AutoSizeColumnsMode   = DataGridViewAutoSizeColumnsMode.AllCells;
            dataGridView.ReadOnly              = true;
            dataGridView.AllowUserToAddRows    = false;
            dataGridView.AllowUserToDeleteRows = false;

            selectIndex(0);
        }
Example #2
0
        private long CollectStatistic(HashPage pg, HashStatistic stat, int height)
        {
            long totalHeight = 0;

            stat.nPages += 1;
            if (++height > stat.maxHeight)
            {
                stat.maxHeight = height;
            }
            foreach (object child in pg.items)
            {
                if (child is HashPage)
                {
                    totalHeight += CollectStatistic((HashPage)child, stat, height);
                }
                else if (child != null)
                {
                    int collisionChainLength = 0;
                    for (CollisionItem item = (CollisionItem)child; item != null; item = item.next)
                    {
                        collisionChainLength += 1;
                    }
                    if (stat.maxCollisionChainLength < collisionChainLength)
                    {
                        stat.maxCollisionChainLength = collisionChainLength;
                    }
                    stat.nItems  += collisionChainLength;
                    stat.nChains += 1;
                    totalHeight  += height;
                }
            }
            return(totalHeight);
        }
        private static Dictionary <CollisionItem, Type> LoadCollisionDict(string fileLocation)
        {
            Dictionary <CollisionItem, Type> colDict = new Dictionary <CollisionItem, Type>();
            var fileStream = File.OpenRead(fileLocation);
            var fileReader = new StreamReader(fileStream);

            fileReader.ReadLine();
            while (!fileReader.EndOfStream)
            {
                string   line    = fileReader.ReadLine();
                string[] columns = line.Split(',');

                CollisionItem colItem = new CollisionItem
                {
                    Collider     = columns[0],
                    Collidee     = columns[1],
                    ColDirection = DirectionFromString(columns[2])
                };
                if (columns[4].ToLowerInvariant().Equals(CollisionUtilConstants.True))
                {
                    colItem.PixelPerfect = true;
                }
                Type c = Type.GetType(CollisionUtilConstants.CollisionNamespace + columns[3]);
                colDict.Add(colItem, c);
            }
            fileReader.Close();
            return(colDict);
        }
Example #4
0
        public void OnPlayer1Hit()
        {
            if (_lastCollisionItem == CollisionItem.Player1)
            {
                return;
            }

            HandleVerticalWallCollision();
            _lastCollisionItem = CollisionItem.Player1;
        }
        private static CollisionItem BuildCollisionItem(string colliderAssem, string collideeAssem, CollisionItem.Direction dir, bool pixelPerfect)
        {
            CollisionItem col = new CollisionItem
            {
                Collider     = colliderAssem.Split('.').Last(),
                Collidee     = collideeAssem.Split('.').Last(),
                ColDirection = dir,
                PixelPerfect = pixelPerfect
            };

            return(col);
        }
Example #6
0
        public void Remove(object key)
#endif
        {
            HashPage pg = root;

            if (pg != null)
            {
                uint divisor  = 1;
                int  hashCode = key.GetHashCode();
                while (true)
                {
                    int    h     = (int)((uint)hashCode / divisor % pageSize);
                    object child = pg.items[h];
                    if (child is HashPage)
                    {
                        pg       = (HashPage)child;
                        divisor *= pageSize;
                    }
                    else
                    {
                        CollisionItem prev = null;
                        for (CollisionItem item = (CollisionItem)child; item != null; item = item.next)
                        {
                            if (item.hashCode == hashCode && item.key.Equals(key))
                            {
                                if (prev != null)
                                {
                                    prev.next = item.next;
                                    prev.Modify();
                                }
                                else
                                {
                                    pg.items[h] = item.next;
                                    pg.Modify();
                                }
                                nElems -= 1;
                                Modify();
#if USE_GENERICS
                                return(true);
#else
                                return;
#endif
                            }
                            prev = item;
                        }
                        break;
                    }
                }
            }
#if USE_GENERICS
            return(false);
#endif
        }
Example #7
0
            public void Reset()
            {
                currItem = null;
                nextItem = null;
                stack.Clear();
                HashPage pg = hash.root;

                if (pg != null)
                {
                    int start = 0;
                    int sp    = 0;
DepthFirst:
                    while (true)
                    {
                        for (int i = start; i < pg.items.Count; i++)
                        {
                            object child = pg.items[i];
                            if (child != null)
                            {
                                stack.Add(new StackElem(pg, i));
                                sp += 1;
                                if (child is HashPage)
                                {
                                    pg    = (HashPage)child;
                                    start = 0;
                                    goto DepthFirst;
                                }
                                else
                                {
                                    nextItem = (CollisionItem)child;
                                    return;
                                }
                            }
                        }
                        if (sp != 0)
                        {
                            StackElem top = (StackElem)stack[--sp];
                            stack.RemoveAt(sp);
                            pg    = top.page;
                            start = top.pos + 1;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
Example #8
0
        private void HandleWallCollision()
        {
            if (_gameObject.Left <= LeftBounds ||
                _gameObject.Left >= RightBounds)
            {
                _lastCollisionItem = CollisionItem.Wall;
                HandleVerticalWallCollision();
            }

            if (_gameObject.Top <= BottomBounds ||
                _gameObject.Top >= TopBounds)
            {
                _lastCollisionItem = CollisionItem.Wall;
                HandleHorizontalWallCollision();
            }
        }
Example #9
0
            public bool MoveNext()
            {
                if (nextItem != null)
                {
                    currItem = nextItem;
                    if ((nextItem = nextItem.next) == null)
                    {
                        int sp = stack.Count;
                        do
                        {
                            StackElem top = (StackElem)stack[--sp];
                            stack.RemoveAt(sp);
                            HashPage pg    = top.page;
                            int      start = top.pos + 1;

DepthFirst:
                            while (true)
                            {
                                for (int i = start; i < pg.items.Count; i++)
                                {
                                    object child = pg.items[i];
                                    if (child != null)
                                    {
                                        stack.Add(new StackElem(pg, i));
                                        sp += 1;
                                        if (child is HashPage)
                                        {
                                            pg    = (HashPage)child;
                                            start = 0;
                                            goto DepthFirst;
                                        }
                                        else
                                        {
                                            nextItem = (CollisionItem)child;
                                            return(true);
                                        }
                                    }
                                }
                                break;
                            }
                        } while (sp != 0);
                    }
                    return(true);
                }
                return(false);
            }
Example #10
0
 public override void Deallocate()
 {
     foreach (object child in items)
     {
         if (child is HashPage)
         {
             ((HashPage)child).Deallocate();
         }
         else
         {
             CollisionItem next;
             for (CollisionItem item = (CollisionItem)child; item != null; item = next)
             {
                 next = item.next;
                 item.Deallocate();
             }
         }
     }
     base.Deallocate();
 }
Example #11
0
        /// <summary>
        /// Se è punto ritorna chi lo ha fatto
        /// </summary>
        /// <returns></returns>
        private string HandleWallCollision()
        {
            if (_gameObject.Left <= LeftBounds)
            {
                return("player2");
            }

            if (_gameObject.Left >= RightBounds)
            {
                return("player1");
            }

            if (_gameObject.Top <= BottomBounds ||
                _gameObject.Top >= TopBounds)
            {
                _lastCollisionItem = CollisionItem.Wall;
                HandleHorizontalWallCollision();
            }

            return(null);
        }
Example #12
0
        public bool TryGetValue(object key, out object val)
#endif
        {
            HashPage pg = root;

            if (pg != null)
            {
                uint divisor  = 1;
                int  hashCode = key.GetHashCode();
                while (true)
                {
                    int    h     = (int)((uint)hashCode / divisor % pageSize);
                    object child = pg.items[h];
                    if (child is HashPage)
                    {
                        pg       = (HashPage)child;
                        divisor *= pageSize;
                    }
                    else
                    {
                        for (CollisionItem item = (CollisionItem)child; item != null; item = item.next)
                        {
                            if (item.hashCode == hashCode && item.key.Equals(key))
                            {
#if USE_GENERICS
                                val = (V)item.obj;
#else
                                val = item.obj;
#endif
                                return(true);
                            }
                        }
                        break;
                    }
                }
            }
            val = null;
            return(false);
        }
        private void DetectCollisions(IGameObject collider, List <KeyValuePair <float, ICommandCollision> > overlapCommandDict, List <KeyValuePair <ICommandCollision, IGameObject[]> > objectsDict)
        {
            foreach (ICollidableObject collidee in _gameObjects)
            {
                string colliderS = collider.ToString().Split('.').Last();
                string collideeS = collidee.ToString().Split('.').Last();

                if (collider != collidee && collider.BoundingBox.Intersects(collidee.BoundingBox))
                {
                    CollisionItem colItem = BuildCollisionItem(colliderS, collideeS, DirectionFromBoundingBox(collidee.BoundingBox, collider.BoundingBox), false);
                    colItem.ColDirection = DirectionFromBoundingBox(collider.BoundingBox, collidee.BoundingBox);

                    var   collisionRect = Rectangle.Intersect(collidee.BoundingBox, collider.BoundingBox);
                    float collisionArea = collisionRect.Width * collisionRect.Height;

                    Type commandType;
                    if (_collisionDict.TryGetValue(colItem, out commandType))
                    {
                        ICommandCollision command = Activator.CreateInstance(commandType) as ICommandCollision;
                        overlapCommandDict.Add(new KeyValuePair <float, ICommandCollision>(collisionArea, command));
                        objectsDict.Add(new KeyValuePair <ICommandCollision, IGameObject[]>(command, new[] { collider, collidee }));
                    }
                    else
                    {
                        colItem.PixelPerfect = true;
                        if (_collisionDict.TryGetValue(colItem, out commandType))
                        {
                            if (PixelPerfectCollision(((IVisibleObject)collider).GetSprite(), ((IVisibleObject)collidee).GetSprite()))
                            {
                                ICommandCollision command = Activator.CreateInstance(commandType) as ICommandCollision;
                                overlapCommandDict.Add(new KeyValuePair <float, ICommandCollision>(collisionArea, command));
                                objectsDict.Add(new KeyValuePair <ICommandCollision, IGameObject[]>(command, new[] { collider, collidee }));
                            }
                        }
                    }
                }
            }
        }
Example #14
0
 public CollisionPair(IItem item1, int robotLinkId1, IItem item2, int robotLinkId2)
 {
     CollisionItem1 = new CollisionItem(item1, robotLinkId1);
     CollisionItem2 = new CollisionItem(item2, robotLinkId2);
 }
Example #15
0
 public CollisionPair(IItem item1, IItem item2)
 {
     CollisionItem1 = new CollisionItem(item1);
     CollisionItem2 = new CollisionItem(item2);
 }
Example #16
0
        public void Set(object key, object obj)
        {
            int      hashCode = key.GetHashCode();
            HashPage pg       = root;

            if (pg == null)
            {
                pg = new HashPage(Storage, pageSize);
                int h = (int)((uint)hashCode % pageSize);
                pg.items[h] = new CollisionItem(key, obj, hashCode);
                root        = pg;
                nElems      = 1;
                Modify();
            }
            else
            {
                uint divisor = 1;
                while (true)
                {
                    int    h     = (int)((uint)hashCode / divisor % pageSize);
                    object child = pg.items[h];
                    if (child is HashPage)
                    {
                        pg       = (HashPage)child;
                        divisor *= pageSize;
                    }
                    else
                    {
                        CollisionItem prev = null;
                        CollisionItem last = null;
                        int           collisionChainLength = 0;
                        for (CollisionItem item = (CollisionItem)child; item != null; item = item.next)
                        {
                            if (item.hashCode == hashCode)
                            {
                                if (item.key.Equals(key))
                                {
                                    item.obj = obj;
                                    item.Modify();
                                    return;
                                }
                                if (prev == null || prev.hashCode != hashCode)
                                {
                                    collisionChainLength += 1;
                                }
                                prev = item;
                            }
                            else
                            {
                                collisionChainLength += 1;
                            }
                            last = item;
                        }
                        if (prev == null || prev.hashCode != hashCode)
                        {
                            collisionChainLength += 1;
                        }
                        if (collisionChainLength > loadFactor)
                        {
                            HashPage newPage = new HashPage(Storage, pageSize);
                            divisor *= pageSize;
                            CollisionItem next;
                            for (CollisionItem item = (CollisionItem)child; item != null; item = next)
                            {
                                next = item.next;
                                int hc = (int)((uint)item.hashCode / divisor % pageSize);
                                item.next         = (CollisionItem)newPage.items[hc];
                                newPage.items[hc] = item;
                                item.Modify();
                            }
                            pg.items[h] = newPage;
                            pg.Modify();
                            pg = newPage;
                        }
                        else
                        {
                            CollisionItem newItem = new CollisionItem(key, obj, hashCode);
                            if (prev == null)
                            {
                                prev = last;
                            }
                            if (prev != null)
                            {
                                newItem.next = prev.next;
                                prev.next    = newItem;
                                prev.Modify();
                            }
                            else
                            {
                                pg.items[h] = newItem;
                                pg.Modify();
                            }
                            nElems += 1;
                            Modify();
                            return;
                        }
                    }
                }
            }
        }