有3D眩晕症的看看

六级用户 panndora 20天前 1314

更新:

主要改进点:

1. 颜色过渡效果

  • 使用 get_rainbow_color() 函数生成基于正弦波的RGB彩虹色
  • 通过 color_phase 控制颜色变化,实现平滑的色彩过渡
  • 颜色从红→黄→绿→青→蓝→紫→红 循环变化

2. 防烧屏保护

  • 颜色变化:每16ms(约60FPS)改变一次颜色
  • 位置微调:每隔约0.5秒轻微移动窗口位置(±2像素)
  • 随机移动:每次移动的方向和距离都是随机的

3. 代码结构优化

  • 使用面向对象设计,提高代码可维护性
  • 将动画逻辑分离到独立的方法中
  • 添加了可调节的参数(颜色速度、移动频率等)

4. 性能优化

  • 使用 after() 方法替代 time.sleep(),避免阻塞GUI
  • 只重绘必要的元素
  • 合理的帧率控制

5. 可定制参数

self.color_speed = 0.05      # 颜色变化速度(可调)
self.move_frequency = 30     # 移动频率(可调)
self.move_distance = 2       # 移动距离(可调)

这样改进后,圆点会显示为动态变化的彩色光点,并且会轻微移动,有效防止OLED屏幕烧屏问题。

===============================================

import tkinter as tk
import math
import random

class ColorDotWindow:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Color Dot")
        
        # 颜色动画参数
        self.color_phase = 0
        self.color_speed = 0.025  # 颜色变化速度
        
        # 位置移动参数
        self.move_counter = 0
        self.move_frequency = 30  # 每30次颜色变化移动一次
        self.move_distance = 2    # 每次移动距离(像素)
        
        # 隐藏窗口的标题栏和边框
        self.root.overrideredirect(True)
        
        # 设置窗口置顶
        self.root.attributes('-topmost', True)
        
        # 设置窗口背景透明色
        self.transparent_color = 'magenta'
        self.root.wm_attributes('-transparentcolor', self.transparent_color)
        
        # 设置画布大小
        self.dot_size = 8
        self.border_width = 6
        self.canvas_size = self.dot_size + 2 * self.border_width
        
        # 获取屏幕尺寸并计算居中位置
        self.screen_width = self.root.winfo_screenwidth()
        self.screen_height = self.root.winfo_screenheight()
        self.x = (self.screen_width - self.canvas_size) // 2
        self.y = (self.screen_height - self.canvas_size) // 2
        self.root.geometry(f"{self.canvas_size}x{self.canvas_size}+{self.x}+{self.y}")
        
        # 创建 Canvas
        self.canvas = tk.Canvas(self.root, width=self.canvas_size, height=self.canvas_size, 
                               bg=self.transparent_color, highlightthickness=0)
        self.canvas.pack()
        
        # 绘制初始图形
        self.draw_dot()
        
        # 开始动画循环
        self.animate()
    
    def rgb_to_hex(self, r, g, b):
        """将RGB值转换为十六进制颜色字符串"""
        return f'#{int(r):02x}{int(g):02x}{int(b):02x}'
    
    def get_bright_color(self, phase):
        """根据相位获取高亮度颜色"""
        # 使用HSV色彩空间概念生成明亮的颜色
        # 固定高饱和度和高亮度值
        hue = phase % (2 * math.pi)
        
        # 确保最小RGB值不低于150,最大值为255
        r = math.sin(hue) * 100 + 155
        g = math.sin(hue + 2 * math.pi / 3) * 100 + 155
        b = math.sin(hue + 4 * math.pi / 3) * 100 + 155
        
        # 确保颜色足够亮
        min_val = min(r, g, b)
        if min_val < 100:
            # 如果有颜色太暗,整体提亮
            diff = 100 - min_val
            r += diff
            g += diff
            b += diff
        
        # 确保不超过255
        r = min(255, r)
        g = min(255, g)
        b = min(255, b)
        
        return self.rgb_to_hex(r, g, b)
    
    def get_vibrant_color(self, phase):
        """生成鲜艳的高对比度颜色"""
        # 将色彩空间分为几个明亮的区域
        section = int(phase / (math.pi / 3)) % 6
        
        colors = [
            (255, 50, 50),   # 亮红色
            (255, 150, 50),  # 亮橙色
            (255, 255, 50),  # 亮黄色
            (50, 255, 50),   # 亮绿色
            (50, 150, 255),  # 亮蓝色
            (150, 50, 255),  # 亮紫色
        ]
        
        # 在基础颜色之间进行平滑过渡
        next_section = (section + 1) % 6
        blend = (phase % (math.pi / 3)) / (math.pi / 3)
        
        r1, g1, b1 = colors[section]
        r2, g2, b2 = colors[next_section]
        
        r = r1 + (r2 - r1) * blend
        g = g1 + (g2 - g1) * blend
        b = b1 + (b2 - b1) * blend
        
        return self.rgb_to_hex(r, g, b)
    
    def get_bright_rainbow_color(self, phase):
        """获取明亮的彩虹色 - 最终选择的方案"""
        # 使用更明亮的色彩算法
        r = abs(math.sin(phase) * 127 + 128)
        g = abs(math.sin(phase + math.pi/2) * 127 + 128)
        b = abs(math.sin(phase + math.pi) * 127 + 128)
        
        # 提高整体亮度
        r = min(255, r * 1.2 + 50)
        g = min(255, g * 1.2 + 50)
        b = min(255, b * 1.2 + 50)
        
        # 确保至少有一个颜色分量接近最大值
        max_val = max(r, g, b)
        if max_val < 200:
            scale = 200 / max_val
            r *= scale
            g *= scale
            b *= scale
        
        return self.rgb_to_hex(r, g, b)
    
    def draw_dot(self):
        """绘制带描边的圆点"""
        # 清除画布
        self.canvas.delete("all")
        
        # 获取当前颜色(使用明亮版本)
        current_color = self.get_bright_rainbow_color(self.color_phase)
        
        # 先画黑色描边圆(外圈)
        self.canvas.create_oval(
            self.border_width,
            self.border_width,
            self.canvas_size - self.border_width,
            self.canvas_size - self.border_width,
            outline='black',
            fill='',           
            width=self.border_width
        )
        
        # 再画彩色实心圆(内圈)
        self.canvas.create_oval(
            self.border_width,
            self.border_width,
            self.canvas_size - self.border_width,
            self.canvas_size - self.border_width,
            outline='',
            fill=current_color
        )
    
    def move_window_slightly(self):
        """轻微移动窗口位置"""
        # 随机选择移动方向
        dx = random.randint(-self.move_distance, self.move_distance)
        dy = random.randint(-self.move_distance, self.move_distance)
        
        # 更新位置
        self.x = max(0, min(self.screen_width - self.canvas_size, self.x + dx))
        self.y = max(0, min(self.screen_height - self.canvas_size, self.y + dy))
        
        # 应用新位置
        self.root.geometry(f"{self.canvas_size}x{self.canvas_size}+{int(self.x)}+{int(self.y)}")
    
    def animate(self):
        """动画循环"""
        # 更新颜色相位
        self.color_phase += self.color_speed
        if self.color_phase > 2 * math.pi:
            self.color_phase -= 2 * math.pi
        
        # 重新绘制
        self.draw_dot()
        
        # 增加移动计数器
        self.move_counter += 1
        
        # 定期轻微移动窗口位置
        if self.move_counter >= self.move_frequency:
            self.move_window_slightly()
            self.move_counter = 0
        
        # 继续动画循环(约60FPS)
        self.root.after(16, self.animate)
    
    def run(self):
        """运行主循环"""
        self.root.mainloop()

