您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds transition effects to the drawing canvas in Drawaria.Online with an improved menu
- // ==UserScript==
- // @name Drawaria Transitions
- // @namespace Transitions using drawing commands and a draggable menu
- // @version 2024.10.27
- // @description Adds transition effects to the drawing canvas in Drawaria.Online with an improved menu
- // @author YouTubeDrawaria
- // @match *://drawaria.online/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=drawaria.online
- // @license MIT
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- // Function to send the draw command (covering the entire screen)
- function sendDrawCommand(x1, y1, x2, y2, color, size = 100000) { // Extremely large default size
- let message = `42["drawcmd",0,[${x1},${y1},${x2},${y2},false,${size},"${color}",0,0,{}]]`;
- window.sockets.forEach(socket => {
- if (socket.readyState === WebSocket.OPEN) {
- socket.send(message);
- }
- });
- }
- // Overriding the WebSocket send method to capture sockets
- const originalSend = WebSocket.prototype.send;
- WebSocket.prototype.send = function (...args) {
- if (window.sockets.indexOf(this) === -1) {
- window.sockets.push(this);
- }
- return originalSend.call(this, ...args);
- };
- // Initializing
- window.sockets = [];
- // Function to create a transition effect
- function createTransition(name, effectFunction) {
- return {
- name,
- effectFunction
- };
- }
- // Transition effects
- const transitions = [
- createTransition('Slide Right', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * canvas.width);
- sendDrawCommand(0, 0, canvas.width - offset, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Down', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * canvas.height);
- sendDrawCommand(0, 0, canvas.width, canvas.height - offset, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Left', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * canvas.width);
- sendDrawCommand(offset, 0, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Up', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * canvas.height);
- sendDrawCommand(0, offset, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Diagonal Top-Left', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * Math.min(canvas.width, canvas.height));
- sendDrawCommand(offset, 0, canvas.width, offset, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Diagonal Top-Right', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * Math.min(canvas.width, canvas.height));
- sendDrawCommand(0, 0, canvas.width - offset, offset, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Diagonal Bottom-Left', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * Math.min(canvas.width, canvas.height));
- sendDrawCommand(offset, canvas.height - offset, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Diagonal Bottom-Right', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * Math.min(canvas.width, canvas.height));
- sendDrawCommand(0, canvas.height - offset, canvas.width - offset, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Vertical Split', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * canvas.height / 2);
- sendDrawCommand(0, 0, canvas.width, canvas.height / 2 - offset, color);
- sendDrawCommand(0, canvas.height / 2 + offset, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Horizontal Split', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * canvas.width / 2);
- sendDrawCommand(0, 0, canvas.width / 2 - offset, canvas.height, color);
- sendDrawCommand(canvas.width / 2 + offset, 0, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide In from Center', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * Math.min(canvas.width, canvas.height) / 2);
- sendDrawCommand(canvas.width / 2 - offset, 0, canvas.width / 2 + offset, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Out to Center', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((1 - progress / duration) * Math.min(canvas.width, canvas.height) / 2);
- sendDrawCommand(canvas.width / 2 - offset, 0, canvas.width / 2 + offset, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide In from Corners', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * Math.min(canvas.width, canvas.height) / 2);
- sendDrawCommand(0, 0, offset, offset, color);
- sendDrawCommand(canvas.width - offset, 0, canvas.width, offset, color);
- sendDrawCommand(0, canvas.height - offset, offset, canvas.height, color);
- sendDrawCommand(canvas.width - offset, canvas.height - offset, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Out to Corners', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((1 - progress / duration) * Math.min(canvas.width, canvas.height) / 2);
- sendDrawCommand(0, 0, offset, offset, color);
- sendDrawCommand(canvas.width - offset, 0, canvas.width, offset, color);
- sendDrawCommand(0, canvas.height - offset, offset, canvas.height, color);
- sendDrawCommand(canvas.width - offset, canvas.height - offset, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide In from Top and Bottom', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((progress / duration) * canvas.height / 2);
- sendDrawCommand(0, 0, canvas.width, offset, color);
- sendDrawCommand(0, canvas.height - offset, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- }),
- createTransition('Slide Out to Top and Bottom', (color, duration = 1000) => {
- let start = null;
- const animate = timestamp => {
- if (!start) start = timestamp;
- const progress = timestamp - start;
- const canvas = document.querySelector('canvas');
- if (!canvas) return;
- const offset = Math.round((1 - progress / duration) * canvas.height / 2);
- sendDrawCommand(0, 0, canvas.width, offset, color);
- sendDrawCommand(0, canvas.height - offset, canvas.width, canvas.height, color);
- if (progress < duration) requestAnimationFrame(animate);
- };
- requestAnimationFrame(animate);
- })
- ];
- // Function to create the menu
- function createMenu(title, items) {
- const menu = document.createElement('div');
- menu.id = 'transitionMenu';
- menu.innerHTML = `
- <div id="menuHeader">
- <h3>${title}</h3>
- <div id="closeButton">X</div>
- </div>
- <div id="menuItems">
- <input type="color" id="colorInput" value="#000000">
- <div id="buttonGrid">
- ${items.map(item => `<button data-transition="${item.name}" data-duration="1000">${item.name}</button>`).join('')}
- </div>
- </div>
- `;
- // Adding styles to the menu (inline for easy copy and paste)
- menu.style.cssText = `
- position: absolute;
- top: 10px;
- left: 10px;
- background-color: rgba(255, 255, 255, 0.8);
- padding: 10px;
- border: 1px solid #ccc;
- border-radius: 5px;
- box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2);
- z-index: 1000; /* Ensure it is above the canvas */
- width: 220px;
- max-height: 400px;
- overflow-y: auto;
- `;
- // Grid layout for buttons
- const buttonGrid = menu.querySelector('#buttonGrid');
- buttonGrid.style.cssText = `
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 10px;
- `;
- // Menu events
- menu.querySelector('#closeButton').addEventListener('click', () => {
- menu.remove();
- });
- menu.querySelectorAll('button').forEach(button => {
- button.addEventListener('click', () => {
- const transitionName = button.dataset.transition;
- const duration = parseInt(button.dataset.duration, 10);
- const color = document.getElementById('colorInput').value;
- const transition = transitions.find(t => t.name === transitionName);
- if (transition) {
- transition.effectFunction(color, duration);
- }
- });
- });
- // Dragging the menu
- let isDragging = false;
- let offsetX, offsetY;
- menu.addEventListener('mousedown', (e) => {
- isDragging = true;
- offsetX = e.clientX - menu.offsetLeft;
- offsetY = e.clientY - menu.offsetTop;
- });
- document.addEventListener('mouseup', () => {
- isDragging = false;
- });
- document.addEventListener('mousemove', (e) => {
- if (isDragging) {
- menu.style.left = (e.clientX - offsetX) + 'px';
- menu.style.top = (e.clientY - offsetY) + 'px';
- }
- });
- document.body.appendChild(menu);
- }
- const menuItems = transitions.map(transition => ({ name: transition.name }));
- createMenu('Drawaria Transitions', menuItems);
- })();