Class: Card
- Inherits:
-
Object
- Object
- Card
- Includes:
- Comparable, Enumerable, HasSprite
- Defined in:
- lib/rubysketch/solitaire/card.rb
Constant Summary collapse
- MARKS =
%i[heart diamond clover spade]
Instance Attribute Summary collapse
-
#mark ⇒ Object
readonly
Returns the value of attribute mark.
-
#next ⇒ Object
Returns the value of attribute next.
-
#number ⇒ Object
readonly
Returns the value of attribute number.
-
#place ⇒ Object
Returns the value of attribute place.
Instance Method Summary collapse
- #<=>(o) ⇒ Object
- #canDrop? ⇒ Boolean
- #close(sec = 0) ⇒ Object
- #closed? ⇒ Boolean
- #color ⇒ Object
- #count ⇒ Object
- #each(&block) ⇒ Object
- #hover(rise = 100, base: self.z) ⇒ Object
- #id ⇒ Object
-
#initialize(game, mark, number) ⇒ Card
constructor
A new instance of Card.
- #inspect ⇒ Object
- #last? ⇒ Boolean
- #name ⇒ Object
- #open(sec = 0) ⇒ Object
- #opened? ⇒ Boolean
- #pos=(pos) ⇒ Object
- #sprite ⇒ Object
- #x=(x) ⇒ Object
- #y=(y) ⇒ Object
- #z=(z) ⇒ Object
Methods included from HasSprite
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
#mark ⇒ Object (readonly)
Returns the value of attribute mark.
18 19 20 |
# File 'lib/rubysketch/solitaire/card.rb', line 18 def mark @mark end |
#next ⇒ Object
Returns the value of attribute next.
20 21 22 |
# File 'lib/rubysketch/solitaire/card.rb', line 20 def next @next end |
#number ⇒ Object (readonly)
Returns the value of attribute number.
18 19 20 |
# File 'lib/rubysketch/solitaire/card.rb', line 18 def number @number end |
#place ⇒ Object
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
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
88 89 90 |
# File 'lib/rubysketch/solitaire/card.rb', line 88 def closed?() @state == :close end |
#color ⇒ Object
92 93 94 |
# File 'lib/rubysketch/solitaire/card.rb', line 92 def color() skin.markColor mark end |
#count ⇒ Object
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 |
#id ⇒ Object
41 42 43 |
# File 'lib/rubysketch/solitaire/card.rb', line 41 def id() @id ||= "id:#{name}" end |
#inspect ⇒ Object
156 157 158 |
# File 'lib/rubysketch/solitaire/card.rb', line 156 def inspect() "#<Card #{name}>" end |
#last? ⇒ Boolean
100 101 102 |
# File 'lib/rubysketch/solitaire/card.rb', line 100 def last?() place.last == self end |
#name ⇒ Object
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
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 |
#sprite ⇒ Object
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 |