RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1501973
Accepted
Twin
Twin
Asked:2023-03-04 08:28:11 +0000 UTC2023-03-04 08:28:11 +0000 UTC 2023-03-04 08:28:11 +0000 UTC

如何缩短这段代码?

  • 772

我刚开始学习编程语言,想学习如何写得漂亮简洁,所以知道如何缩短以下代码将不胜感激:

int SpriteAnimation()
{
if (x + y != 2)
{
    if (x <= 12)
    {
        tcordLeft = (x - 1) * scale,
        tcordUp = (y - 1) * scale,
        tcordRight = x * scale,
        tcordDown = y * scale;
    }
    else
    {
        x = 0;
        if (y == 12)
        {
            tcordLeft = (x - 1) * scale,
            tcordUp = (y - 1) * scale,
            tcordRight = x * scale,
            tcordDown = y * scale;
            y = 1;
        }
        else
        {
            y++;
        }
    }
}
else
{
    tcordLeft = scale - scale,
    tcordUp = scale - scale,
    tcordRight = scale,
    tcordDown = scale;
}
x++;
return 0;
}

下面是所有变量的含义:

int x = 1, y = 1; //номера спрайтов по оси x и y
float spritesheetsize = 0.1152, spritesize = 0.96; 
//spritesheetsize - размер спрайтлиста (1152 пикселя в ширину и высоту)
//spritesize - размер одного спрайта (96 пикселей в ширину и высоту)
float scale = spritesize / spritesheetsize * 0.1 * 0.1;
//scale - масштабирование под нужный размер отображение
float tcordLeft,
  tcordUp,
  tcordRight,
  tcordDown;
//текстурные координаты для отображение нужного спрайта из спрайтлиста

我想我写了很多额外的东西,这段代码可以减少,但我不知道如何)

c++
  • 2 2 个回答
  • 99 Views