def create_color_dot_window():
    """创建彩色圆点窗口"""
    app = ColorDotWindow()
    app.run()

if __name__ == "__main__":
    create_color_dot_window()

不依赖第三方库,置顶显示.

玩3D游戏有轻微晕感的,电脑上装有python的可以试试.

现在找个特定功能的小软件的真难,简单的功能动不动就几百兆,还不如AI写一个脚本.

原理: 一个突兀出现的不属于游戏内容的小点,让你的注意力分散,可以有效的减轻3D眩晕的情况.


上一篇:这楼长得像N64
下一篇:游戏里白人当主角的话脸上总要有点雀斑啊痣啊什么的
最新回复 (16)
  • 管理员 Oldman 20天前
    1 2
    啥意思,画个中心点?
  • 四级用户 supervisor 20天前
    0 3
    有窗体循环,没有画图循环,有BUG
  • 四级用户 mrchangkun 20天前
    0 4

    对的  画个点 并且永远前置


    楼主是个有想法的实干人。


    你可以直接打包成可执行程序发布 这样就不需要py环境 人人都可以用了。


    2025-09-18_20h33_24.png

  • 三级用户 flying19880517 19天前
    0 5
    原理是啥?
  • 六级用户 panndora 19天前
    1 6
    flying19880517 原理是啥?
    玩游戏的时候把自己的注意力分一部分到这个白色的小点上面,就是减轻代入感,对3D场景的感知弱化,这样就是减少轻度的3D眩晕症.
  • 六级用户 高木同学 19天前
    2 7

    我直接搞一手白色胶带

    微信图片_20250919154531_90_77.jpg

  • 三级用户 flying19880517 19天前
    1 8
    panndora 玩游戏的时候把自己的注意力分一部分到这个白色的小点上面,就是减轻代入感,对3D场景的感知弱化,这样就是减少轻度的3D眩晕症.

    显示器自带这个功能

  • 六级用户 高木同学 19天前
    0 9
    flying19880517 显示器自带这个功能
    好像是现在高刷显示器的标配了
  • 四级用户 mrchangkun 19天前
    0 10
    高木同学 我直接搞一手白色胶带
    你这创口贴不能忍😅
  • 五级用户 byiceb 19天前
    0 11
    真牛逼,到时候试试
  • 五级用户 ruanxiaorui 19天前
    0 12
    flying19880517 显示器自带这个功能
    回复8楼: 狙击手是啥效果
  • 六级用户 高木同学 19天前
    0 13
    mrchangkun 你这创口贴不能忍😅
    纸胶带这是,想要啥形状自己撕就得了
  • 三级用户 flying19880517 19天前
    0 14
    ruanxiaorui 回复8楼: 狙击手是啥效果
    准星+放大
  • 四级用户 supervisor 19天前
    1 15
    屏幕弄脏留几个点不擦就行了
  • 六级用户 panndora 18天前
    1 16
    更新了,现在是RGB变色且能随机小位移,更能吸引注意力了.
  • 五级用户 zhower 18天前
    0 17
    没有,但是现在也不爱玩Fps了
    • 老男人游戏网配套论坛
      18
        立即登录 立即注册
发新帖
本论坛禁止发布SWITCH和PS4相关资源,若有其他侵权内容,请致邮3360342659#qq.com(#替换成@)删除。