コード例 #1
0
    void BuildCorner3(SubMesh data, CardShape shape, Vector3 v0, Vector3 v1, Vector3 v2)
    {
        CardStock Stock  = Definition.Stock;
        int       smooth = Stock.Smooth;

        int vbase = data.VertexList.Count;

        this.VertexUV(data, shape, v0, UV(shape, 0, 1));
        this.VertexUV(data, shape, v1, UV(shape, 0, 1));
        this.VertexUV(data, shape, v2, UV(shape, 1, 0));

        float   deltaAngle = 0.5f * Mathf.PI / (smooth + 1);
        int     prev       = vbase + 1;
        Vector3 vy         = v1 - v0;
        Vector3 vx         = v2 - v0;

        for (int i = 0; i <= smooth; ++i)
        {
            if (i < smooth)
            {
                float   angle = (i + 1) * deltaAngle;
                float   tu    = Mathf.Sin(angle);
                float   tv    = Mathf.Cos(angle);
                Vector3 xyz   = v0 + tu * vx + tv * vy;
                Vector2 uv    = UV(shape, tu, tv);
                data.AddVertex(xyz, uv, Color.white);
            }
            int vn    = vbase + 3 + i;
            int vprev = (i == 0) ? vbase + 1 : vn - 1;
            int vnext = (i < smooth) ? vn : vbase + 2;
            data.AddTriangle(vbase, vprev, vnext);
            prev = vn;
        }
    }
コード例 #2
0
ファイル: Card.cs プロジェクト: scprivate/Robbery
    void BuildBack(CardMesh card, Dictionary <Texture2D, SubMesh> table, CardShape paper)
    {
        CardShape back = Atlas.FindById(Stock.Back);

        if (back != null)
        {
            Vector3[] v = RectPoints(Stock.Size * Stock.Scale, Stock.BackBorder * Stock.Scale);

            SubMesh core = GetMesh(card, table, back);
            // middle
            if (Stock.HalfBack)
            {
                Square4(core, back, v[1], v[0], v[12], v[13], Color.white, false, false);
                Square4(core, back, v[13], v[12], v[3], v[2], Color.white, true, true);
            }
            else
            {
                Square4(core, back, v[1], v[0], v[3], v[2], Color.white, false, false);
            }
            // top
            Square4(core, paper, v[5], v[4], v[0], v[1], Color.white, false, false);
            // back-left
            Square5(core, paper, v[2], v[7], v[6], v[1], v[13], Color.white, false);
            // bottom
            Square4(core, paper, v[2], v[3], v[9], v[8], Color.white, false, false);
            // back-right
            Square5(core, paper, v[0], v[11], v[10], v[3], v[12], Color.white, false);

            BuildCorner3(core, paper, v[1], v[6], v[5]);
            BuildCorner3(core, paper, v[2], v[8], v[7]);
            BuildCorner3(core, paper, v[3], v[10], v[9]);
            BuildCorner3(core, paper, v[0], v[4], v[11]);
        }
    }
コード例 #3
0
    Vector2 UV(CardShape shape, float tu, float tv)
    {
        float u = Mathf.Lerp(shape.Min.x, shape.Max.x, tu);
        float v = Mathf.Lerp(shape.Min.y, shape.Max.y, tv);

        return(new Vector2(u, v));
    }
コード例 #4
0
    void Square5(SubMesh data, CardShape shape, Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Color color, bool flip)
    {
        int     vi = data.VertexList.Count;
        Vector2 t0 = shape.UV0;
        Vector2 t1 = shape.UV1;
        Vector2 t2 = shape.UV2;
        Vector2 t3 = shape.UV3;
        Vector2 t4 = (t0 + t3) / 2;

        if (!flip)
        {
            data.AddVertex(v0, t3, color);
            data.AddVertex(v1, t2, color);
            data.AddVertex(v2, t1, color);
            data.AddVertex(v3, t0, color);
            data.AddVertex(v4, t4, color);
        }
        else
        {
            data.AddVertex(v0, t0, color);
            data.AddVertex(v1, t1, color);
            data.AddVertex(v2, t2, color);
            data.AddVertex(v3, t3, color);
            data.AddVertex(v4, t4, color);
        }
        data.AddTriangle(vi + 4, vi + 0, vi + 1);
        data.AddTriangle(vi + 4, vi + 1, vi + 2);
        data.AddTriangle(vi + 4, vi + 2, vi + 3);
    }
