Nano Hash - криптовалюты, майнинг, программирование

Как организовать графику и рисунок в Java

Я работал с графическим программированием на Java и чувствую, что понимаю, как это работает.

Одна вещь, которая мне не нравится/еще не понята, это то, как управлять рисованием большого количества графики (фигуры, изображения и т. д.) на панели.

Во всех книгах/учебниках, которые я сейчас просматриваю, вы помещаете весь рисунок, который хотите сделать, в функцию paintCompnents/paint. Бывший,

public void paint(Graphics g){
    //do stuff here....
}

Дело в том, что у меня так много всего, что я хочу нарисовать, что помещать кучу кода в одну функцию уродливо, трудно читать и затрудняет управление/редактирование...

Я понимаю ООП, но я новичок в программировании графики. Как мне управлять всеми «данными», которые я хочу нарисовать на своем холсте (точнее, JPanel). В настоящее время я вызываю функции внутри метода paint(..). Бывший,

public void paint(Graphics g){
    drawCars(g, x,y,wid,len,etc,etc);
}

тогда...

drawCars(Graphics g, int x, int y, int wid, etc etc){
    g.drawSomething(x,y,wid,len,)
    g.drawAnotherThing(x+90,y+60,etc, etc);
}

Проблема в том, что в моем классе JPanel у меня есть все эти случайные функции, которыми я должен управлять.

И это только для рисования «одной страницы» материала. Я не могу представить, что мне нужно переключать виды или экран игры, где у меня может быть куча вещей, анимируемых на странице..

Я просто ищу направление о том, как организовать код, нарисованный методом paint() в java, поэтому я не схожу с ума, глядя на свою старую работу. Любые учебные пособия, книги (особенно если они бесплатны) или, может быть, хороший код для чтения будут очень и очень оценены.

Все, что я нашел до сих пор, касается обучения тому, что вы «можете» делать с графикой/графикой 2D/java, но я ищу советы по организации/стилю, предложенные экспертами.

16.08.2012

Ответы:


1

Создавайте классы для логических вещей, которые вы рисуете, таких как автомобили. Каждый объект будет знать все, что ему нужно знать, чтобы нарисовать себя, например положение, размер и цвет. Если вы позволите всем этим объектам реализовывать общий интерфейс, вы сможете объединить их в список. Когда приходит время рисовать их, вы перебираете список и вызываете метод рисования каждого объекта.

Кроме того, хорошо документируйте код рисования, чтобы для каждого оператора рисования было ясно, какая часть является фактическим рисунком.

16.08.2012
  • Вы говорите, что создайте классы, которые реализуют метод рисования (paint()) и перебирают их? В этом случае мне пришлось бы взять свой объект Graphics/Graphics2D и передать его этим классам (поэтому метод рисования рисуется на текущей панели) 16.08.2012
  • Вы должны передать объект Graphics методу рисования/рисования. 16.08.2012
  • Попробуйте подумать о рисовании слоями. Либо создайте ряд методов, позволяющих логически реплицировать эти слои, либо, как предлагает Элке, используйте классы для разделения этих слоев. Это связано со сложностью вашего дизайна 16.08.2012
  • Спасибо, надеюсь попробую сделать. Есть ли у вас какие-либо рекомендуемые чтения/материал? @MadProgrammer 17.08.2012

  • 2

    разлил его, в g вызываем метод, который бы отрисовывал определенную часть. если бы вы рисовали дом, а не просто drawRect, и все такое

    drawRoof(g);
    drawDoor(g);
    

    то в них у вас есть грязные вещи, такие как drawRect...

    Это полезно, я могу неправильно понять, что вы ищете...

    16.08.2012
  • Это то, что я сейчас делаю. Это просто потому, что когда у меня есть куча вещей, становится много функций, и когда я хочу выполнить обнаружение столкновений, у меня нет объектов, из которых можно быстро получить данные, а скорее мне нужно просмотреть свои функции и определить, в каком пространстве они находятся. снова взяться за... и т.д. и т.п... 16.08.2012
  • Попался, я думаю, что у @Eelke есть идея, тогда вы можете хранить больше информации и легко получить к ней доступ. Итак, вы ответили на вопрос или ищете еще? 16.08.2012
  • Думаю, я понял. Я не понимал, что для создания фигур и их рисования можно использовать другой класс (не класс jpanel). Затем, наконец, создайте экземпляр этого класса в методе рисования моего текущего класса jpanel. 16.08.2012
  • Да, и вы даже можете добавить такие свойства, как doesContain(x,y), чтобы увидеть, содержится ли точка в изображении, удачи :) 16.08.2012
  • Спасибо, @Zeb, ты случайно не знаешь какой-нибудь хороший код/книги/туты по этой теме, не так ли? 17.08.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..