Helpers - компьютеры, интернет, программирование

Зазубренные края в Cocos2D — проблема со сглаживанием?

В настоящее время мы разрабатываем игру, включающую графы (узлы, соединенные ребрами), и мы хотим иметь возможность перемещать узлы. У нас есть узлы, движущиеся (реагирующие на прикосновение), но когда ребра (инициализированные изображениями .png) повторно визуализируются в результате перемещения узлов, они выглядят неровными. Мы пробовали играть с алиасингом и сглаживанием, но края получаются неровными независимо от того, что мы делаем.

Здесь мы инициализируем краевые изображения (с файлом изображения):

-(id) initWithSet:(int)setNum Level:(int) levelNum
{
    if( (self=[super init]) ) {

           <code omitted>

           for (NSArray *e in self.level.targetGraph) {

               <code omitted>

               CCSprite *edgeOutline = [CCSprite spriteWithFile:@"EdgeOutline.png"];
               [edgeOutline setPosition:ccp((ax+bx)/2, (ay+by)/2)];
               edgeOutline.scaleX = (dist * edgeOutline.scaleX)/edgeOutline.contentSize.width;
               edgeOutline.scaleY = (self.nodeSize * 0.5 * edgeOutline.scaleY)/edgeOutline.contentSize.height;
               edgeOutline.rotation = -angle;
               [outlines addChild:edgeOutline];

               CCSprite *edgeFill = [CCSprite spriteWithFile:@"EdgeFill.png"];
               [edgeFill setPosition:ccp((ax+bx)/2, (ay+by)/2)];
               edgeFill.scaleX = (dist * edgeFill.scaleX)/edgeFill.contentSize.width;
               edgeFill.scaleY = (self.nodeSize * 0.4 * edgeFill.scaleY)/edgeFill.contentSize.height;
               edgeFill.rotation = -angle;
               [fills addChild:edgeFill];

         }

  return self;
}

И здесь мы обновляем рисунки ребер (используя вторую половину метода nextFrame):

- (void) nextFrame:(ccTime)dt {

    for (NSArray *e in self.level.graph) {
        CCSprite *a = [self.graphNodeOutlines objectForKey:[e objectAtIndex:0]];
        double ax = a.position.x;
        double ay = a.position.y;
        CCSprite *b = [self.graphNodeOutlines objectForKey:[e objectAtIndex:1]];
        double bx = b.position.x;
        double by = b.position.y;

        double dx = ax-bx;
        double dy = ay-by;
        double angle = 90;
        if (dx != 0) {
            angle = atan2(ay-by, ax-bx)*180/M_PI;
        }
        double dist = sqrt(dx*dx+dy*dy);

        //TODO: get anti-aliasing to work in this next part!

        CCSprite *edgeOutline = [self.graphEdgeOutlines objectForKey:e];
        [edgeOutline setPosition:ccp((ax+bx)/2, (ay+by)/2)];
        edgeOutline.scaleX = (dist)/edgeOutline.contentSize.width;
        edgeOutline.scaleY = (self.nodeSize * 0.25)/edgeOutline.contentSize.height;
        edgeOutline.rotation = -angle;

        //The line we hoped would fix the jagged edge problem.
        [[edgeOutline texture] setAntiAliasTexParameters];

        CCSprite *edgeFill = [self.graphEdgeFills objectForKey:e];
        [edgeFill setPosition:ccp((ax+bx)/2, (ay+by)/2)];
        edgeFill.scaleX = (dist)/edgeFill.contentSize.width;
        edgeFill.scaleY = (self.nodeSize * 0.2)/edgeFill.contentSize.height;
        edgeFill.rotation = -angle;

        //The (same) line we hoped would fix the jagged edge problem.
        [[edgeFill texture] setAntiAliasTexParameters];

    }
}

Мы используем Cocos2D v2.0 и XCode v4.5.

Любая помощь будет принята с благодарностью. Спасибо!

ОБНОВЛЕНИЕ: Изображение, показывающее проблему:

введите здесь описание изображения


  • 1-2 скриншота (правильный и неправильный) очень помогли бы понять проблему 12.01.2013
  • Обновлено ссылкой на картинку. Спасибо за ответ! 13.01.2013
  • если возможно покажите нам EdgeFill.png и EdgeOutline.png 13.01.2013
  • EdgeFill.png и EdgeOutline.png — это черный и белый прямоугольники соответственно. Границ нет — черно-белые прямоугольники занимают все пространство в png. 14.01.2013

Ответы:


1

У меня есть решение! Следуйте разделу «Добавление файла MainWindow.xib» этого руководства: http://www.raywenderlich.com/4817/how-to-integrate-cocos2d-and-uikit

Каким-то образом передача части графической ответственности UIKit решает проблему. Рэй мой спаситель.

РЕДАКТИРОВАТЬ: кажется, что это решает проблему только на ipad. Не знаю, почему.

РЕДАКТИРОВАТЬ 2: игнорировать все это; все сглаживание должно было что-то делать с масштабированием симулятора. Вместо этого помогите мне понять, что означает этот пост: http://www.cocos2d-iphone.org/forum/topic/4773

21.01.2013
  • Вторая ссылка закончилась тем, что сделала свое дело! (cocos2d-iphone.org/forum/topic/4773) 23.01.2013
  • @PriyaLekhaDonti ... я столкнулся с чем-то похожим на вашу проблему с зубчатыми краями, и в моем случае я создал веревки, используя спрайт с динамическим b2body, и я хочу узнать больше об этом сглаживании ... если вы могли бы помочь, тогда это будет оценен. 05.07.2013
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..