コード例 #5
0
        private void GameShape_CardMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //zablokuj eventy
            //GameShape.CardDrag -= new CardDragEventHandler(GameShape_CardDrag);
            GameShape.CardMouseLeftButtonDown -= new MouseButtonEventHandler(GameShape_CardMouseLeftButtonDown);

            bool renons;
            //klikniecie na karte sprobuje zagrac karte
            var       cardShapeClicked = (CardShape)sender;
            CardShape card             = (CardShape)sender;
            var       gameShape        = GameShape.GetGameShape(card.Card.Deck.Game);
            var       oldDeckShape     = gameShape.GetDeckShape(card.Card.Deck);

            if (oldDeckShape.Name == "Player4Hand")
            {
                //karta ktora chce zagrac gracz
                Card userPlayedCard = new Card(card.Card);

                //wygeneruj mozliwe ruchy gracza
                Deck player4Moves = new Deck(Player4Hand.Deck);
                player4Moves = GameRules.PossibleMoves(Player4Hand.Deck, WistCard, HeartsOpen, out renons);
                Player4Hand.Deck.Sort();

                //sprawdz czy karta ktora chce zagrac gracz jest w jego mozliwych ruchac
                if (player4Moves.Has(userPlayedCard.Rank, userPlayedCard.Suit))
                {
                    Player4UsedCards.AddPlayed(userPlayedCard);
                    Player4UsedCards.SortHigh();
                    //jezeli graz jest wistujacym to jego ruch staje sie karta wistujaca
                    if (WistPlayerNumber == 4)
                    {
                        WistCard = userPlayedCard;
                    }
                    //jezeli nie jest to sprawdz czy nie ma krotkosci
                    else if (renons)
                    {
                        Player4UsedCards.CardRenons[WistCard.Suit] = true;
                    }

                    card.Card.Deck = Player4Trick.Deck;
                    currentTrick.Add(userPlayedCard);
                    //jezeli zagral kiera to otworz kiery
                    if (userPlayedCard.Suit == CardSuit.Hearts)
                    {
                        HeartsOpen = true;
                    }

                    EndTrick();
                    return;
                }
            }
            //Nie zagral prawidlowej karty - odblokuj klikanie
            GameShape.CardMouseLeftButtonDown += GameShape_CardMouseLeftButtonDown;
            //GameShape.CardMouseLeftButtonDown += new MouseButtonEventHandler(GameShape_CardMouseLeftButtonDown);

            //gameShape.GetDeckShape(card.Card.Deck).UpdateCardShapes();
            UpdateAllCardShapes();
            //Canvas.SetZIndex(oldDeckShape, 0);
        }
コード例 #6
0
 public Card(CardShape _shape, ShapeCount _shapeCount, ShapeColor _shapeColor, ShapeFill _shapeFill)
 {
     Shape      = _shape;
     ShapeCount = _shapeCount;
     ShapeColor = _shapeColor;
     ShapeFill  = _shapeFill;
     IsClicked  = false;
 }
コード例 #7
0
ファイル: Card.cs プロジェクト: scprivate/Robbery
    void SquareFlip(SubMesh data, CardShape shape, Vector3 pos, Vector2 size, Color color, bool vflip, bool hflip)
    {
        Vector3 v0 = pos + new Vector3(-size.x, +size.y, 0);
        Vector3 v1 = pos + new Vector3(+size.x, +size.y, 0);
        Vector3 v2 = pos + new Vector3(+size.x, -size.y, 0);
        Vector3 v3 = pos + new Vector3(-size.x, -size.y, 0);

        Square4(data, shape, v0, v1, v2, v3, color, vflip, hflip);
    }
コード例 #8
0
        private DeckMatch ValidateCard(DeckName targetDeck, CardShape moveableItemCardShape, int moveableItemCardValue, CardName?cardName, CardShape?cardShape, int cardValue)
        {
            DeckMatch matchState = DeckMatch.NotFound;

            if (cardName == null && cardShape == null)
            {
                return(matchState = DeckMatch.Found);
            }

            var targetCard = _openDecks[targetDeck].Find(c => (c.CardName == cardName && c.CardShape == cardShape));

            if (targetCard == null && moveableItemCardValue == 13)
            {
                return(matchState = DeckMatch.Found);
            }
            if (targetCard == null)
            {
                return(matchState = DeckMatch.NotFound);
            }

            if (targetCard.CardPath == Properties.Resources.BackCardPath)
            {
                return(matchState = DeckMatch.Found);
            }

            //if (targetCard.CardPath == Properties.Resources.EmptyCardPath && moveableItemCardValue == 14) return matchState = DeckMatch.Found;

            if ((moveableItemCardShape == CardShape.Hearts || moveableItemCardShape == CardShape.Diamonds) &&
                (targetCard.CardShape == CardShape.Clubs || targetCard.CardShape == CardShape.Spades))
            {
                matchState = DeckMatch.Found;
            }
            else if ((moveableItemCardShape == CardShape.Clubs || moveableItemCardShape == CardShape.Spades) &&
                     (targetCard.CardShape == CardShape.Hearts || targetCard.CardShape == CardShape.Diamonds))
            {
                matchState = DeckMatch.Found;
            }
            else
            {
                return(DeckMatch.NotFound);
            }

            if (targetCard.CardValue - moveableItemCardValue == 1)
            {
                matchState = DeckMatch.Found;
            }
            else
            {
                matchState = DeckMatch.NotFound;
            }

            return(matchState);
        }
コード例 #9
0
    void Square(SubMesh data, CardShape shape, Vector3 pos, Vector2 size, Color color)
    {
        int     vi = data.VertexList.Count;
        Vector2 t0 = shape.UV0;
        Vector2 t1 = shape.UV1;
        Vector2 t2 = shape.UV2;
        Vector2 t3 = shape.UV3;

        data.AddVertex(pos + new Vector3(-size.x, +size.y, 0), t0, color);
        data.AddVertex(pos + new Vector3(+size.x, +size.y, 0), t1, color);
        data.AddVertex(pos + new Vector3(+size.x, -size.y, 0), t2, color);
        data.AddVertex(pos + new Vector3(-size.x, -size.y, 0), t3, color);
        data.AddTriangle(vi, vi + 1, vi + 2);
        data.AddTriangle(vi, vi + 2, vi + 3);
    }
