Class: Card

Inherits:
Object
  • Object
show all
Includes:
Comparable, Enumerable, HasSprite
Defined in:
lib/rubysketch/solitaire/card.rb

Constant Summary collapse

MARKS =
%i[heart diamond clover spade]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from HasSprite

#hit?

Constructor Details

#initialize(game, mark, number) ⇒ Card

Returns a new instance of Card.



12
13
14
15
16
# File 'lib/rubysketch/solitaire/card.rb', line 12

def initialize(game, mark, number)
  @game, @mark, @number = game, mark, number
  @state, @open         = :close, 0
  @place = @next = nil
end

Instance Attribute Details

#markObject (readonly)

Returns the value of attribute mark.



18
19
20
# File 'lib/rubysketch/solitaire/card.rb', line 18

def mark
  @mark
end

#nextObject

Returns the value of attribute next.



20
21
22
# File 'lib/rubysketch/solitaire/card.rb', line 20

def next
  @next
end

#numberObject (readonly)

Returns the value of attribute number.



18
19
20
# File 'lib/rubysketch/solitaire/card.rb', line 18

def number
  @number
end

#placeObject

Returns the value of attribute place.



18
19
20
# File 'lib/rubysketch/solitaire/card.rb', line 18

def place
  @place
end

Instance Method Details

#<=>(o) ⇒ Object



108
109
110
111
# File 'lib/rubysketch/solitaire/card.rb', line 108

def <=>(o)
  number != o.number ? number <=> o.number :
                         mark <=> o.mark
end

#canDrop?Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/rubysketch/solitaire/card.rb', line 104

def canDrop?()
  @game.canDrop? self
end

#close(sec = 0) ⇒ Object



82
83
84
85
86
# File 'lib/rubysketch/solitaire/card.rb', line 82

def close(sec = 0)
  @state = :close
  animate(sec) {|t| @open = 180 * (1.0 - t)}
  self
end

#closed?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/rubysketch/solitaire/card.rb', line 88

def closed?()
  @state == :close
end

#colorObject



92
93
94
# File 'lib/rubysketch/solitaire/card.rb', line 92

def color()
  skin.markColor mark
end

#countObject



96
97
98
# File 'lib/rubysketch/solitaire/card.rb', line 96

def count()
  reduce(0) {|n| n + 1}
end

#each(&block) ⇒ Object



22
23
24
25
26
27
28
29
30
31
# File 'lib/rubysketch/solitaire/card.rb', line 22

def each(&block)
  return to_enum :each unless block
  card = self
  while card
    next_ = card.next
    block.call card
    card = next_
  end
  self
end

#hover(rise = 100, base: self.z) ⇒ Object



33
34
35
# File 'lib/rubysketch/solitaire/card.rb', line 33

def hover(rise = 100, base: self.z)
  self.z = base + rise
end

#idObject



41
42
43
# File 'lib/rubysketch/solitaire/card.rb', line 41

def id()
  @id ||= "id:#{name}"
end

#inspectObject



156
157
158
# File 'lib/rubysketch/solitaire/card.rb', line 156

def inspect()
  "#<Card #{name}>"
end

#last?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/rubysketch/solitaire/card.rb', line 100

def last?()
  place.last == self
end

#nameObject



37
38
39
# File 'lib/rubysketch/solitaire/card.rb', line 37

def name()
  @name ||= "#{mark}_#{number}"
end

#open(sec = 0) ⇒ Object



72
73
74
75
76
# File 'lib/rubysketch/solitaire/card.rb', line 72

def open(sec = 0)
  @state = :open
  animate(sec) {|t| @open = 180 * t}
  self
end

#opened?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/rubysketch/solitaire/card.rb', line 78

def opened?()
  @state == :open
end

#pos=(pos) ⇒ Object



50
51
52
53
54
55
# File 'lib/rubysketch/solitaire/card.rb', line 50

def pos=(pos)
  old = self.pos.dup
  super
  self.next&.pos += self.pos - old
  self.pos
end

#spriteObject



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/rubysketch/solitaire/card.rb', line 113

def sprite()
  @sprite ||= Sprite.new(
    0, 0, *skin.cardSpriteSize, image: skin.closedImage
  ).tap do |sp|
    sp.pivot = [rand, rand]
    sp.angle = rand -5.0..5.0
    sp.update do
      sp.image = @open > 90 ? skin.openedImage(mark, number) : skin.closedImage
    end
    sp.draw do |&draw|
      push do
        px, py = *sp.pivot
        translate  px,  py
        rotate    -sp.angle
        translate  2,  5
        rotate     sp.angle
        translate -px, -py
        fill 0, 50
        rect 0, 0, w, h, 4
      end
      translate  sp.w / 2,  sp.h / 2
      rotate @open
      translate -sp.w / 2, -sp.h / 2
      image sp.image, 0, 0, w, h
    end
    sp.mousePressed do
      next if $dragging
      $dragging = self
      mousePressed sp.mouseX, sp.mouseY
    end
    sp.mouseReleased do
      next unless $dragging.object_id == self.object_id
      mouseReleased sp.mouseX, sp.mouseY, sp.clickCount
      $dragging = nil
    end
    sp.mouseDragged do
      next unless $dragging.object_id == self.object_id
      x, y = sp.mouseX, sp.mouseY
      mouseDragged x, y, x - sp.pmouseX, y - sp.pmouseY
    end
  end
end

#x=(x) ⇒ Object



57
58
59
60
# File 'lib/rubysketch/solitaire/card.rb', line 57

def x=(x)
  self.pos = createVector x, self.y, self.z
  self.x
end

#y=(y) ⇒ Object



62
63
64
65
# File 'lib/rubysketch/solitaire/card.rb', line 62

def y=(y)
  self.pos = createVector self.x, y, self.z
  self.y
end

#z=(z) ⇒ Object



67
68
69
70
# File 'lib/rubysketch/solitaire/card.rb', line 67

def z=(z)
  self.pos = createVector self.x, self.y, z
  self.z
end