Track src modules; stop ignoring .odin files
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
33d55357cf
commit
964d9987be
9 files changed
+597
-17
No files matched your search
@@ -0,0 +1,81 @@
|
||||
package card
|
||||
|
||||
import raylib "vendor:raylib"
|
||||
import themes "../themes"
|
||||
import assets "../assets"
|
||||
|
||||
Card :: struct {
|
||||
x: i32,
|
||||
y: i32,
|
||||
character: cstring,
|
||||
is_face_up: bool,
|
||||
is_matched: bool,
|
||||
pair_id: i32,
|
||||
flip_progress: f32, // 0 = face down, 1 = face up
|
||||
is_flipping: bool,
|
||||
flip_direction: bool, // true = to face up, false = to face down
|
||||
}
|
||||
|
||||
draw_card :: proc(card: ^Card, mouse_x, mouse_y: i32, theme_color: raylib.Color) {
|
||||
draw_color := theme_color
|
||||
if card.is_matched {
|
||||
draw_color = themes.LIGHT_GRAY
|
||||
}
|
||||
|
||||
is_hovered := mouse_x >= card.x && mouse_x <= card.x + themes.CARD_WIDTH &&
|
||||
mouse_y >= card.y && mouse_y <= card.y + themes.CARD_HEIGHT
|
||||
if is_hovered && !card.is_face_up && !card.is_matched && !card.is_flipping {
|
||||
draw_color = raylib.Color{
|
||||
byte(f32(theme_color.r) * 0.8),
|
||||
byte(f32(theme_color.g) * 0.8),
|
||||
byte(f32(theme_color.b) * 0.8),
|
||||
theme_color.a,
|
||||
}
|
||||
}
|
||||
|
||||
// Draw card background with rounded corners
|
||||
raylib.DrawRectangleRounded(raylib.Rectangle{f32(card.x), f32(card.y), f32(themes.CARD_WIDTH), f32(themes.CARD_HEIGHT)}, 0.2, 10, draw_color)
|
||||
raylib.DrawRectangleRoundedLines(raylib.Rectangle{f32(card.x), f32(card.y), f32(themes.CARD_WIDTH), f32(themes.CARD_HEIGHT)}, 0.2, 10, themes.BLACK)
|
||||
|
||||
// Handle flip animation
|
||||
if card.is_flipping {
|
||||
// Draw the flip animation
|
||||
flip_angle := card.flip_progress * 180.0
|
||||
if !card.flip_direction {
|
||||
flip_angle = 180.0 - flip_angle
|
||||
}
|
||||
|
||||
// Draw the card as a rectangle that's rotating
|
||||
center_x := f32(card.x + themes.CARD_WIDTH / 2)
|
||||
center_y := f32(card.y + themes.CARD_HEIGHT / 2)
|
||||
|
||||
// For simplicity, just show the character when flip_progress > 0.5
|
||||
show_face := card.flip_progress > 0.5
|
||||
if card.flip_direction {
|
||||
show_face = card.flip_progress >= 0.5
|
||||
} else {
|
||||
show_face = card.flip_progress < 0.5
|
||||
}
|
||||
|
||||
if show_face || card.is_face_up || card.is_matched {
|
||||
font := assets.get_font()
|
||||
text_w := raylib.MeasureText(card.character, 40)
|
||||
text_x := card.x + (themes.CARD_WIDTH - text_w) / 2
|
||||
text_y := card.y + (themes.CARD_HEIGHT - 40) / 2 - 8
|
||||
raylib.DrawTextEx(font, card.character, raylib.Vector2{f32(text_x + 1), f32(text_y + 1)}, 40.0, 0, themes.BLACK)
|
||||
raylib.DrawTextEx(font, card.character, raylib.Vector2{f32(text_x), f32(text_y)}, 40.0, 0, themes.WHITE)
|
||||
}
|
||||
} else if card.is_face_up || card.is_matched {
|
||||
font := assets.get_font()
|
||||
text_w := raylib.MeasureText(card.character, 40)
|
||||
text_x := card.x + (themes.CARD_WIDTH - text_w) / 2
|
||||
text_y := card.y + (themes.CARD_HEIGHT - 40) / 2 - 8
|
||||
raylib.DrawTextEx(font, card.character, raylib.Vector2{f32(text_x + 1), f32(text_y + 1)}, 40.0, 0, themes.BLACK)
|
||||
raylib.DrawTextEx(font, card.character, raylib.Vector2{f32(text_x), f32(text_y)}, 40.0, 0, themes.WHITE)
|
||||
}
|
||||
}
|
||||
|
||||
is_card_clicked :: proc(card: ^Card, mouse_x, mouse_y: i32) -> bool {
|
||||
return mouse_x >= card.x && mouse_x <= card.x + themes.CARD_WIDTH &&
|
||||
mouse_y >= card.y && mouse_y <= card.y + themes.CARD_HEIGHT
|
||||
}
|
||||
Reference in new issue
Block a user