首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >太空船精灵的程序生成

太空船精灵的程序生成
EN

Stack Overflow用户
提问于 2012-07-02 19:47:36
回答 3查看 6.3K关注 0票数 3

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

我想要做的是生成用于游戏的太空船精灵/图像。外观和感觉应该类似于这些

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

  1. 生成一个基本形状,形成船的“核心”。形状可以包括圆,卵形,钻石,圆角矩形等.
  2. 生成较小的子形状,要么覆盖在核心形状上,要么通过简单的管道连接。(所有的子形状都被镜像,以创建对称的船。)
  3. 生成更小的子形状(细节形状),将它们覆盖在任何现有形状上。(这些构成船舶的“细节”。)
  4. 选择3-5种颜色,随意给每个形状上阴影,这样叠加的形状就不是相同的颜色了.
  5. 将纹理或渐变应用于核心和子形状(而不是细节形状),以使飞船具有三维外观。

有没有人知道有一种方法可以实现这样的算法,以达到宇宙飞船的预期外观?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-02 19:52:28

在这里,System.Drawing.Drawing2D.GraphicsPath可能有助于建立向量路径。然后,您可以填充并向这些路径添加一个笔画,以创建不同的形状。

您可以使用System.Drawing.Drawing2D.LinearGradientBrush作为渐变。

如果你有什么进展的话,我很想看看你的代码。这似乎是个不错的主意。

只是为了好玩,我在VB.NET上把这个拼凑在一起:

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2012-07-02 19:57:41

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

  1. 机身
  2. 座舱
  3. 双翅
  4. 翼饰
  5. 后引擎

诸若此类。

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

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

票数 5
EN

Stack Overflow用户

发布于 2014-02-17 02:50:22

其实我很久以前就这么做了!我说了更多的细节,然后你会。我会设法找一张照片,如果我仍然有一张躺在周围,坚持住。我甚至可能有旧密码。我很乐意把它给你。LMAO,一个多么古老的项目档案,真不敢相信我在这个领域工作之前做了这么多东西.看起来不像我有它,但我确实有类似的东西,它甚至可能在这个项目中,让我把它放在Eclipse中并检查出来。不,不是我正在寻找的项目,也不是它构建的,这个程序有33个错误。我也丢失了我的随机行星生成代码,可能还有一整吨其他项目。

建议:

我试着从头开始生成一艘整艘船,这意味着几乎没有任何限制。它以随机点的方式工作,然后我会镜像它。我会得到这样的结果:(很好,它不会让我发布图片,对不起)。

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

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

我认为这是一个令人惊奇的项目,但也是一个非常耗时的正确做法。我希望你玩得开心,让我知道事情进展如何!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11300194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档