コード例 #10
0
    void Square4(SubMesh data, CardShape shape, Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3, Color color, bool vflip, bool hflip)
    {
        int     vi = data.VertexList.Count;
        Vector2 t0 = shape.UV3;
        Vector2 t1 = shape.UV2;
        Vector2 t2 = shape.UV1;
        Vector2 t3 = shape.UV0;

        if (!vflip)
        {
            if (hflip)
            {
                data.AddVertex(v0, t2, color);
                data.AddVertex(v1, t3, color);
                data.AddVertex(v2, t0, color);
                data.AddVertex(v3, t1, color);
            }
            else
            {
                data.AddVertex(v0, t3, color);
                data.AddVertex(v1, t2, color);
                data.AddVertex(v2, t1, color);
                data.AddVertex(v3, t0, color);
            }
        }
        else
        {
            if (hflip)
            {
                data.AddVertex(v0, t1, color);
                data.AddVertex(v1, t0, color);
                data.AddVertex(v2, t3, color);
                data.AddVertex(v3, t2, color);
            }
            else
            {
                data.AddVertex(v0, t0, color);
                data.AddVertex(v1, t1, color);
                data.AddVertex(v2, t2, color);
                data.AddVertex(v3, t3, color);
            }
        }
        data.AddTriangle(vi, vi + 1, vi + 2);
        data.AddTriangle(vi, vi + 2, vi + 3);
    }
コード例 #11
0
        public void SetFllipedCardBinding(DeckName sourceDeck, CardName cardName, CardShape cardShape)
        {
            var containerToFlip = _openDecks[sourceDeck].Find(c => c.CardName == cardName && c.CardShape == cardShape);

            if (containerToFlip.SubContainer != null)
            {
                return;
            }

            var frontPath = containerToFlip.FrontCardPath;

            containerToFlip.CardPath = frontPath;

            switch (sourceDeck)
            {
            case DeckName.FirstDeck:
                FirstDeckCards = _openDecks[sourceDeck];
                break;

            case DeckName.SecondDeck:
                SecondDeckCards = _openDecks[sourceDeck];
                break;

            case DeckName.ThirdDeck:
                ThirdDeckCards = _openDecks[sourceDeck];
                break;

            case DeckName.FourthDeck:
                FourthDeckCards = _openDecks[sourceDeck];
                break;

            case DeckName.FifthDeck:
                FifthDeckCards = _openDecks[sourceDeck];
                break;

            case DeckName.SixthDeck:
                SixthDeckCards = _openDecks[sourceDeck];
                break;

            case DeckName.SeventhDeck:
                SeventhDeckCards = _openDecks[sourceDeck];
                break;
            }
        }
コード例 #12
0
        private void GameShape_CardDrag(CardShape cardShape, DeckShape oldDeckShape, DeckShape newDeckShape)
        {
            // check for lead suit renege

            if (((newDeckShape.Deck.TopCard == null) && (cardShape.Card.Number == 1)) ||
                ((newDeckShape.Deck.TopCard != null) && (cardShape.Card.Suit == newDeckShape.Deck.TopCard.Suit) && (cardShape.Card.Number - 1 == newDeckShape.Deck.TopCard.Number)))
            {
                //Move card to stack
                cardShape.Card.Deck = newDeckShape.Deck;

                //Flip the first remaining card in the old deck
                if (oldDeckShape.Deck.TopCard != null)
                {
                    oldDeckShape.Deck.TopCard.Visible    = true;
                    oldDeckShape.Deck.TopCard.Enabled    = true;
                    oldDeckShape.Deck.TopCard.IsDragable = true;
                }
            }
        }
コード例 #13
0
 // Optional support for multiple atlases or textures
 SubMesh GetMesh(CardMesh card, Dictionary <Texture2D, SubMesh> table, CardShape shape)
 {
     if (shape != null)
     {
         if (table.ContainsKey(shape.Image))
         {
             return(table[shape.Image]);
         }
         Material mat = LastMat;
         if (LastMat == null || LastMat.mainTexture != shape.Image || LastMat.shader != Stock.DefaultMaterial.shader)
         {
             mat             = new Material(Stock.DefaultMaterial);     //new Material(Shader.Find("Diffuse"));
             mat.mainTexture = shape.Image;
             LastMat         = mat;
         }
         SubMesh newMesh = card.NewSubMesh(mat);
         table[shape.Image] = newMesh;
         return(newMesh);
     }
     return(null);
 }
コード例 #14
0
        protected void gameShape_CardDrag(CardShape cardShape, DeckShape oldDeckShape, DeckShape newDeckShape)
        {
            if (oldDeckShape.Deck != newDeckShape.Deck)
            {
                //To Row Decks
                if (rowDecks.Contains(newDeckShape.Deck))
                {
                    //Color/Rank Rules
                    if (((newDeckShape.Deck.TopCard != null) && (cardShape.Card.Color != newDeckShape.Deck.TopCard.Color) && (cardShape.Card.Number + 1 == newDeckShape.Deck.TopCard.Number)) ||
                        ((newDeckShape.Deck.TopCard == null) && (cardShape.Card.Rank == CardRank.King)))
                    {
                        //Move the current card with all cards after it to the new deck
                        for (int i = oldDeckShape.Deck.Cards.IndexOf(cardShape.Card); i < oldDeckShape.Deck.Cards.Count; i++)
                        {
                            oldDeckShape.Deck.Cards[i].Deck = newDeckShape.Deck;
                            i--;
                        }

                        //Flip the first remaining card in the old deck
                        if (oldDeckShape.Deck.TopCard != null)
                        {
                            oldDeckShape.Deck.TopCard.Visible = true;
                            oldDeckShape.Deck.TopCard.Enabled = true;
                            oldDeckShape.Deck.TopCard.IsDragable = true;
                        }
                    }
                }

                //To Stack Decks
                if (stackDecks.Contains(newDeckShape.Deck))
                {
                    //Must be dragging one card only
                    if (oldDeckShape.Deck.Cards.IndexOf(cardShape.Card) == oldDeckShape.Deck.Cards.Count - 1)
                    {
                        if (((newDeckShape.Deck.TopCard == null) && (cardShape.Card.Number == 1)) ||
                            ((newDeckShape.Deck.TopCard != null) && (cardShape.Card.Suit == newDeckShape.Deck.TopCard.Suit) && (cardShape.Card.Number - 1 == newDeckShape.Deck.TopCard.Number)))
                        {
                            //Move card to stack
                            cardShape.Card.Deck = newDeckShape.Deck;

                            //Flip the first remaining card in the old deck
                            if (oldDeckShape.Deck.TopCard != null)
                            {
                                oldDeckShape.Deck.TopCard.Visible = true;
                                oldDeckShape.Deck.TopCard.Enabled = true;
                                oldDeckShape.Deck.TopCard.IsDragable = true;
                            }

                            //Check for winning condition
                            bool win = true;
                            for (int i = 0; i < 4; i++)
                            {
                                if ((stackDecks[i].TopCard == null) || (stackDecks[i].TopCard.Rank != CardRank.King))
                                    win = false;
                            }

                            if (win)
                            {
                                DoWinAnimation();
                            }
                        }
                    }
                }
            }
        }
