2012-07-02 2 views
3

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

Что бы я хотел сделать, это создать спрайты/изображения космического корабля, которые будут использоваться в игре. Внешний вид должен быть похож на these: spaceship sprites http://i50.tinypic.com/10z1hq9.png

В основном, моя идея сводится к тому, что-то вроде этого:

  1. Сформировать базовую форму, которая образует «ядро» корабля. Формы могут включать круги, овалы, алмазы, прямоугольники с закругленными углами и т. Д.

  2. Создайте небольшие подформы, которые накладываются на форму сердечника или соединены простым трубой. (Все вспомогательные формы зеркалированы для создания симметричного корабля.)

  3. Создайте еще меньшие подформы (фигуры деталей), наложите их на любую существующую форму. (Они формируют «детали» корабля.)

  4. Выберите 3-5 цветов, произвольно затеняйте каждую фигуру, поэтому наложенные фигуры не будут иметь один и тот же цвет.

  5. Примените текстуру или градиенты к ядру и подрамкам (не детализированные фигуры), чтобы дать кораблю трехмерный вид.

Кто-нибудь знает, как реализовать такой алгоритм, чтобы достичь желаемого вида космических кораблей?

+0

Я не могу быть уверен, но они кажутся рисованной. – Dani

+0

Вы бы так подумали, но это не так. Они отсюда: http://boonclawgames.wordpress.com/2010/11/26/procedurally-generated-spacecraft-in-xeno/. Если вы посмотрите внимательно, вы увидите, что некоторые из кораблей не подключены полностью. – jpreed00

+1

как насчет базового класса «корабль»: P, который имеет метод рисования. Класс будет иметь «точки соединения» и точку «происхождения». Таким образом, вы можете прикреплять корабли в дереве, подобном структуре, и называть призыв к корню (который будет рекурсивно проходить через дочерние элементы). Формы будут привязываться к месту происхождения, привязанным к точке подключения, к которой они привязаны к их родителям. – PeanutPower

ответ

1

System.Drawing.Drawing2D.GraphicsPath может быть полезен здесь для создания векторных дорожек. Затем вы можете заполнить и добавить штрих к этим путям для создания разных фигур.

Вы можете использовать System.Drawing.Drawing2D.LinearGradientBrush для ваших градиентов.

Хотелось бы увидеть ваш код, если у вас что-то случится. Это кажется крутой идеей.

Просто для удовольствия я постучался это вместе в VB.NET:

Imports System.Drawing.Drawing2D 

Public MustInherit Class ShipShape 
    Public Layout As New Rectangle(0, 0, 128, 128) 
    Public MustOverride Sub Draw(ByVal g As Graphics) 

    Public Shared Sub DrawRoundedRectangle(ByVal gp As GraphicsPath, ByVal r As Rectangle, ByVal d As Integer) 
     gp.AddArc(r.X, r.Y, d, d, 180, 90) 
     gp.AddLine(CInt(r.X + d/2), r.Y, CInt(r.X + r.Width - d/2), r.Y) 
     gp.AddArc(r.X + r.Width - d, r.Y, d, d, 270, 90) 
     gp.AddLine(CInt(r.X + r.Width), CInt(r.Y + d/2), CInt(r.X + r.Width), CInt(r.Y + r.Height - d/2)) 
     gp.AddArc(r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90) 
     gp.AddLine(CInt(r.X + d/2), CInt(r.Y + r.Height), CInt(r.X + r.Width - d/2), CInt(r.Y + r.Height)) 
     gp.AddArc(r.X, r.Y + r.Height - d, d, d, 90, 90) 
     gp.AddLine(r.X, CInt(r.Y + d/2), r.X, CInt(r.Y + r.Height - d/2)) 
    End Sub 

    Public Shared Sub main() 
     Dim b As New Bitmap(640, 480) 
     Dim g As Graphics = Graphics.FromImage(b) 
     g.Clear(Color.Magenta) 
     Dim Hull As New HullShape 
     Hull.Layout = New Rectangle(640 * 0.5 - 128 * 0.5, 480 * 0.5 - 128 * 0.5, 128, 128) 
     Hull.Draw(g) 
     Dim Wing1 As New HullShape 
     Wing1.Layout = New Rectangle(Hull.Layout.X - 32, Hull.Layout.Y - 32, 32, Hull.Layout.Height + 64) 
     Wing1.Draw(g) 
     Dim Wing2 As New HullShape 
     Wing2.Layout = New Rectangle(Hull.Layout.X + Hull.Layout.Width, Hull.Layout.Y - 32, 32, Hull.Layout.Height + 64) 
     Wing2.Draw(g) 
     b.Save("test.png") 
    End Sub 

