mirror of
https://github.com/Vale54321/schafkop-neu.git
synced 2025-12-13 10:39:33 +01:00
fix mouse events
This commit is contained in:
@@ -3,6 +3,7 @@ use bevy::{
|
|||||||
prelude::*,
|
prelude::*,
|
||||||
render::render_resource::{Extent3d, TextureDimension, TextureFormat},
|
render::render_resource::{Extent3d, TextureDimension, TextureFormat},
|
||||||
};
|
};
|
||||||
|
use bevy::ecs::relationship::Relationship;
|
||||||
use schafkopf_logic::{
|
use schafkopf_logic::{
|
||||||
deck::{Card, Deck, Rank, Suit},
|
deck::{Card, Deck, Rank, Suit},
|
||||||
gamemode::Gamemode,
|
gamemode::Gamemode,
|
||||||
@@ -74,6 +75,10 @@ struct PlayerCardVisual {
|
|||||||
index: usize,
|
index: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Marker for the base (non-atlas) sprite child under a card parent
|
||||||
|
#[derive(Component)]
|
||||||
|
struct BaseCardSprite;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(
|
.add_plugins(
|
||||||
@@ -159,6 +164,8 @@ fn spawn_player_hand(
|
|||||||
|
|
||||||
let parent = commands
|
let parent = commands
|
||||||
.spawn(Transform::from_xyz(start_x + i as f32 * spacing, y, 0.0))
|
.spawn(Transform::from_xyz(start_x + i as f32 * spacing, y, 0.0))
|
||||||
|
.observe(on_hover())
|
||||||
|
.observe(on_unhover())
|
||||||
.id();
|
.id();
|
||||||
|
|
||||||
commands.entity(parent).with_children(|c| {
|
commands.entity(parent).with_children(|c| {
|
||||||
@@ -170,11 +177,9 @@ fn spawn_player_hand(
|
|||||||
},
|
},
|
||||||
Transform::from_xyz(0.0, 0.0, 0.0),
|
Transform::from_xyz(0.0, 0.0, 0.0),
|
||||||
Pickable::default(),
|
Pickable::default(),
|
||||||
|
BaseCardSprite,
|
||||||
))
|
))
|
||||||
.observe(on_hover())
|
.observe(on_click_select(*card));
|
||||||
.observe(on_unhover())
|
|
||||||
.observe(on_click(*card))
|
|
||||||
.observe(on_click_update_label(*card));
|
|
||||||
|
|
||||||
c.spawn((
|
c.spawn((
|
||||||
Sprite::from_atlas_image(
|
Sprite::from_atlas_image(
|
||||||
@@ -337,33 +342,77 @@ fn suit_color(suit: Suit) -> [u8; 4] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_hover() -> impl Fn(On<Pointer<Over>>, Query<(&mut Sprite, &mut Transform)>) {
|
fn on_hover(
|
||||||
move |ev, mut q| {
|
) -> impl Fn(
|
||||||
if let Ok((mut sprite, mut transform)) = q.get_mut(ev.event_target()) {
|
On<Pointer<Over>>,
|
||||||
sprite.color = Color::srgb(0.6, 0.6, 0.6);
|
Query<&mut Transform>,
|
||||||
|
Query<&Children>,
|
||||||
|
Query<(&mut Sprite, Option<&BaseCardSprite>)>,
|
||||||
|
Query<&ChildOf>,
|
||||||
|
)
|
||||||
|
{
|
||||||
|
move |ev, mut q_transform, q_children, mut q_sprite, q_parent| {
|
||||||
|
// Determine the card parent entity from the event target
|
||||||
|
let mut parent_entity = ev.event_target();
|
||||||
|
if let Ok(parent) = q_parent.get(parent_entity) {
|
||||||
|
parent_entity = parent.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale the parent
|
||||||
|
if let Ok(mut transform) = q_transform.get_mut(parent_entity) {
|
||||||
transform.scale = Vec3::splat(1.1);
|
transform.scale = Vec3::splat(1.1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn on_unhover() -> impl Fn(On<Pointer<Out>>, Query<(&mut Sprite, &mut Transform)>) {
|
// Tint only the base sprite child (marked with BaseCardSprite)
|
||||||
move |ev, mut q| {
|
if let Ok(children) = q_children.get(parent_entity) {
|
||||||
if let Ok((mut sprite, mut transform)) = q.get_mut(ev.event_target()) {
|
for child in children.iter() {
|
||||||
sprite.color = Color::WHITE;
|
if let Ok((mut sprite, maybe_base)) = q_sprite.get_mut(child) {
|
||||||
transform.scale = Vec3::ONE;
|
if maybe_base.is_some() {
|
||||||
|
sprite.color = Color::srgb(0.6, 0.6, 0.6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_unhover(
|
||||||
|
) -> impl Fn(
|
||||||
|
On<Pointer<Out>>,
|
||||||
|
Query<&mut Transform>,
|
||||||
|
Query<&Children>,
|
||||||
|
Query<(&mut Sprite, Option<&BaseCardSprite>)>,
|
||||||
|
Query<&ChildOf>,
|
||||||
|
)
|
||||||
|
{
|
||||||
|
move |ev, mut q_transform, q_children, mut q_sprite, q_parent| {
|
||||||
|
// Determine the card parent entity from the event target
|
||||||
|
let mut parent_entity = ev.event_target();
|
||||||
|
if let Ok(parent) = q_parent.get(parent_entity) {
|
||||||
|
parent_entity = parent.get();
|
||||||
|
}
|
||||||
|
|
||||||
fn on_click(card: Card) -> impl Fn(On<Pointer<Press>>, Query<(&mut Sprite, &mut Transform)>) {
|
// Reset parent scale
|
||||||
move |_, _| {
|
if let Ok(mut transform) = q_transform.get_mut(parent_entity) {
|
||||||
println!("Clicked on card: {:?}", card);
|
transform.scale = Vec3::ONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset tint on the base sprite child
|
||||||
|
if let Ok(children) = q_children.get(parent_entity) {
|
||||||
|
for child in children.iter() {
|
||||||
|
if let Ok((mut sprite, maybe_base)) = q_sprite.get_mut(child) {
|
||||||
|
if maybe_base.is_some() {
|
||||||
|
sprite.color = Color::WHITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_click_update_label(card: Card) -> impl Fn(On<Pointer<Press>>, ResMut<ClickedLabel>) {
|
fn on_click_select(card: Card) -> impl Fn(On<Pointer<Press>>, ResMut<ClickedLabel>) {
|
||||||
move |_, mut clicked| {
|
move |_, mut clicked| {
|
||||||
|
println!("Clicked on card: {:?}", card);
|
||||||
clicked.0 = Some(format!("{} {}", card.suit, card.rank));
|
clicked.0 = Some(format!("{} {}", card.suit, card.rank));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user