コード例 #15
0
ファイル: Card.cs プロジェクト: scprivate/Robbery
    public void Rebuild()
    {
        if (!IsValid())
        {
            Debug.LogError("The card definition is not valid. " + this.name);
            return;
        }

        Stock.Validate();

        Dictionary <Texture2D, SubMesh> table = new Dictionary <Texture2D, SubMesh>();

        CardMesh  card  = new CardMesh();
        CardShape paper = Definition.Atlas.FindById(Definition.Stock.Paper);

        if (paper == null)
        {
            Debug.LogError("Paper does not exist in atlas = " + Definition.Atlas.name + "::" + Definition.Stock.Paper);
            return;
        }
        SubMesh data = GetMesh(card, table, paper);

        float x = Stock.Size.x * Stock.Scale / 2;
        float y = Stock.Size.y * Stock.Scale / 2;

        float bx = Mathf.Max(Stock.CornerSize, Stock.Border.x) * Stock.Scale;
        float by = Mathf.Max(Stock.CornerSize, Stock.Border.y) * Stock.Scale;

        //float cx = x-bx;
        //float cy = y-by;

        //   4  5
        // B 0  1 6
        //   C  D
        // A 3  2 7
        //   9  8
        float   crad = Stock.CornerSize;
        Vector2 cxy  = new Vector2(crad, crad);

        Vector3[] v = RectPoints(Stock.Size * Stock.Scale, Stock.Scale * cxy);

        Vector3 c0 = new Vector3(-x + bx, +y - by, 0);
        Vector3 c1 = new Vector3(+x - bx, +y - by, 0);
        Vector3 c2 = new Vector3(+x - bx, -y + by, 0);
        Vector3 c3 = new Vector3(-x + bx, -y + by, 0);

        if (Stock.Smooth > 0)
        {
            // middle
            Square4(data, paper, v[0], v[1], v[2], v[3], Color.white, false, false);
            // top
            Square4(data, paper, v[4], v[5], v[1], v[0], Color.white, false, false);
            // right
            Square4(data, paper, v[1], v[6], v[7], v[2], Color.white, false, false);
            // bottom
            Square4(data, paper, v[3], v[2], v[8], v[9], Color.white, false, false);
            // left
            Square4(data, paper, v[11], v[0], v[3], v[10], Color.white, false, false);

            BuildCorner3(data, paper, v[0], v[11], v[4]);
            BuildCorner3(data, paper, v[1], v[5], v[6]);
            BuildCorner3(data, paper, v[2], v[7], v[8]);
            BuildCorner3(data, paper, v[3], v[9], v[10]);
        }
        else // simple rectangle
        {
            Vector3 p1 = new Vector3(-x, +y, 0);
            Vector3 p2 = new Vector3(+x, +y, 0);
            Vector3 p3 = new Vector3(+x, -y, 0);
            Vector3 p4 = new Vector3(-x, -y, 0);
            Square4(data, paper, p1, p2, p3, p4, Color.white, false, false);
        }

        Vector2 textSize = Stock.TextSize * Stock.Scale;

        float s1 = Stock.BigSymbolSize * Stock.Scale;
        float s2 = Stock.SymbolSize * Stock.Scale;
        float s3 = Stock.CornerSymbolSize * Stock.Scale;
        //float symW = s2;
        //float symH = s2;
        //float rimX = Mathf.Max(textSize.x,symW);
        //float rimY = Mathf.Max(textSize.y,symH);

        CardShape symbol = Atlas.FindById(Definition.Symbol);

        if (symbol == null && !string.IsNullOrEmpty(Definition.Symbol))
        {
            Debug.LogError(string.Format("Symbol shape '{0}' is not defined in atlas.", Definition.Symbol));
        }

        // Full Image is used by cards like ACE/JOKER that might want a fully unique face image
        // Half Image is used by cards like JQK where half image is flipped and reflected for the top/bottom of the face image
        // Pattern is used to form standard layout of suit symbols for 2-10 cards
        CardShape fullImage = Definition.FullImage ? Atlas.FindById(Definition.Image) : null;
        CardShape halfImage = !Definition.FullImage ? Atlas.FindById(Definition.Image) : null;

        if (fullImage != null)
        {
            SubMesh core = GetMesh(card, table, fullImage);
            //Square4 (core,fullImage,v[0],v[1],v[2],v[3],Color.white,false,false);
            Square4(core, fullImage, c0, c1, c2, c3, Color.white, false, false);
        }
        else if (halfImage != null)
        {
            SubMesh core = GetMesh(card, table, halfImage);
            Vector3 lift = new Vector3(0, 0, -0.01f);
            Square4(core, halfImage, v[0] + lift, v[1] + lift, v[13] + lift, v[12] + lift, Color.white, false, false);
            Square4(core, halfImage, v[12] + lift, v[13] + lift, v[2] + lift, v[3] + lift, Color.white, true, true);
        }
        else if (Definition.Pattern != 0 && symbol != null)
        {
            if (Definition.Pattern >= 1 && Definition.Pattern < patternBits.Length)
            {
                SubMesh core = GetMesh(card, table, symbol);
                int     bits = patternBits[Definition.Pattern];
                float   x0   = -x + bx;
                float   x1   = +x - bx;
                float   y0   = +y - by;
                float   y1   = -y + by;
                for (int b = 0; b < 17; b++)
                {
                    if ((bits & (1 << b)) != 0)
                    {
                        float   px      = Mathf.Lerp(x0, x1, patternPos[b].x);
                        float   py      = Mathf.Lerp(y0, y1, patternPos[b].y);
                        Vector2 symSize = (Definition.Pattern == 1) ? new Vector2(s1, s1) : new Vector2(s2, s2);
                        if (Stock.AlwaysUpright || patternUpper[b])
                        {
                            Square(core, symbol, new Vector3(px, py, -0.01f), symSize, Color.white);
                        }
                        else
                        {
                            SquareFlip(core, symbol, new Vector3(px, py, -0.01f), symSize, Color.white, true, true);
                        }
                    }
                }
            }
            else
            {
                Debug.LogError(string.Format("Pattern value '{0}' is not valid.", Definition.Pattern));
            }
        }

        // Text is used for number/letter in corner of card (ex. A for Ace)
        CardShape text = Atlas.FindById(Definition.Text);

        if (text == null && !string.IsNullOrEmpty(Definition.Text))
        {
            Debug.LogError(string.Format("Text shape '{0}' is not defined in atlas.", Definition.Text));
        }
        if (text != null)
        {
            float   tx    = Stock.TextOffset.x * Stock.Scale;
            float   ty    = Stock.TextOffset.y * Stock.Scale;
            SubMesh sub   = GetMesh(card, table, text);
            float   x0    = -x + tx; // + (bx+rimX)*0.5f;
            float   x1    = +x - tx; // - (bx+rimX)*0.5f;
            float   y0    = +y - ty; //by;
            float   y1    = -y + ty; //by;
            Color   color = GetSymbolColor(Definition.Symbol);
            Square(sub, text, new Vector3(x0, y0, -0.01f), textSize, color);
            if (Stock.AlwaysUpright)
            {
                Square(sub, text, new Vector3(x1, y1, -0.01f), textSize, color);
            }
            else
            {
                SquareFlip(sub, text, new Vector3(x1, y1, -0.01f), textSize, color, true, true);
            }
        }

        // Symbol is used for corner suit icons (heart,diamond,spade,club)
        if (symbol != null)
        {
            float   sx  = Stock.SymbolOffset.x * Stock.Scale;
            float   sy  = Stock.SymbolOffset.y * Stock.Scale;
            SubMesh sub = GetMesh(card, table, symbol);
            //float gapY = s3/3;
            float   x0      = -x + sx; //(bx+rimX)*0.5f;
            float   x1      = +x - sx; //(bx+rimX)*0.5f;
            float   y0      = +y - sy; //by - textSize.y - gapY - rad;
            float   y1      = -y + sy; //by + textSize.y + gapY + rad;
            Color   color   = GetSymbolColor(Definition.Symbol);
            Vector2 halfSym = new Vector2(s3, s3);

            // Top-left corner symbol
            Square(sub, symbol, new Vector3(x0, y0, -0.01f), halfSym, color);

            // Bottom-right symbol can be up-right or upside-down depending on preferences
            if (Stock.AlwaysUpright)
            {
                Square(sub, symbol, new Vector3(x1, y1, -0.01f), halfSym, color);
            }
            else
            {
                SquareFlip(sub, symbol, new Vector3(x1, y1, -0.01f), halfSym, color, true, true);
            }
        }

        if (Stock.TwoSided)
        {
            BuildBack(card, table, paper);

            /*
             *          CardShape back = Atlas.FindById(Stock.Back);
             *          if (back != null)
             *          {
             *                  Vector3 [] v = RectPoints(Stock.Size*Stock.Scale,Stock.BackBorder*Stock.Scale);
             *
             *                  SubMesh core = GetMesh(card,table,back);
             *                  // middle
             *                  if (Stock.HalfBack)
             *                  {
             *                          Square4(core,back,v[1],v[0],v[12],v[13],Color.white,false,false);
             *                          Square4(core,back,v[13],v[12],v[3],v[2],Color.white,true,true);
             *                  }
             *                  else
             *                  {
             *                          Square4(core,back,v[1],v[0],v[3],v[2],Color.white,false,false);
             *                  }
             *                  // top
             *                  Square4(core,paper,v[5],v[4],v[0],v[1],Color.white,false,false);
             *                  // back-left
             *                  Square5(core,paper,v[2],v[7],v[6],v[1],v[13],Color.white,false);
             *                  // bottom
             *                  Square4(core,paper,v[2],v[3],v[9],v[8],Color.white,false,false);
             *                  // back-right
             *                  Square5(core,paper,v[0],v[11],v[10],v[3],v[12],Color.white,false);
             *
             *                  BuildCorner3(core, paper, v[1],v[6],v[5]);
             *                  BuildCorner3(core, paper, v[2],v[8],v[7]);
             *                  BuildCorner3(core, paper, v[3],v[10],v[9]);
             *                  BuildCorner3(core, paper, v[0],v[4],v[11]);
             *          }
             */
        }

        Mesh mesh = SetupMesh();

        mesh.vertices  = card.GetCombinedVertices().ToArray();
        mesh.triangles = data.IndexList.ToArray();
        mesh.uv        = card.GetCombinedTexCoords().ToArray();
        mesh.colors    = card.GetCombinedColors().ToArray();

        if (card.MeshList.Count > 1)
        {
            mesh.subMeshCount = card.MeshList.Count;
            int vbase = 0;
            for (int i = 1; i < card.MeshList.Count; ++i)
            {
                SubMesh sub  = card.MeshList[i];
                int[]   tris = sub.IndexList.ToArray();
                vbase += card.MeshList[i - 1].VertexList.Count;
                for (int t = 0; t < tris.Length; ++t)
                {
                    tris[t] += vbase;
                }
                mesh.SetTriangles(tris, i);
            }
        }

        mesh.RecalculateBounds();
        mesh.Optimize();
        mesh.RecalculateNormals();

        this.GetComponent <Renderer>().sharedMaterials = card.Materials.ToArray();

        // Setup Collider
        this.gameObject.AddComponent <BoxCollider2D>();

        // Mark as not clicked
        this.Clicked = false;
    }
