C# 飞船精灵的程序生成
我已经研究这个话题好几天了,我知道它是如何工作的,但是我想我应该在这里发布一些其他的想法 我想做的是生成用于游戏的飞船精灵/图像。外观和感觉应类似于: 基本上,我的想法可以归结为:C# 飞船精灵的程序生成,c#,graphics,procedural-programming,C#,Graphics,Procedural Programming,我已经研究这个话题好几天了,我知道它是如何工作的,但是我想我应该在这里发布一些其他的想法 我想做的是生成用于游戏的飞船精灵/图像。外观和感觉应类似于: 基本上,我的想法可以归结为: 生成形成船舶“核心”的基础形状。形状可以包括圆形、椭圆形、菱形、圆角矩形等 生成覆盖在核心形状上或通过简单管道连接的较小子形状。(所有子形状都会镜像以创建对称的船。) 生成更小的子形状(细节形状),将其覆盖在任何现有形状上。(这些构成了船舶的“细节”。) 选择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几何体,因为它们为船舶旋转设置了动画,我不知道你是否想这样做,因为如果你这样做了,这将不会太好;)这无疑是对算法的一个有趣的补充。这将使船舶的着色和纹理更加容易,因为每一层都可以