//Author: ^-^ Veerle ^-^ //Class for setting up the window, layout of the cards and painting import java.awt.*; import java.util.Vector; public class spiderSolitarePaintAndLayout extends Canvas { protected final int gapFaceDown = 10, gapFaceUp = 20, gapColumn = 20; private final Color clrBackground = new Color(75, 141, 221); protected spiderSolitareMenuSystem menuSystem; protected spiderSolitareColumn[] cardColumn = new spiderSolitareColumn[10]; protected spiderSolitareDragStack cardDrag = new spiderSolitareDragStack(); protected spiderSolitareDeck cardDeck = new spiderSolitareDeck(); private spiderSolitarePack cardPack = new spiderSolitarePack(); protected boolean isDragging = false, hasWon = false; private int newDiffLevel = 0; protected int cardBackImageUsing = 0; protected spiderSolitarePaintInstruction currentInstruction, dragPaintInstruction; //Previous instruction is used for dragging protected Image[] imgCardBack; public spiderSolitarePaintAndLayout () { setupMenuSystem(); setupColumnSystem(); } private void setupMenuSystem () { String[] strMenuItemText = {"Deal", "Easy difficulty", "Medium difficulty", "Hard difficulty", "Card image Sonic the Hedgehog", "Card image Belgium flag", "Card image Dutch mouse", "Card image Finding Nemo", "Card image UK flag", "Card image Vanessa Mae"}; boolean[] boolMenuItemSep = {true, false, false, true, false, false, false, false, false, false}; menuSystem = new spiderSolitareMenuSystem(strMenuItemText, boolMenuItemSep); } private void setupColumnSystem () { for (int column = 0; column < 10; column++) { cardColumn[column] = new spiderSolitareColumn((gapColumn + ((71 + gapColumn) * column)), 50); } } protected void performMenuAction () { int menuAction = menuSystem.getMenuAction(); if (menuAction == 0) { newGame(); } else if (menuAction > 0 && menuAction <= 3) { newDiffLevel = menuAction - 1; newGame(); } else if (menuAction >= 4) { setCardBackImage(menuAction - 4); } repaint(); } public void newGame () { currentInstruction.reset(); hasWon = false; cardPack.setupPack(newDiffLevel); layoutCards(); } private void setCardBackImage (int index) { cardBackImageUsing = index; for (int column = 0; column < 10; column++) { cardColumn[column].setCardBackImage(imgCardBack[cardBackImageUsing]); } cardDeck.setCardBackImage(imgCardBack[cardBackImageUsing]); } public void setupCards (Image[][] imgCards, Image[] imgCardBack) //Sets up the images from the applet { this.imgCardBack = imgCardBack; cardPack.setupCardImages(imgCards); setCardBackImage(cardBackImageUsing); currentInstruction = new spiderSolitarePaintInstruction(getSize().width, getSize().height); dragPaintInstruction = new spiderSolitarePaintInstruction(getSize().width, getSize().height); newGame(); repaint(); } private void layoutCards () { int rowHeight = 0, counter = 0; spiderSolitareCard currentCard; for (int column = 0; column < 10; column++) { cardColumn[column].clear(); if (column < 4) { rowHeight = 6; } else { rowHeight = 5; } for (int row = 0; row < rowHeight; row++) { currentCard = (spiderSolitareCard)cardPack.getCard(counter); if (row == (rowHeight - 1)) { currentCard.setFaceDown(false); } else { currentCard.setFaceDown(true); } cardColumn[column].addCard(currentCard); counter++; } } cardDeck.clear(); for (int card = counter; card < 104; card++) { currentCard = (spiderSolitareCard)cardPack.getCard(card); currentCard.setFaceDown(false); cardDeck.addCard(currentCard); } cardDeck.update(); currentInstruction.reset(); } public void update (Graphics g) { paint(g); } private void clip (spiderSolitarePaintInstruction clipInstruction, Graphics grpOffScreen, Graphics g) { int startX = clipInstruction.getStartX(); int startY = clipInstruction.getStartY(); int width = clipInstruction.getWidth(); int height = clipInstruction.getHeight(); grpOffScreen.clipRect(startX, startY, width, height); g.clipRect(startX, startY, width, height); grpOffScreen.setColor(clrBackground); grpOffScreen.clearRect(startX, startY, width, height); } public void paint (Graphics g) { Image imgOffScreen = createImage(getSize().width, getSize().height); Graphics grpOffScreen = imgOffScreen.getGraphics(); grpOffScreen.setClip(0, 0, getSize().width, getSize().height); if (isDragging) { clip(cardDrag.getPaintInstruction(), grpOffScreen, g); } else if (menuSystem.isMenuVisible()) { clip(menuSystem.getPaintInstruction(), grpOffScreen, g); } else { clip(currentInstruction, grpOffScreen, g); } for (int column = 0; column < 10; column++) //Draw the columns { cardColumn[column].paintStack(grpOffScreen, this); } cardDeck.paintDeck(grpOffScreen, this); if (isDragging) { cardDrag.paintStack(grpOffScreen, this); } menuSystem.drawMenu(grpOffScreen); g.drawImage(imgOffScreen, 0, 0, this); currentInstruction.reset(); } protected void drawCard (Graphics grpOffScreen, Image imgCard, int startX, int startY) //Called by spiderSolitareColumn() to paint each card { grpOffScreen.drawImage(imgCard, startX, startY, this); grpOffScreen.setColor(new Color(149,146,140)); //Grey grpOffScreen.drawRect(startX, startY, 71, 96); //Draw a border around the card } }