2 个回答

  • Voted
  1. Best Answer
    Stanislav Volodarskiy
    2023-03-04T18:47:03Z2023-03-04T18:47:03Z

    在缩短代码之前,我们需要了解它的作用。下面是一个打印里面发生的事情的程序SpriteAnimation:

    #include <iostream>
    
    using namespace std;
    
    int x = 1, y = 1; //номера спрайтов по оси x и y
    float spritesheetsize = 0.1152, spritesize = 0.96; 
    //spritesheetsize - размер спрайтлиста (1152 пикселя в ширину и высоту)
    //spritesize - размер одного спрайта (96 пикселей в ширину и высоту)
    float scale = spritesize / spritesheetsize * 0.1 * 0.1;
    //scale - масштабирование под нужный размер отображение
    float tcordLeft,
      tcordUp,
      tcordRight,
      tcordDown;
    //текстурные координаты для отображение нужного спрайта из спрайтлиста
    
    
    void dump() {
        cout << ", x = "          << x
             << ", y = "          << y
             << ", tcordLeft = "  << tcordLeft
             << ", tcordUp = "    << tcordUp
             << ", tcordRight = " << tcordRight
             << ", tcordDown = "  << tcordDown
        ;
    }
    
    int SpriteAnimation()
    {
        cout << "SpriteAnimation, x = " << x << ", y = " << y;
        if (x + y != 2)
        {
            if (x <= 12)
            {
                tcordLeft = (x - 1) * scale,
                tcordUp = (y - 1) * scale,
                tcordRight = x * scale,
                tcordDown = y * scale;
                dump();
            }
            else
            {
                x = 0;
                if (y == 12)
                {
                    tcordLeft = (x - 1) * scale,
                    tcordUp = (y - 1) * scale,
                    tcordRight = x * scale,
                    tcordDown = y * scale;
                    dump();
                    y = 1;
                }
                else
                {
                    y++;
                }
            }
        }
        else
        {
            tcordLeft = scale - scale,
            tcordUp = scale - scale,
            tcordRight = scale,
            tcordDown = scale;
            dump();
        }
        x++;
        cout << '\n';
        return 0;
    }
    
    int main() {
        for (int i = 0; i < 200; ++i) {
            SpriteAnimation();
        }
    }
    

    每次函数更新精灵的坐标,但有时它会跳过迭代。在摘录的倒数第二行中,精灵的坐标没有改变。如果我们有动画,它会卡顿:

    SpriteAnimation, x = 1, y = 1, x = 1, y = 1, tcordLeft = 0, tcordUp = 0, tcordRight = 0.0833333, tcordDown = 0.0833333
    SpriteAnimation, x = 2, y = 1, x = 2, y = 1, tcordLeft = 0.0833333, tcordUp = 0, tcordRight = 0.166667, tcordDown = 0.0833333
    SpriteAnimation, x = 3, y = 1, x = 3, y = 1, tcordLeft = 0.166667, tcordUp = 0, tcordRight = 0.25, tcordDown = 0.0833333
    SpriteAnimation, x = 4, y = 1, x = 4, y = 1, tcordLeft = 0.25, tcordUp = 0, tcordRight = 0.333333, tcordDown = 0.0833333
    SpriteAnimation, x = 5, y = 1, x = 5, y = 1, tcordLeft = 0.333333, tcordUp = 0, tcordRight = 0.416667, tcordDown = 0.0833333
    SpriteAnimation, x = 6, y = 1, x = 6, y = 1, tcordLeft = 0.416667, tcordUp = 0, tcordRight = 0.5, tcordDown = 0.0833333
    SpriteAnimation, x = 7, y = 1, x = 7, y = 1, tcordLeft = 0.5, tcordUp = 0, tcordRight = 0.583333, tcordDown = 0.0833333
    SpriteAnimation, x = 8, y = 1, x = 8, y = 1, tcordLeft = 0.583333, tcordUp = 0, tcordRight = 0.666667, tcordDown = 0.0833333
    SpriteAnimation, x = 9, y = 1, x = 9, y = 1, tcordLeft = 0.666667, tcordUp = 0, tcordRight = 0.75, tcordDown = 0.0833333
    SpriteAnimation, x = 10, y = 1, x = 10, y = 1, tcordLeft = 0.75, tcordUp = 0, tcordRight = 0.833333, tcordDown = 0.0833333
    SpriteAnimation, x = 11, y = 1, x = 11, y = 1, tcordLeft = 0.833333, tcordUp = 0, tcordRight = 0.916667, tcordDown = 0.0833333
    SpriteAnimation, x = 12, y = 1, x = 12, y = 1, tcordLeft = 0.916667, tcordUp = 0, tcordRight = 1, tcordDown = 0.0833333
    SpriteAnimation, x = 13, y = 1
    SpriteAnimation, x = 1, y = 2, x = 1, y = 2, tcordLeft = 0, tcordUp = 0.0833333, tcordRight = 0.0833333, tcordDown = 0.166667
    ...
    

    当我们到达纸张的边缘并回到它的开头时,我们不会卡顿,而是转向负坐标。中线:

    ...
    SpriteAnimation, x = 11, y = 12, x = 11, y = 12, tcordLeft = 0.833333, tcordUp = 0.916667, tcordRight = 0.916667, tcordDown = 1
    SpriteAnimation, x = 12, y = 12, x = 12, y = 12, tcordLeft = 0.916667, tcordUp = 0.916667, tcordRight = 1, tcordDown = 1
    SpriteAnimation, x = 13, y = 12, x = 0, y = 12, tcordLeft = -0.0833333, tcordUp = 0.916667, tcordRight = 0, tcordDown = 1
    SpriteAnimation, x = 1, y = 1, x = 1, y = 1, tcordLeft = 0, tcordUp = 0, tcordRight = 0.0833333, tcordDown = 0.0833333
    SpriteAnimation, x = 2, y = 1, x = 2, y = 1, tcordLeft = 0.0833333, tcordUp = 0, tcordRight = 0.166667, tcordDown = 0.0833333
    ...
    

    该代码尝试遍历地图集上的精灵,并且通常做得很好。但有两个错误需要更正。在我看来,不修复代码更容易,而是编写新代码。结果是这样的:

    #include <iostream>
    
    using namespace std;
    
    const int atlas_size = 1152;
    const int sprite_size = 96;
    const float scale = sprite_size / static_cast<float>(atlas_size);
    const int n = atlas_size / sprite_size;
    
    int x = 0; // номер спрайта по горизонтали
    int y = 0; // номер спрайта по вертикали
    
    //текстурные координаты для отображения нужного спрайта из спрайтлиста
    float tcordLeft;
    float tcordUp;
    float tcordRight;
    float tcordDown;
    
    void dump() {
        cout << ", x = "          << scale * x
             << ", y = "          << scale * y
             << ", tcordLeft = "  << tcordLeft
             << ", tcordUp = "    << tcordUp
             << ", tcordRight = " << tcordRight
             << ", tcordDown = "  << tcordDown
        ;
    }
    
    void SpriteAnimation() {
        cout << "SpriteAnimation, x = " << x << ", y = " << y;
    
        tcordLeft  = scale * x      ;
        tcordUp    = scale * y      ;
        tcordRight = scale * (x + 1);
        tcordDown  = scale * (y + 1);
        dump();
    
        ++x;
        if (x >= n) {
            x = 0;
            ++y;
            if (y >= n) {
                y = 0;
            }
        }
    
        cout << '\n';
    }
    
    int main() {
        for (int i = 0; i < 200; ++i) {
            SpriteAnimation();
        }
    }
    

    如果删除所有调试:

    const int atlas_size = 1152;
    const int sprite_size = 96;
    const float scale = sprite_size / static_cast<float>(atlas_size);
    const int n = atlas_size / sprite_size;
    
    int x = 0; // номер спрайта по горизонтали
    int y = 0; // номер спрайта по вертикали
    
    //текстурные координаты для отображения нужного спрайта из спрайтлиста
    float tcordLeft;
    float tcordUp;
    float tcordRight;
    float tcordDown;
    
    void SpriteAnimation() {
        tcordLeft  = scale * x      ;
        tcordUp    = scale * y      ;
        tcordRight = scale * (x + 1);
        tcordDown  = scale * (y + 1);
    
        ++x;
        if (x >= n) {
            x = 0;
            ++y;
            if (y >= n) {
                y = 0;
            }
        }
    }
    

    我无法抗拒展示另一个简码的诱惑。他的速度似乎很快。每次迭代平均1.08(3)次检查和0.9930(5)次添加:

    const int atlas_size = 1152;
    const int sprite_size = 96;
    const float scale = sprite_size / static_cast<float>(atlas_size);
    
    //текстурные координаты для отображения нужного спрайта из спрайтлиста
    float tcordLeft = 0;
    float tcordUp = 0;
    float tcordRight = scale;
    float tcordDown = scale;
    
    void SpriteAnimation() {
        if (tcordRight < 1 - scale / 2) {
            tcordLeft = tcordRight;
            tcordRight += scale;
        } else {
            tcordLeft = 0;
            tcordRight = scale;
    
            if (tcordDown < 1 - scale / 2) {
                tcordUp = tcordDown;
                tcordDown += scale;
            } else {
                tcordUp = 0;
                tcordDown = scale;
            }
        }
    }
    
    • 4
  2. Harry
    2023-03-04T14:42:08Z2023-03-04T14:42:08Z

    好吧,如果我没弄错(我没有做任何特殊检查,但我不想写所有的捆扎以供验证),那么你可以这样做:

    int SpriteAnimation()
    {
        if ( x+y == 12 ) {
            tcordLeft  = tcordUp   = 0;
            tcordRight = tcordDown = scale;
        }
        else
        {
            if (x > 12) x = 0;
            if (x <= 12 || y == 12)
            {
                tcordLeft = (x - 1) * scale;
                tcordUp   = (y - 1) * scale;
                tcordRight = x * scale;
                tcordDown  = y * scale;
            }
            if (x > 12) y += 1 - 12*(y == 12);
        }
        x++;
        return 0;
    }
    

    注意:我不对作者在源代码中的错误负责。我修改了作者的代码。

    • 2

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5