I was fiddling with my solitaire game when the cards suddenly stopped dragging! Any idea why this happened?
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;
/**
* Write a description of class Card here.
*
* @author (Kenzie Togami)
* @version (12/20/2011)
*/
public class Card extends Actor
{
CardPics pics = new CardPics();
private static final Card[] EMPTY_CARD_ARRAY = new Card[0];
boolean sideShown = false;
int value = 0;
int startx,starty;
String color;
String suit = "";
boolean onPile = false;
SoliWorld sw = null;
Card cardAbove;
Card temp;
CardPile myPile;
boolean isDraggable = true;
boolean dragging;
boolean location;
boolean stopOnReAdd;
boolean dragStack;
boolean onStack;
boolean ignoreMouse;
List<Card> dragThese = new ArrayList<Card>();
int posonstack;
int cardsinstack;
int flippos;
Pad pad = null;
Pad prevpad;
public Card()
{
sideShown = false;
}
public Card(boolean rightSideUp, int value, String suit, boolean fromDeck)
{
this.value = value;
this.suit = suit;
if(suit == "diamonds" || suit =="hearts")
{
color = "red";
}
else if(suit == "spades" || suit =="clubs")
{
color = "black";
}
if(rightSideUp)
{
setImage(pics.getImage(value,suit));
}
sideShown = rightSideUp;
location = fromDeck;
}
public Card(boolean rightSideUp, int value, String suit, boolean fromDeck, int posinflip)
{
this.value = value;
this.suit = suit;
if(suit == "diamonds" || suit =="hearts")
{
color = "red";
}
else if(suit == "spades" || suit =="clubs")
{
color = "black";
}
if(rightSideUp)
{
setImage(pics.getImage(value,suit));
}
sideShown = rightSideUp;
location = fromDeck;
flippos = posinflip;
}
public void flip(boolean side)
{
sideShown = side;
if(sideShown == false)
{
setImage(pics.getImage(0,""));
}
else
{
setImage(pics.getImage(value,suit));
}
}
protected void addedToWorld(World world)
{
if(getWorld() instanceof SoliWorld)
{
sw = (SoliWorld) getWorld();
}
if(!stopOnReAdd && !location)
{
pad = sw.getPad(getX());
pad.addCard(this);
stopOnReAdd = true;
}
}
/**
* Act - do whatever the Card wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
isDraggable = sideShown;
if(!dragging)
{
checkDrag();
if(dragStack) moveStack();
}
}
public void moveStack()
{
for(int i = 0; i < dragThese.size(); i++)
{
if(dragThese.get(i) != this) dragThese.get(i).setLocation(getX(),((i+1)*20)+getY());
}
}
public void checkDrag()
{
int clicks = 0;
if(isDraggable && Greenfoot.mouseClicked(this) && !dragging && !sw.cardDragging)
{
if(pad != null && !sw.cardDragging) dragStack = drag();
dragging = true;
sw.cardDragging = true;
startx = getX();
starty = getY();
reAdd();
if(pad != null) pad.removeCard(this);
if(pad != null) prevpad = pad;
clicks++;
}
else if(dragging)
{
MouseInfo mouse = Greenfoot.getMouseInfo();
if(mouse != null)
setLocation(mouse.getX(),mouse.getY());
}
if(dragging && Greenfoot.mouseClicked(this) && clicks == 0)
{
dragging = false;
sw.cardDragging = false;
if(!onValidCard() && !onValidPile() && !onValidPad())
{
setLocation(startx,starty);
pad = prevpad;
if(pad != null) pad.addCard(this);
}
if(onValidCard() && !onValidPile())
{
Card landing = (Card) getOneIntersectingObject(Card.class);
pad = landing.pad;
setLocation(pad.topCard.getX(),pad.topCard.getY()+20);
pad.addCard(this);
if(location)
{
location = false;
List<Card> list = new ArrayList<Card>(Arrays.asList(Deck.deckOrder));
list.remove(this);
Deck.deckOrder = list.toArray(EMPTY_CARD_ARRAY);
Deck.lastCardAdded--;
if(Deck.lastCardGiven < 0)Deck.lastCardGiven--;
}
}
if(onValidPile())
{
if(location)
{
location = false;
List<Card> list = new ArrayList<Card>(Arrays.asList(Deck.deckOrder));
list.remove(this);
Deck.deckOrder = list.toArray(EMPTY_CARD_ARRAY);
Deck.lastCardAdded--;
if(Deck.lastCardGiven < 0)Deck.lastCardGiven--;
}
}
if(onValidPad())
{
Pad p = (Pad) getOneIntersectingObject(Pad.class);
pad = p;
pad.addCard(this);
setLocation(pad.getX(),pad.getY());
if(location)
{
location = false;
List<Card> list = new ArrayList<Card>(Arrays.asList(Deck.deckOrder));
list.remove(this);
Deck.deckOrder = list.toArray(EMPTY_CARD_ARRAY);
Deck.lastCardAdded--;
if(Deck.lastCardGiven < 0)Deck.lastCardGiven--;
}
}
if(myPile != null)
{
if(location)
{
location = false;
List<Card> list = new ArrayList<Card>(Arrays.asList(Deck.deckOrder));
list.remove(this);
Deck.deckOrder = list.toArray(EMPTY_CARD_ARRAY);
Deck.lastCardAdded--;
if(Deck.lastCardGiven < 0) Deck.lastCardGiven--;
}
}
}
}
public boolean drag()
{
if(pad.getStack(this) != null || !pad.getStack(this).isEmpty())
{
dragThese = pad.getStack(this);
if(dragThese.size() > 0) return true;
return false;
}
return false;
}
public boolean onValidPad()
{
Pad p = (Pad) getOneIntersectingObject(Pad.class);
if(p != null)
{
if(p.topCard == null && value == 13)
{
return true;
}
else return false;
}
else return false;
}
public boolean onValidPile()
{
CardPile pile = (CardPile) getOneIntersectingObject(CardPile.class);
if(pile != null)
{
return pile.tryCardPlace(this);
}
else { return false; }
}
public boolean onValidCard()
{
Card landing = (Card) getOneIntersectingObject(Card.class);
if(landing != null)
{
if(landing.pad != null)
{
return checkOurSuitAndVal(landing.pad.topCard);
}
else { return false; }
}
else { return false; }
}
public boolean checkOurSuitAndVal(Card card)
{
if(card != null)
{
if(color == "red")
{
if(card.color == "black" && card.value == value+1) { return true; } else { return false; }
}
else if(color == "black")
{
if(card.color == "red" && card.value == value+1) { return true; } else { return false; }
}
else
return false;
}
else return false;
}
public void addCard()
{
pad.addCard(this);
}
public void setPad(Pad ourpad)
{
pad = ourpad;
}
public Pad getPad()
{
return pad;
}
public boolean verify(CardPile pile)
{
if(pile != null) { myPile = pile; return myPile != null; }
else return false;
}
public boolean setTopCard()
{
if(pad != null) pad.topCard = this;
if(pad == null) return false; else return true;
}
public void reAdd()
{
int x = getX();
int y = getY();
int rotation = getRotation();
World world = getWorld();
world.removeObject(this);
world.addObject(this, x, y);
}
}

