C# 飞船精灵的程序生成

C# 飞船精灵的程序生成,c#,graphics,procedural-programming,C#,Graphics,Procedural Programming,我已经研究这个话题好几天了,我知道它是如何工作的,但是我想我应该在这里发布一些其他的想法 我想做的是生成用于游戏的飞船精灵/图像。外观和感觉应类似于: 基本上,我的想法可以归结为: 生成形成船舶“核心”的基础形状。形状可以包括圆形、椭圆形、菱形、圆角矩形等 生成覆盖在核心形状上或通过简单管道连接的较小子形状。(所有子形状都会镜像以创建对称的船。) 生成更小的子形状(细节形状),将其覆盖在任何现有形状上。(这些构成了船舶的“细节”。) 选择3-5种颜色,对每个形状随机着色,使叠加的形状颜色不同

我已经研究这个话题好几天了,我知道它是如何工作的,但是我想我应该在这里发布一些其他的想法

我想做的是生成用于游戏的飞船精灵/图像。外观和感觉应类似于:

基本上,我的想法可以归结为:

  • 生成形成船舶“核心”的基础形状。形状可以包括圆形、椭圆形、菱形、圆角矩形等

  • 生成覆盖在核心形状上或通过简单管道连接的较小子形状。(所有子形状都会镜像以创建对称的船。)

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

  • 选择3-5种颜色,对每个形状随机着色,使叠加的形状颜色不同

  • 将纹理或渐变应用于核心和子形状(而非细节形状),使船舶具有三维外观


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

    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
    

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

  • 机身
  • 驾驶舱
  • 翅膀
  • 翼饰
  • 后置发动机
  • 等等

    每一层都是相同的尺寸,由艺术家设计,以正确居中。:)还要注意,这些层中的任何一层都可以包含任何内容,甚至可以是空的。现在,简单的随机化应该会给你一艘漂亮、可信和独特的飞船


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

    其实我早就这样做了!我谈了更多的细节,你会的。我会尽量找一张照片,如果我还有一张,等一下。我甚至可能有旧代码。我很乐意把它给你。LMAO,多么古老的项目档案啊,真不敢相信我在野外工作之前就做了这么多东西。。。看起来我没有,但我确实有类似的东西,它甚至可能在那个项目中,让我把它放在Eclipse中并检查一下。不,这不是我要找的项目,也不是我要建的项目,bugger有33个错误。我还丢失了我的随机行星生成代码,可能还有一大堆其他项目

    忠告:

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

    我的建议是,限制可能性,使用不同的部件,每个部件都有自己的类型,并且能够连接到特定类型的其他部件。就像一座房子,你可以做以下的事情。墙,连接到其他墙,有些墙有窗槽。有些墙有门槽等。墙可能有窗槽和水线槽

    在这种宇宙飞船的情况下,上面的描述会更有意义。确保每种类型的部件都遵循下降趋势,因此船的底部将是一个4,连接到一个或多个3,每个连接到一个或多个2,每个连接到一个或多个1。当随机选择一件物品时,我建议整个物品都要使用,就像单一类型的激光武器一样。另外,一定要考虑允许项目按大小缩放,以便更好地重用部件。


    我认为这是一个令人惊叹的项目,但同时也是一个非常耗时的项目。我希望你玩得开心,让我知道一切进展如何

    我不能肯定,但那些看起来像是手绘的。你会这么想,但事实并非如此。他们来自这里:。如果你仔细观察,你会发现有些船没有完全连接。一个基类“shipshape”怎么样:P有一个draw方法。该类将有“连接点”和“原点”。因此,您可以将shipshapes附加到树状结构中,并在根上调用draw(这将通过子级递归),这些形状将绘制它们自己,使其原点与它们附加到父级上的连接点对齐。我认为树状结构将有助于描述,最终,序列化并存储给定的设计。真的我遇到的最大问题是概念化如何实际绘制各种形状,以获得示例图像中显示的多样性。猜测绘制一个随机形状并沿Y轴镜像。我不认为OP希望使用原语绘制整个宇宙飞船,而是使用部件的组合来组成独特的宇宙飞船。有吗可行的算法是可以接受的。如果我能避免画100个小零件,那就好了我认为这些部分可能是通过矢量方法渲染的类,只定义了一个“形状”,我没有实现连接点,但你明白了:)看看你链接的xeno样本,尽管它们似乎正在生成3d几何体,因为它们为船舶旋转设置了动画,我不知道你是否想这样做,因为如果你这样做了,这将不会太好;)这无疑是对算法的一个有趣的补充。这将使船舶的着色和纹理更加容易,因为每一层都可以