3

私はこのトピックを数日間研究していて、それがどのように機能するかについての考えを持っていますが、他のいくつかのアイデアのためにここに投稿したいと思いました。

私がやりたいのは、ゲームで使用する宇宙船のスプライト/画像を生成することです。ルックアンドフィールはこれらに似ている必要があります: 宇宙船のスプライト

基本的に、私の考えは次のようなものに要約されます。

  1. 船の「コア」を形成する基本形状を生成します。形状には、円、楕円、ダイヤモンド、角の丸い長方形などが含まれます。

  2. コアシェイプにオーバーレイされるか、単純なパイプを介して接続される、より小さなサブシェイプを生成します。(対称的な船を作成するために、すべてのサブシェイプがミラーリングされます。)

  3. さらに小さなサブシェイプ(詳細シェイプ)を生成し、既存のシェイプにオーバーレイします。(これらは船の「詳細」を形成します。)

  4. 3〜5色を選択し、各形状をランダムにシェーディングして、オーバーレイされた形状が同じ色にならないようにします。

  5. コアとサブシェイプ(詳細シェイプではない)にテクスチャリングまたはグラデーションを適用して、船に3Dの外観を与えます。

宇宙船の望ましい外観を実現するために、このようなアルゴリズムを実装する方法を知っている人はいますか?

4

3 に答える 3

5

あなたは正しい考えを持っていますが、本当にアーティスト主導であるためには、一貫したレイヤーのセットを使用する必要があります。レイヤークラスごとに複数の画像を生成します。

  1. 機体
  2. コックピット
  3. 翼の装飾品
  4. リアエンジン

等々。

これらの各レイヤーは同じサイズであり、アーティストが正しく中央に配置するように設計されています。:)また、これらのレイヤーのいずれにも、空であっても何でも含めることができることに注意してください。これで、単純なランダム化により、信頼できるユニークな船が得られるはずです。:)

異なる位置にあるジェットエンジンの炎の「中心」として使用できる「エンジン」クラスのレイヤー画像の各セットの横にピクセル座標を追加することも完全に可能です。

于 2012-07-02T19:57:41.627 に答える
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 に答える
1

私は実際にずっと前にこれをしました!私はあなたがそうするより多くの詳細に行きました。写真を探します。まだ横になっている場合は、しばらくお待ちください。私は古いコードさえ持っているかもしれません。喜んでお渡しします。古いプロジェクトのアーカイブであるLMAOは、私がこの分野で働く前にこれらすべてのものを作ったとは信じられません...私はそれを持っているようには見えませんが、私は似たような性質のものを持っています。そのプロジェクトの中にいて、Eclipseに入れてチェックしてみましょう。いいえ、私が探していたプロジェクトではなく、ビルドもされていませんでした。バガーには33のエラーがあります。また、ランダム化された惑星生成コードと、おそらく他の多くのプロジェクトを失いました。

助言:

船全体を最初から生成してみました。つまり、制約はほとんどありません。それはある種のランダム化されたポイントによって機能し、それから私はそれを鏡像にしました。次のような結果が得られます:(画像を投稿できません、申し訳ありません)。

私が提案するのは、可能性を制限し、それぞれが独自のタイプを持つさまざまなパーツを使用して、特定のタイプの他のパーツに接続できるようにすることです。家のように、あなたは次のことをします。壁、他の壁に接続します。一部の壁には窓スロットがあります。一部の壁にはドアスロットなどがあります。壁には窓スロットと喫水線スロットがある場合があります。

この宇宙船の場合、上記の方がはるかに理にかなっています。各タイプのピースが下降傾向に従うことを確認してください。したがって、船のベースは4になり、1つ以上の3に接続し、それぞれが1つ以上の2に接続し、それぞれが1つ以上に接続します。 1の。アイテムをランダムに選択するときは、単一​​のタイプのレーザー兵器のように、アイテム全体で使用することをお勧めします。また、パーツをより適切に再利用できるように、アイテムのサイズを拡大できるようにすることを必ず検討してください。

それは素晴らしいプロジェクトだと思いますが、正しく行うには非常に時間のかかるプロジェクトでもあります。楽しんでいただければ幸いです。どうなるか教えてください。

于 2014-02-17T02:50:22.323 に答える