我已经研究这个话题有几天了,并且知道它是如何工作的,但是我想我应该在这里发表一些其他的想法。
我想要做的是生成用于游戏的太空船精灵/图像。外观和感觉应该类似于这些:

基本上,我的想法归结为这样的:
有没有人知道有一种方法可以实现这样的算法,以达到宇宙飞船的预期外观?
发布于 2012-07-02 19:52:28
在这里,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-02 19:57:41
你的想法是正确的,除了真正的艺术家驱动,你应该使用一致的一组层。为每个层类生成多个图像。
诸若此类。
每一层都是相同的大小,由艺术家设计的正确的居中。)还请注意,任何这些层都可以包含任何东西,甚至是空的。现在,简单的随机化应该给你一个好的,可信的和独特的船。:)
您也完全可以在每一组“引擎”类层图像旁边添加像素坐标,您可以使用这些图像作为不同位置的喷气式发动机火焰的“中心”。
发布于 2014-02-17 02:50:22
其实我很久以前就这么做了!我说了更多的细节,然后你会。我会设法找一张照片,如果我仍然有一张躺在周围,坚持住。我甚至可能有旧密码。我很乐意把它给你。LMAO,一个多么古老的项目档案,真不敢相信我在这个领域工作之前做了这么多东西.看起来不像我有它,但我确实有类似的东西,它甚至可能在这个项目中,让我把它放在Eclipse中并检查出来。不,不是我正在寻找的项目,也不是它构建的,这个程序有33个错误。我也丢失了我的随机行星生成代码,可能还有一整吨其他项目。
建议:
我试着从头开始生成一艘整艘船,这意味着几乎没有任何限制。它以随机点的方式工作,然后我会镜像它。我会得到这样的结果:(很好,它不会让我发布图片,对不起)。
我的建议是限制可能性,使用不同的部分,每个部分都有各自的类型,并能够连接到特定类型的其他部分。就像一个房子,你会做下面的事情。墙壁,连接到其他墙壁,一些墙壁有窗槽。有些墙有门槽,等等。墙可能有一个窗槽和一个水线槽。
在这种情况下,宇宙飞船,上述将有更多的意义。确保每种类型的物体都有下降的趋势,所以飞船的底座是4,它会连接到一个或多个3,每个连接到一个或多个2,每个连接到一个或多个1。当随机选择一个项目时,我建议整个项目被使用,就像一个单一类型的激光武器。此外,一定要考虑允许项目在大小上进行缩放,这样您就可以更好地重用部件。
我认为这是一个令人惊奇的项目,但也是一个非常耗时的正确做法。我希望你玩得开心,让我知道事情进展如何!
https://stackoverflow.com/questions/11300194
复制相似问题