3

我已经研究这个主题几天了,并且知道它是如何工作的,但我想我会在这里发布一些其他想法。

我想做的是生成要在游戏中使用的宇宙飞船精灵/图像。外观和感觉应该类似于这些飞船精灵

基本上,我的想法归结为这样的事情:

  1. 生成构成船“核心”的基本形状。形状可以包括圆形、椭圆形、菱形、圆角矩形等。

  2. 生成较小的子形状,这些子形状要么覆盖在核心形状上,要么通过简单的管道连接。(所有子形状都被镜像以创建对称的船。)

  3. 生成更小的子形状(细节形状),将它们覆盖在任何现有形状上。(这些构成了船的“细节”。)

  4. 选择 3-5 种颜色,随机着色每个形状,使叠加的形状颜色不一样。

  5. 将纹理或渐变应用到核心和子形状(不是细节形状),为船提供 3-d 外观。

有没有人知道一种方法来实现这样的算法来实现宇宙飞船的理想外观?

4

3 回答 3

5

你的想法是对的,除了要真正由艺术家驱动,你应该使用一组一致的图层。为每个图层类生成多个图像。

  1. 机身
  2. 座舱
  3. 翅膀
  4. 翼饰
  5. 后置发动机

等等。

这些层中的每一层都是相同的大小,并且由艺术家设计为正确居中。:) 另请注意,这些层中的任何一个都可以包含任何内容,甚至是空的。现在简单的随机化应该给你一个漂亮、可信和独特的船。:)

您也完全可以在每组“引擎”类图层图像旁边添加像素坐标,您可以将其用作不同位置喷气发动机火焰的“中心”。

于 2012-07-02T19:57:41.627 回答
1

实际上我很久以前就这样做了!我进入了更多的细节,然后你会。我会试着找一张照片,如果我还有一张,请稍等。我什至可能有旧代码。我很乐意把它给你。LMAO,多么古老的项目档案啊,简直不敢相信我在从事该领域工作之前就制作了所有这些东西……似乎我没有,但我确实有类似性质的东西,甚至可能在那个项目中,让我把它放在 Eclipse 中并检查一下。不,不是我正在寻找的项目,也不是它构建的项目,bugger 有 33 个错误。我还丢失了我的随机行星生成代码,可能还有一大堆其他项目。

建议:

我尝试从头开始生成整艘船,这意味着几乎没有任何限制。它通过随机化点来工作,然后我会镜像它。我会得到这样的结果:(它不会让我发布图片,抱歉)。

我的建议是限制可能性,并使用具有自己类型的各个部分,并能够连接到特定类型的其他部分。就像房子一样,您将执行以下操作。墙壁,连接到其他墙壁,一些墙壁有窗槽。一些墙壁有门槽等。墙壁可能有一个窗口槽和一个水线槽。

在这种宇宙飞船的情况下,上述内容会更有意义。确保每种类型的棋子都遵循下降趋势,因此船的底部将是一个 4,它将连接到一个或多个 3,每个 3 将连接到一个或多个 2,每个 2 将连接到一个或多个1的。当随机选择一个项目时,我会建议整个项目都使用,就像一个单一类型的激光武器。此外,请务必考虑允许项目按比例缩放,以便您可以更好地重复使用零件。

我认为这是一个了不起的项目,但也是一个非常耗时的项目。我希望你玩得开心,让我知道进展如何!

于 2014-02-17T02:50:22.323 回答
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

输出图像

于 2012-07-02T19:52:28.373 回答