コード例 #16
0
ファイル: AtlasUtils.cs プロジェクト: qpham01/carte-blanche
    static public void Generate(AtlasDesc desc)
    {
        Debug.Log("Generate");

        string    path = null;
        Texture2D txm  = desc.Target;

        if (txm == null)
        {
            txm  = new Texture2D(1, 1, TextureFormat.ARGB32, true);
            path = AssetDatabase.GetAssetPath(desc.GetInstanceID());
            Debug.Log("New Texture = " + path);
        }
        else
        {
            path = AssetDatabase.GetAssetPath(txm.GetInstanceID());
            txm  = GetReadableTexture(path, false);
            Debug.Log("Recycle Texture = " + path);
        }

        path = string.IsNullOrEmpty(path) ? "Assets/" + desc.name + ".png" : path.Replace(".prefab", ".png");
        Debug.Log("Path = " + path);

        if (!System.IO.File.Exists(path))
        {
            Debug.LogError("File does not exist = " + path);
        }

        if (txm != null)
        {
            List <Texture2D> src = new List <Texture2D>();
            foreach (AtlasDesc.Item it in desc.List)
            {
                if (it.Image != null)
                {
                    //Debug.Log("Shape = "+it.AtlasShape);
                    Texture2D t = GetReadableTexture(it.Image, false);
                    if (t != null)
                    {
                        //Debug.Log("Succes!");
                        src.Add(t);
                    }
                    else
                    {
                        Debug.LogError(string.Format("Atlas Shape '{0}' is not readable?", it.AtlasShape));
                    }
                }
                else
                {
                    Debug.LogError(string.Format("Atlas Shape '{0}' has no image?", it.AtlasShape));
                }
            }

            Debug.Log("Packing...");
            Rect [] result = txm.PackTextures(src.ToArray(), desc.Padding);

            Debug.Log("Writing file = " + path);
            byte [] data = txm.EncodeToPNG();
            System.IO.File.WriteAllBytes(path, data);
            data = null;

            AssetDatabase.Refresh();
            txm = GetAtlasTexture(path, false);
            if (txm == null)
            {
                Debug.Log("Unable to import texture?");
            }
            desc.Target = txm;
            AssetDatabase.SaveAssets();

            if (desc.Atlas != null)
            {
                List <CardShape> shapes = new List <CardShape>();
                for (int i = 0; i < result.Length; ++i)
                {
                    CardShape s  = new CardShape();
                    string    id = desc.List[i].AtlasShape;
                    s.Id    = string.IsNullOrEmpty(id) ? string.Format("Element{0}", i) : id;
                    s.Image = txm;                     //desc.List[i].Image;
                    Rect  r  = result[i];
                    float bx = desc.List[i].BorderPixels / txm.width;
                    float by = desc.List[i].BorderPixels / txm.height;
                    s.Min = new Vector2(r.xMin + bx, r.yMin + by);
                    s.Max = new Vector2(r.xMax - bx, r.yMax - by);
                    shapes.Add(s);
                }
                desc.Atlas.ShapeList = shapes.ToArray();
            }
        }
    }
