blob: 51871bca0fa0f7d6450fcb14e2aea370e0f26768 [file] [log] [blame]
import React, { useEffect, useRef, useState } from 'react';
import styles from './pet.module.css'; // 确保这个路径对
const PetGame: React.FC = () => {
const petRef = useRef<HTMLDivElement>(null);
const [mood, setMood] = useState(50);
const [hunger, setHunger] = useState(50);
// 从 localStorage 恢复状态
useEffect(() => {
const saved = localStorage.getItem('petState');
if (saved) {
const { mood: savedMood, hunger: savedHunger } = JSON.parse(saved);
setMood(savedMood);
setHunger(savedHunger);
}
}, []);
// 每分钟更新状态并保存
useEffect(() => {
const interval = setInterval(() => {
setMood(prev => {
const newMood = Math.min(prev + 1, 100);
savePetState(newMood, hunger);
return newMood;
});
setHunger(prev => {
const newHunger = Math.max(prev - 1, 0);
savePetState(mood, newHunger);
return newHunger;
});
}, 60000); // 每分钟一次
return () => clearInterval(interval);
}, [mood, hunger]);
// 保存状态到 localStorage
const savePetState = (newMood: number, newHunger: number) => {
localStorage.setItem('petState', JSON.stringify({ mood: newMood, hunger: newHunger }));
};
// 拖动功能(保留)
useEffect(() => {
const pet = petRef.current;
if (!pet) return;
let offsetX = 0;
let offsetY = 0;
let isDragging = false;
const handleMouseDown = (e: MouseEvent) => {
isDragging = true;
const rect = pet.getBoundingClientRect();
offsetX = e.clientX - rect.left;
offsetY = e.clientY - rect.top;
};
const handleMouseMove = (e: MouseEvent) => {
if (isDragging && pet) {
pet.style.left = `${e.clientX - offsetX}px`;
pet.style.top = `${e.clientY - offsetY}px`;
}
};
const handleMouseUp = () => {
isDragging = false;
};
pet.addEventListener('mousedown', handleMouseDown);
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
return () => {
pet.removeEventListener('mousedown', handleMouseDown);
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
};
}, []);
// 喂食按钮逻辑
const handleFeed = () => {
const newHunger = Math.min(hunger + 10, 100);
setHunger(newHunger);
savePetState(mood, newHunger);
};
// 互动按钮逻辑
const handleInteract = () => {
const newMood = Math.min(mood + 10, 100);
setMood(newMood);
savePetState(newMood, hunger);
};
return (
<div className={styles.cardContainer}>
<div className={styles.card}>
<p className={styles.text}>情绪:{mood}</p>
<p className={styles.text}>饥饿值:{hunger}/100</p>
<button className={styles.feedButton} onClick={handleFeed}>
🍖 喂食
</button>
<button className={styles.feedButton} onClick={handleInteract}>
🐾 摸摸头 / 玩游戏
</button>
</div>
</div>
);
};
export default PetGame;