【前端】弹球特效(重力模拟)
创始人
2025-01-08 18:05:53
0

在这里插入图片描述
在这里插入图片描述

弹球特效

文章目录

    • 弹球特效

请添加图片描述

import React, { useRef, useEffect } from 'react';  const BouncingBallSimulation = () => {   const canvasRef = useRef(null);    useEffect(() => {     const canvas = canvasRef.current;     const ctx = canvas.getContext('2d');     let animationFrameId;      // Set canvas size     canvas.width = 900;     canvas.height = 1600;      // Circle properties     const centerX = canvas.width / 2;     const centerY = canvas.height / 2;     const radius = Math.min(centerX, centerY) * 0.7;      // Ball properties     const ballRadius = 15;     let x = centerX;     let y = centerY - radius + ballRadius;     let dx = 2;     let dy = 0;      // Gravity and friction     const gravity = 0.2;     const friction = 0.99;      // Matrix rain properties     const fontSize = 14;     const columns = canvas.width / fontSize;     const drops = [];     for (let i = 0; i < columns; i++) {       drops[i] = 1;     }      const drawMatrixRain = () => {       ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';       ctx.fillRect(0, 0, canvas.width, canvas.height);        ctx.fillStyle = '#0F0';       ctx.font = `${fontSize}px monospace`;        for (let i = 0; i < drops.length; i++) {         const text = String.fromCharCode(0x30A0 + Math.random() * 96);         ctx.fillText(text, i * fontSize, drops[i] * fontSize);          if (drops[i] * fontSize > canvas.height && Math.random() > 0.975) {           drops[i] = 0;         }         drops[i]++;       }     };      const draw = () => {       ctx.clearRect(0, 0, canvas.width, canvas.height);        // Draw matrix rain       drawMatrixRain();        // Draw circle       ctx.beginPath();       ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);       ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';       ctx.stroke();        // Draw ball       ctx.beginPath();       ctx.arc(x, y, ballRadius, 0, Math.PI * 2);       ctx.fillStyle = 'white';       ctx.fill();        // Apply gravity       dy += gravity;        // Ball movement and collision detection       const nextX = x + dx;       const nextY = y + dy;       const distanceFromCenter = Math.sqrt((nextX - centerX) ** 2 + (nextY - centerY) ** 2);        if (distanceFromCenter + ballRadius > radius) {         // Calculate the normal vector         const nx = (nextX - centerX) / distanceFromCenter;         const ny = (nextY - centerY) / distanceFromCenter;          // Calculate the dot product         const dotProduct = dx * nx + dy * ny;          // Update velocity         dx = (dx - 2 * dotProduct * nx) * friction;         dy = (dy - 2 * dotProduct * ny) * friction;       } else {         x = nextX;         y = nextY;       }        animationFrameId = requestAnimationFrame(draw);     };      draw();      return () => {       cancelAnimationFrame(animationFrameId);     };   }, []);    return (     
canvasRef} className="border border-gray-300" />
); }; export default BouncingBallSimulation;

在这里插入图片描述

相关内容

热门资讯

必备辅助推荐!湖北休闲辅助(关... 必备辅助推荐!湖北休闲辅助(关于辅助软件)确实有透视方针运湖北休闲辅助辅助工具,进入游戏界面。进入湖...
科技分享!丰城双剑辅助(总结辅... 科技分享!丰城双剑辅助(总结辅助神器)真是有透视演示1、丰城双剑辅助免费脚本咨询教程、丰城双剑辅助免...
热点推荐!微信开心泉州有技巧吗... 热点推荐!微信开心泉州有技巧吗(解迷辅助器)确实有透视手段该软件可以轻松地帮助玩家将微信开心泉州有技...
分辨真假!闲逸游戏辅助软件下载... 分辨真假!闲逸游戏辅助软件下载(详情辅助工具)切实有透视教材1、进入到闲逸游戏辅助软件下载是否有挂之...
盘点十款!传送屋有挂吗(了解辅... 盘点十款!传送屋有挂吗(了解辅助挂)确实有透视演示所有人都在同一条线上,像星星一样排成一排,每一代传...
重大发现!小程序66徐州辅助(... 重大发现!小程序66徐州辅助(关于辅助教程)一直有透视手册该软件可以轻松地帮助玩家将小程序66徐州辅...
实测揭晓!胡乐胡乐辅助脚本可靠... 实测揭晓!胡乐胡乐辅助脚本可靠吗(科普辅助软件)一贯有透视秘籍1、打开软件启动之后找到中间准星的标志...
免费测试版!邯郸胡乐挂辅助(解... 免费测试版!邯郸胡乐挂辅助(解谜辅助神器)原来有透视手段1、进入到邯郸胡乐挂辅助是否有挂之后,能看到...
一分钟了解!潮汕鱼虾蟹app源... 一分钟了解!潮汕鱼虾蟹app源码(专业辅助器)果然有透视模板一、潮汕鱼虾蟹app源码游戏安装教程牌型...
盘点一款!福麻圈辅助器(关于辅... 盘点一款!福麻圈辅助器(关于辅助神器)本来有透视练习1、超多福利:超高返利,海量正版游戏,福麻圈辅助...