コード例 #17
0
        public void SetMoveableCardBinding(CardName cardName, CardShape cardShape, int cardValue, DeckName sourceDeck, string path)
        {
            _moveableCard = new CardViewModel()
            {
                CardName = cardName, CardShape = cardShape, CardValue = cardValue, CardPath = path, CurrentDeck = sourceDeck
            };

            if (_closedDecks.ContainsKey(sourceDeck))
            {
                _closedDecks[sourceDeck].RemoveAll(c => c.CardName == cardName && c.CardShape == cardShape);
                var cardBehind = _closedDecks[sourceDeck].LastOrDefault() ?? _transparentCard;

                switch (sourceDeck)
                {
                case DeckName.OpenDeckCard:
                    OpenDeckCard = cardBehind;
                    break;

                case DeckName.DiamondsDeckCard:
                    DiamondsDeckCard = cardBehind;
                    break;

                case DeckName.HeartsDeckCard:
                    HeartsDeckCard = cardBehind;
                    break;

                case DeckName.SpadesDeckCard:
                    SpadesDeckCard = cardBehind;
                    break;

                case DeckName.ClubsDeckCard:
                    ClubsDeckCard = cardBehind;
                    break;
                }
            }
            else
            {
                _openDecks[sourceDeck].RemoveAll(c => c.CardName == cardName && c.CardShape == cardShape);
                if (_openDecks[sourceDeck].LastOrDefault() != null)
                {
                    _openDecks[sourceDeck].Last().SubContainer = null;
                }

                switch (sourceDeck)
                {
                case DeckName.FirstDeck:
                    FirstDeckCards = new List <ContainerViewModel>(_openDecks[sourceDeck]);
                    break;

                case DeckName.SecondDeck:
                    SecondDeckCards = new List <ContainerViewModel>(_openDecks[sourceDeck]);
                    break;

                case DeckName.ThirdDeck:
                    ThirdDeckCards = new List <ContainerViewModel>(_openDecks[sourceDeck]);
                    break;

                case DeckName.FourthDeck:
                    FourthDeckCards = new List <ContainerViewModel>(_openDecks[sourceDeck]);
                    break;

                case DeckName.FifthDeck:
                    FifthDeckCards = new List <ContainerViewModel>(_openDecks[sourceDeck]);
                    break;

                case DeckName.SixthDeck:
                    SixthDeckCards = new List <ContainerViewModel>(_openDecks[sourceDeck]);
                    break;

                case DeckName.SeventhDeck:
                    SeventhDeckCards = new List <ContainerViewModel>(_openDecks[sourceDeck]);
                    break;
                }
            }
        }