End Class 

Public Class HullShape 
    Inherits ShipShape 
    Public Overrides Sub Draw(ByVal g As System.Drawing.Graphics) 
     Dim gp As New GraphicsPath 
     ShipShape.DrawRoundedRectangle(gp, Layout, 30) 
     Dim MetalBrush As New LinearGradientBrush(Layout, Color.Gainsboro, Color.Gray, 0) 
     g.FillPath(MetalBrush, gp) 
     g.DrawPath(Pens.Black, gp) 
    End Sub 
End Class 

Output image

+2

Я не думаю, что OP хочет нарисовать весь космический корабль с помощью примитивов, а скорее составить уникальные космические корабли, используя комбинацию деталей. – Ani

+0

Любой алгоритм, который работает, будет приемлемым. Если я смогу избежать рисования 100-х крошечных частей, это будет хорошо. :) – jpreed00

+0

Я думаю, что части могут быть классами, которые визуализируются с помощью векторных методов. – PeanutPower

5

Вы на правильную идею, за исключением того, что быть действительно художником приводом, вы должны использовать последовательный набор слоев. Создайте несколько изображений для каждого класса класса.

  1. Фюзеляж
  2. Бортовые
  3. Крылья
  4. Wing-бижутерия
  5. Задние двигатели

и так далее.

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

Возможно также, что вы можете добавить пиксельные координаты вместе с каждым слоем слоя «двигатель», который вы можете использовать как «центр» разного расположения пламени реактивного двигателя.

+0

Это определенно интересное дополнение к алгоритму. Это значительно упростит окраску и текстурирование корабля, так как каждый слой может быть 1 цвет. Это также сделает цветовую схему более последовательной (т. Е. Все двигатели будут одного цвета и текстурированы одинаково и т. Д.) – jpreed00

+0

Да, с несколькими слоями (и альфа), возможно изменение различных эффектов. Даже поврежденные детали могут быть представлены другой версией того же слоя. – Ani

1

Я действительно сделал это давным-давно! Я пошел в более подробные подробности, чем вы. Я постараюсь найти картину, если у меня все еще есть кто-то, лежащий вокруг, держитесь. У меня может даже быть старый код. Я бы с удовольствием отдам его тебе. LMAO, какой архив старых проектов, не могу поверить, что я сделал все это до того, как работал в этой области ... Не похоже, что у меня есть это, но у меня есть что-то похожее, и это может даже быть внутри этого проекта, позвольте мне поместить его в Eclipse и проверить его. Нет, не был проектом, который я искал, и не строит, у педераста 33 ошибки. Я также потерял свой рандомизированный код генерации планеты и, вероятно, целую массу других проектов.

Совет:

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

Что я хотел бы предложить, ограничивает возможности и использует различные части, каждый со своим типом, с возможностью подключения к другим частям определенного типа. Как для дома, вы бы сделали следующее. Стены, соединяются с другими стенами, некоторые стены имеют оконный проем. В некоторых стенах есть щель и т. Д. У стены может быть оконный прорезь и слот для ватерлинии.

В этом случае космических кораблей вышеизложенное имеет смысл. Удостоверьтесь, что каждый тип произведения следует нисходящему тренду, поэтому базой корабля будет 4, который будет соединяться с одним или несколькими 3-мя, каждый из которых будет соединяться с одним или несколькими 2-мя, каждый из которых будет соединяться с одним или несколькими 1-х. При случайном выборе предмета я предлагаю использовать этот предмет повсюду, как однотипное лазерное оружие. Кроме того, не забудьте рассмотреть возможность масштабирования размеров элементов, чтобы вы могли лучше использовать детали.

Я думаю, что это потрясающий проект, но также очень трудоемкий, чтобы сделать правильно. Надеюсь, вам понравится, и дайте мне знать, как это происходит!

+1

Загрузка старого кода будет великолепной. Мне было бы очень интересно узнать, можно ли это проследить. – jpreed00

 Смежные вопросы

  • Нет связанных вопросов^_^