コード例 #18
0
 public PenaltyCard(string name, Color color, CardShape shape)
 {
     Name  = name;
     Color = color;
     Shape = shape;
 }
コード例 #19
0
 public Card GetCard(CardColor color, CardFill fill, CardShape shape)
 {
     return(GetCard(color.ToString(), fill.ToString(), shape.ToString()));
 }
コード例 #20
0
ファイル: PenaltyCard.cs プロジェクト: GNOME/longomatch
 public PenaltyCard(string name, Color color, CardShape shape)
 {
     Name = name;
     Color = color;
     Shape = shape;
 }
コード例 #21
0
 void VertexUV(SubMesh data, CardShape shape, Vector3 pos, Vector2 uv)
 {
     data.AddVertex(pos, uv, Color.white);
 }
コード例 #22
0
    public void Rebuild()
    {
        if (!IsValid())
        {
            Debug.LogError("The card definition is not valid.");
            return;
        }

        Stock.Validate();

        Dictionary <Texture2D, SubMesh> table = new Dictionary <Texture2D, SubMesh>();

        CardMesh  card  = new CardMesh();
        CardShape paper = Definition.Atlas.FindById(Definition.Stock.Paper);

        if (paper == null)
        {
            Debug.LogError("Paper does not exist in atlas = " + Definition.Atlas.name + "::" + Definition.Stock.Paper);
            return;
        }
        SubMesh data = GetMesh(card, table, paper);

        float x = Stock.Size.x / 2;
        float y = Stock.Size.y / 2;

        float   cx = x - Stock.Border.x;
        float   cy = y - Stock.Border.y;
        Vector3 v0 = new Vector2(-cx, +cy);        // middle
        Vector3 v1 = new Vector2(+cx, +cy);
        Vector3 v2 = new Vector2(+cx, -cy);
        Vector3 v3 = new Vector2(-cx, -cy);
        Vector3 v4 = new Vector2(-cx, +y);         // top edge
        Vector3 v5 = new Vector2(+cx, +y);
        Vector3 v6 = new Vector2(+x, +cy);         // right edge
        Vector3 v7 = new Vector2(+x, -cy);
        Vector3 v8 = new Vector2(+cx, -y);         // bot edge
        Vector3 v9 = new Vector2(-cx, -y);
        Vector3 vA = new Vector2(-x, -cy);         // left edge
        Vector3 vB = new Vector2(-x, +cy);
        //   4  5
        // B 0  1 6
        //   C  D
        // A 3  2 7
        //   9  8
        Vector3 vC = new Vector2(-cx, 0);        // mid
        Vector3 vD = new Vector2(+cx, 0);

        if (Stock.Smooth > 0)
        {
            // middle
            Square4(data, paper, v0, v1, v2, v3, Color.white, false, false);
            // top
            Square4(data, paper, v4, v5, v1, v0, Color.white, false, false);
            // right
            Square4(data, paper, v1, v6, v7, v2, Color.white, false, false);
            // bottom
            Square4(data, paper, v3, v2, v8, v9, Color.white, false, false);
            // left
            Square4(data, paper, vB, v0, v3, vA, Color.white, false, false);

            BuildCorner3(data, paper, v0, vB, v4);
            BuildCorner3(data, paper, v1, v5, v6);
            BuildCorner3(data, paper, v2, v7, v8);
            BuildCorner3(data, paper, v3, v9, vA);
        }
        else         // simple rectangle
        {
            Vector3 p1 = new Vector3(-x, +y, 0);
            Vector3 p2 = new Vector3(+x, +y, 0);
            Vector3 p3 = new Vector3(+x, -y, 0);
            Vector3 p4 = new Vector3(-x, -y, 0);
            Square4(data, paper, p1, p2, p3, p4, Color.white, false, false);
        }

        Vector2 textSize = new Vector2(0.175f, 0.175f);
        Vector2 symSize  = new Vector2(0.25f, 0.25f);
        float   symW     = symSize.x * 0.5f;
        float   symH     = symSize.y * 0.5f;
        float   rimX     = Mathf.Max(textSize.x, symW);
        float   rimY     = Mathf.Max(textSize.y, symH);

        CardShape symbol = Atlas.FindById(Definition.Symbol);

        if (symbol == null && !string.IsNullOrEmpty(Definition.Symbol))
        {
            Debug.LogError(string.Format("Symbol shape '{0}' is not defined in atlas.", Definition.Symbol));
        }
        CardShape fullImage = Definition.FullImage ? Atlas.FindById(Definition.Image) : null;
        CardShape halfImage = !Definition.FullImage ? Atlas.FindById(Definition.Image) : null;

        if (fullImage != null)
        {
            SubMesh core = GetMesh(card, table, fullImage);
            Square4(core, fullImage, v0, v1, v2, v3, Color.white, false, false);
        }
        else if (halfImage != null)
        {
            SubMesh core = GetMesh(card, table, halfImage);
            Vector3 lift = new Vector3(0, 0, -0.01f);
            Square4(core, halfImage, v0 + lift, v1 + lift, vD + lift, vC + lift, Color.white, false, false);
            Square4(core, halfImage, vC + lift, vD + lift, v2 + lift, v3 + lift, Color.white, true, true);
        }
        else if (Definition.Pattern != 0 && symbol != null)
        {
            if (Definition.Pattern >= 1 && Definition.Pattern < patternBits.Length)
            {
                SubMesh core  = GetMesh(card, table, symbol);
                Vector2 ssize = symSize;
                int     bits  = patternBits[Definition.Pattern];
                float   x0    = -x + Stock.Border.x;
                float   x1    = +x - Stock.Border.x;
                float   y0    = +y - Stock.Border.y;
                float   y1    = -y + Stock.Border.y;
                for (int b = 0; b < 17; b++)
                {
                    if ((bits & (1 << b)) != 0)
                    {
                        float px    = Mathf.Lerp(x0, x1, patternPos[b].x);
                        float py    = Mathf.Lerp(y0, y1, patternPos[b].y);
                        float scale = (Definition.Pattern == 1) ? 2.5f:1;
                        Square(core, symbol, new Vector3(px, py, -0.01f), scale * ssize, Color.white);
                    }
                }
            }
            else
            {
                Debug.LogError(string.Format("Pattern value '{0}' is not valid.", Definition.Pattern));
            }
        }

        CardShape text = Atlas.FindById(Definition.Text);

        if (text == null && !string.IsNullOrEmpty(Definition.Text))
        {
            Debug.LogError(string.Format("Text shape '{0}' is not defined in atlas.", Definition.Text));
        }
        if (text != null)
        {
            SubMesh sub   = GetMesh(card, table, text);
            float   x0    = -x + (Stock.Border.x + rimX) * 0.5f;
            float   x1    = +x - (Stock.Border.x + rimX) * 0.5f;
            float   y0    = +y - Stock.Border.y;
            float   y1    = -y + Stock.Border.y;
            Color   color = GetSymbolColor(Definition.Symbol);
            Square(sub, text, new Vector3(x0, y0, -0.01f), textSize, color);
            Square(sub, text, new Vector3(x1, y1, -0.01f), textSize, color);
        }
        if (symbol != null)
        {
            SubMesh sub   = GetMesh(card, table, symbol);
            Vector2 ssize = symSize * 0.5f;
            float   gapY  = ssize.y / 3;
            float   x0    = -x + (Stock.Border.x + rimX) * 0.5f;
            float   x1    = +x - (Stock.Border.x + rimX) * 0.5f;
            float   y0    = +y - Stock.Border.y - textSize.y - gapY - ssize.y;
            float   y1    = -y + Stock.Border.y + textSize.y + gapY + ssize.y;
            Color   color = GetSymbolColor(Definition.Symbol);
            Square(sub, symbol, new Vector3(x0, y0, -0.01f), ssize, color);
            Square(sub, symbol, new Vector3(x1, y1, -0.01f), ssize, color);
        }

        if (Stock.TwoSided)
        {
            CardShape back = Atlas.FindById(Stock.Back);
            if (back != null)
            {
                SubMesh core = GetMesh(card, table, back);
                // middle
                Square4(core, back, v1, v0, vC, vD, Color.white, false, false);
                Square4(core, back, vD, vC, v3, v2, Color.white, true, true);
                // top
                Square4(core, paper, v5, v4, v0, v1, Color.white, false, false);
                // back-left
                Square5(core, paper, v2, v7, v6, v1, vD, Color.white, false);
                // bottom
                Square4(core, paper, v2, v3, v9, v8, Color.white, false, false);
                // back-right
                Square5(core, paper, v0, vB, vA, v3, vC, Color.white, false);

                BuildCorner3(core, paper, v1, v6, v5);
                BuildCorner3(core, paper, v2, v8, v7);
                BuildCorner3(core, paper, v3, vA, v9);
                BuildCorner3(core, paper, v0, v4, vB);
            }
        }

        Mesh mesh = SetupMesh();

        mesh.vertices  = card.GetCombinedVertices().ToArray();
        mesh.triangles = data.IndexList.ToArray();
        mesh.uv        = card.GetCombinedTexCoords().ToArray();
        mesh.colors    = card.GetCombinedColors().ToArray();

        if (card.MeshList.Count > 1)
        {
            mesh.subMeshCount = card.MeshList.Count;
            int vbase = 0;
            for (int i = 1; i < card.MeshList.Count; ++i)
            {
                SubMesh sub  = card.MeshList[i];
                int []  tris = sub.IndexList.ToArray();
                vbase += card.MeshList[i - 1].VertexList.Count;
                for (int t = 0; t < tris.Length; ++t)
                {
                    tris[t] += vbase;
                }
                mesh.SetTriangles(tris, i);
            }
        }

        mesh.RecalculateBounds();
        ;
        mesh.RecalculateNormals();

        this.GetComponent <Renderer>().sharedMaterials = card.Materials.ToArray();
    }