UI จำลองกับโค้ด


17

นักออกแบบ UI ของฉันทำ Photoshop PSD ที่น่ารักของ UI และทุกอย่างสวย ปัญหาที่ใหญ่ที่สุดที่ฉันมีคือการแปลงฟอนต์ที่สวยงามกว่าที่ใช้เป็นสิ่งที่แสดงในเกมได้ มีวิธีการแปลงรูปแบบตัวอักษรเหล่านี้ใน Photoshop เป็นแบบอักษรบิตแมปของการจัดเรียงบางอย่าง?

ฉันต้องสามารถแสดงข้อความเช่นนี้ในรหัสของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่


คุณตรวจสอบไซต์เช่นนี้แล้วหรือยัง blogs.msdn.com/b/garykac/archive/2006/08/30/732007.aspx
ssb

ขอบคุณมากสำหรับเงินรางวัล แต่ฉันสังเกตว่าคุณไม่ได้ทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้ คุณไม่พอใจกับคำตอบหรือไม่? คุณคาดหวังคำตอบประเภทอื่นหรือไม่? ฉันรวบรวม GUIs เกมเป็นส่วนหนึ่งของงานประจำวันของฉันดังนั้นฉันคิดว่าฉันอาจตอบคำถามของคุณได้ อย่าลังเลที่จะขอคำชี้แจงหรือคำอธิบายที่ละเอียดกว่านี้หากคุณต้องการ
Panda Pajama

เพียงแค่การกำกับดูแลในส่วนของฉัน :) ฉันแก้ไขมันแล้ว สนุกและขอบคุณ!
Vaughan Hilts

คำตอบ:


18

โอเคคุณจะต้องยกโทษให้ฉันโดยไม่ให้รหัส XNA เฉพาะคุณเพราะฉันไม่รู้ในแพลตฟอร์มนั้น แต่สิ่งที่ฉันจะบอกคุณควรทำงานกับเอ็นจิ้นเกมใด ๆ ที่ช่วยให้คุณสามารถวาดสไปรต์ได้

แบบอักษรไม่ใช่ปัญหาของคุณเท่านั้นดังนั้นฉันจะให้คำแนะนำแก่คุณและจากนั้นฉันจะตอบคำถามของคุณ ด้วยสองสิ่งเหล่านี้คุณควรจะสามารถสร้างความสัมพันธ์ที่น่ารักกับนักออกแบบ GUI ของคุณและคุณทั้งคู่จะสามารถสร้างเกมได้อย่างมีความสุข

สิ่งแรกคือคุณจะนั่งลงกับนักออกแบบของคุณและคุณจะขอให้เธอมอบไฟล์สองชุดให้คุณ ที่แรกก็คือชุดของไฟล์โปร่งใสที่ทำขึ้น GUI ของคุณ (อย่างดีที่สุดในรูปแบบ PSD หรือ DXT) สำหรับปุ่มทุกปุ่มเลเบลพื้นหลังเส้นขอบและกล่องข้อความคุณจะได้รับไฟล์เดียว (คุณยังสามารถทำการแก้ไขพื้นผิวได้ แต่ฉันขอแนะนำให้คุณทำหลังจากที่คุณรวบรวม GUI ของคุณแล้วจึงปรับพิกัดแหล่งที่มาของคุณเมื่อเกิดการชน) ข้อความที่ไม่คงที่ควรถูกทิ้งไว้ ณ จุดนี้ (ฉันจะกลับมาดูอีกครั้งในภายหลัง)

สิ่งที่สองที่คุณจะได้รับคือการออกแบบ GUI จริงในครั้งนี้ในรูปแบบ Photoshop สำหรับไฟล์นี้คุณกำลังจะไปขอให้นักออกแบบของคุณที่จะทำให้การออกแบบ GUI ทั้งหมดโดยใช้เพียงไฟล์ที่เธอก่อนหน้านี้ให้คุณ

จากนั้นเธอจะใส่องค์ประกอบ GUI ลงในเลเยอร์แยกต่างหากโดยไม่มีผลกระทบใด ๆ คุณกำลังจะบอกให้เธอทำพิกเซลนี้ให้สมบูรณ์แบบเพราะสถานที่ที่เธอจะใส่ทุกอย่างเป็นที่ที่ทุกอย่างจะเข้าสู่เกมสุดท้าย

เมื่อคุณได้รับสิ่งนั้นแล้วในแต่ละเลเยอร์คุณจะกด Ctrl-T และในบานหน้าต่างข้อมูล (F8) คุณจะจดบันทึกพิกัด X และ Y สำหรับแต่ละองค์ประกอบ ตรวจสอบให้แน่ใจว่าหน่วยของคุณตั้งค่าเป็นพิกเซล (ค่ากำหนด -> หน่วย & ผู้ปกครอง -> หน่วย) นี่คือตำแหน่งที่คุณจะใช้เมื่อวาดสไปรต์ของคุณ

ตอนนี้สำหรับฟอนต์ดังที่คุณอาจทราบได้อย่างชัดเจนในตอนนี้คุณจะไม่สามารถทำให้ฟอนต์ของคุณดูแบบเดียวกับที่คุณเห็นใน Photoshop โดยใช้ API การแสดงผลข้อความ คุณจะต้องแสดงร่ายมนตร์ล่วงหน้าของคุณก่อนแล้วจึงรวบรวมข้อความของคุณโดยทางโปรแกรม มีหลายวิธีในการทำเช่นนี้และฉันจะพูดถึงวิธีที่ฉันใช้

สิ่งแรกคือการแสดงร่ายมนตร์ทั้งหมดของคุณเป็นหนึ่งหรือมากกว่าหนึ่งไฟล์ หากคุณสนใจภาษาอังกฤษเพียงหนึ่งพื้นผิวสำหรับร่ายมนตร์ทั้งหมดจะพอเพียง แต่ถ้าคุณต้องการมีชุดอักขระที่ขยายเพิ่มขึ้นคุณสามารถใช้หลายไฟล์ได้ เพียงตรวจสอบให้แน่ใจว่าสัญลักษณ์ทั้งหมดที่คุณต้องการนั้นมีอยู่ในแบบอักษรที่นักออกแบบของคุณเลือก

ดังนั้นในการแสดงร่ายมนตร์คุณสามารถใช้เครื่องมืออำนวยความสะดวกในSystem.Drawingการรับเมตริกแบบอักษรและวาดร่ายมนตร์ของคุณ:

Color clearColor = Color.Transparent;
Color drawColor = Color.White;
Brush brush = new SolidBrush(drawColor);
TextRenderingHint renderingType = TextRenderingHint.AntiAliasGridFit; // Antialias is fine, but be careful with ClearType, which can blergh your renders when you apply effects
StringFormat stringFormat = StringFormat.GenericTypographic;
string fileNameFormat = "helvetica14_{0}.png";
string mapFileFormat = "helvetica14.txt";
string fontName = "Helvetica";
string fontPath = @"c:\windows\fonts\helvetica.ttf";
float fontSize = 14.3f;
int spacing = 2;

Font font = new Font(fontName, fontSize);
int x = 0;
int y = 0;
int width = 1024; // Force a maximum texture size
int height = 1024;
StringBuilder data = new StringBuilder();
int lineHeight = 0;
int currentPage = 1;
var families = Fonts.GetFontFamilies(fontPath);
List<char> codepoints = new List<char>();
HashSet<char> usedCodepoints = new HashSet<char>();
foreach (FontFamily family in families)
{
    var typefaces = family.GetTypefaces();
    foreach (Typeface typeface in typefaces)
    {
        GlyphTypeface glyph;
        typeface.TryGetGlyphTypeface(out glyph);
        foreach (KeyValuePair<int, ushort> kvp in glyph.CharacterToGlyphMap) // Render all available glyps
        {
            char c = (char)kvp.Key;
            if (!usedCodepoints.Contains(c))
            {
                codepoints.Add(c);
                usedCodepoints.Add(c);
            }
        }
    }
}
Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
g.Clear(clearColor);
g.TextRenderingHint = renderingType;

foreach (char c in codepoints)
{
    string thisChar = c.ToString();
    Size s = g.MeasureString(thisChar, font); // Use this instead of MeasureText()
    if (s.Width > 0)
    {
        s.Width += (spacing * 2);
        s.Height += (spacing * 2);
        if (s.Height > lineHeight)
            lineHeight = s.Height;
        if (x + s.Width >= width)
        {
            x = 0;
            y += lineHeight;
            lineHeight = 0;
            if (y + s.Height >= height)
            {
                y = 0;
                g.Dispose();
                bitmap.Save(string.Format(fileNameFormat, currentPage));
                bitmap.Dispose();
                bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
                g = Graphics.FromImage(bitmap);
                g.Clear(clearColor);
                g.TextRenderingHint = renderingType;
                currentPage++;
            }
        }
        g.DrawString(thisChar, font, brush, new PointF((float)x + spacing, (float)y + spacing), stringFormat);
        data.AppendFormat("{0} {1} {2} {3} {4} {5}\n", (int)c, currentPage, x, y, s.Width, s.Height);
        x += s.Width;
    }
}
g.Dispose();
bitmap.Save(string.Format(fileNameFormat, currentPage));
bitmap.Dispose();
File.WriteAllText(mapFileFormat, data.ToString());

ด้วยสิ่งนี้คุณได้วาดร่ายมนตร์สีขาวบนพื้นหลังโปร่งใสในไฟล์ PNG หลาย ๆ ไฟล์และสร้างไฟล์ดัชนีซึ่งจะบอกคุณเกี่ยวกับ codepoint แต่ละอันซึ่งไฟล์ glyph นั้นอยู่ตำแหน่งและขนาดของมัน โปรดสังเกตว่าฉันยังใส่พิกเซลเพิ่มเติมสองพิกเซลเพื่อแยกแต่ละสัญลักษณ์ (เพื่อรองรับเอฟเฟกต์เพิ่มเติม)

ทีนี้สำหรับไฟล์แต่ละไฟล์คุณใส่ไว้ใน photoshop และทำฟิลเตอร์ทั้งหมดที่คุณต้องการ คุณสามารถตั้งค่าสีเส้นขอบเงาโครงร่างและสิ่งอื่น ๆ ที่คุณต้องการ เพียงตรวจสอบให้แน่ใจว่าเอฟเฟกต์ไม่ทำให้ร่ายมนตร์ซ้อนกัน ถ้าเป็นเช่นนั้นให้ปรับระยะห่าง, แสดงใหม่, ล้างและทำซ้ำ บันทึกเป็น PNG หรือ DXT และพร้อมกับไฟล์ดัชนีใส่ทุกอย่างในโครงการของคุณ

ข้อความการวาดควรจะง่ายมาก สำหรับอักขระแต่ละตัวที่คุณต้องการพิมพ์ให้ค้นหาตำแหน่งโดยใช้ดัชนีวาดมันเลื่อนตำแหน่งและทำซ้ำ คุณยังสามารถปรับระยะห่างการจัดช่องไฟ (หากิน) ระยะห่างแนวตั้งและแม้แต่การระบายสี ใน lua:

function load_font(name)
    local font = {}
    font.name = name
    font.height = 0
    font.max_page = 0
    font.glyphs = {}
    font.pages = {}
    font_definition = read_all_text("font/" .. name .. ".txt")

    for codepoint, page, x, y, width, height in string.gmatch(font_definition, "(%d+) (%d+) (%d+) (%d+) (%d+) (%d+)") do
        local page = tonumber(page)
        local height_num = tonumber(height)
        if height_num > font.height then
            font.height = height_num
        end
        font.glyphs[tonumber(codepoint)] = { page=tonumber(page), x=tonumber(x), y=tonumber(y), width=tonumber(width), height=height_num } 
        if font.max_page < page then
            font.max_page = page
        end
    end

    for page = 1, font.max_page do
        font.pages[page] = load_image("font/" .. name .. "_" .. page .. ".png")
    end

    return font
end

function draw_text(font, chars, range, initial_x, initial_y, width, color, spacing)
    local x = initial_x - spacing
    local y = initial_y - spacing
    if range == nil then
        range = { from=1, to=#chars }
    end
    for i = 1, range.to do
        local char = chars[i]
        local glyph = font.glyphs[char]
        if char == 10 then -- line break
            x = initial_x - spacing
            y = y + ((font.height - (spacing * 2)) * 1.4)
        elseif glyph == nil then
            if unavailable_glyphs[char] == nil then
                unavailable_glyphs[char] = true
            end
        else
            if x + glyph.width - spacing > initial_x + width then
                x = initial_x - spacing
                y = y + ((font.height - (spacing * 2)) * 1.4)
            end
            if i >= range.from then
                draw_sprite(font.pages[glyph.page], x, y, glyph.x, glyph.y, glyph.width, glyph.height, color)
            end
            x = x + glyph.width - (spacing * 2)
        end
    end
end

และคุณไป ทำซ้ำสำหรับแบบอักษรอื่น ๆ (และปรับขนาดให้เหมาะสมด้วย)

แก้ไข : ฉันเปลี่ยนรหัสเพื่อใช้Graphics.MeasureStringแทนที่จะเป็น TextRenderer.MeasureText()เพราะทั้งคู่ใช้ระบบการวัดที่แตกต่างกันและอาจนำไปสู่ความไม่สอดคล้องระหว่างร่ายมนตร์ที่วัดกับที่วาดโดยเฉพาะกับร่ายมนตร์ที่พบในแบบอักษรบางแบบ ข้อมูลเพิ่มเติมที่นี่


2
ทำไมฉันถึงได้ลงคะแนนในเรื่องนี้? หากคุณกำลังจะลงคะแนนโปรดอย่างน้อยให้ความเห็นเกี่ยวกับสิ่งที่ฉันทำผิดเพื่อให้ฉันสามารถแก้ไขได้ในครั้งต่อไป
Panda Pyjama

ไม่ใช่ฉัน. นี่คือคำตอบในเชิงลึกที่ยอดเยี่ยม +1 :-)
Kromster

6

อย่างที่คนอื่นพูดใน XNA spritefont ยกของหนักให้คุณ บนเว็บไซต์สโมสรผู้สร้างจะมีตัวส่งออกแบบอักษรบิตแมปที่ส่งออกในรูปแบบตัวอักษรสไตล์ XNA ( http://xbox.create.msdn.com/en-US/education/catalog/utility/bitmap_font_maker ) จากนั้นคุณสามารถเปิดใน photoshop หรืออะไรก็ได้และทำให้มันดูสวย จากที่นั่นคุณเพิ่มพื้นผิวให้กับโครงการเนื้อหาของคุณและในประเภทเนื้อหาให้เลือกพื้นผิวแบบอักษร Sprite ในรหัสของคุณคุณโหลดเหมือนฟอนต์สไปรต์ปกติ

(ตัวอย่าง: http://www.youtube.com/watch?v=SynGWrWYUQI )


ปัญหาคือฉันไม่แน่ใจว่าวิธีหนึ่งสามารถใช้สไตล์จากแบบอักษร Photoshop และนำไปใช้กับพื้นผิวเช่นนี้
Vaughan Hilts

ที่นี่ฉันจะทำวิดีโอ
CobaltHex


BMFont ทำสิ่งเดียวกัน แต่ในความคิดของฉันเป็นโปรแกรมที่ดีกว่า angelcode.com/products/bmfont
Cypher

เอ๊ะโดยการส่ง spritefont พื้นฐานคุณสามารถปรับแต่งมันได้ตามที่คุณต้องการใน Photoshop
CobaltHex

4

การแก้ปัญหาค่อนข้างง่ายและใช้งานโดยเกมจำนวนมาก สิ่งที่คุณต้องทำคือรักษาแบบอักษรของคุณราวกับว่าพวกมันสไปรต์

ให้นักออกแบบดึงตัวเลขและตัวอักษรทั้งหมดที่คุณต้องการใช้ในเกมของคุณ จากนั้นแสดงภาพให้กับภาพนิ่งที่มีขนาดต่างกัน (.png, .bmp, รูปแบบที่คุณใช้) คุณจะมีสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้สิ่งที่คุณต้องทำคือการแสดงตัวอักษรแต่ละตัวจาก "แผ่นแบบอักษร" ของคุณราวกับว่ามันเป็นเทพดาไปที่หน้าจอ ช่วยสร้างคลาสผู้ช่วยในการแปลระหว่างสตริงและสไปรท์ได้อย่างแน่นอน

การใช้งานของฉันซับซ้อนกว่า แต่มีประโยชน์ แผ่นแบบอักษรถูกสร้างขึ้นเหมือนภาพด้านบนที่มีแบบอักษรหลายแบบทั้งหมดในไฟล์. png ไฟล์เดียว ฉันมี.iniไฟล์ที่จับคู่ตัวอักษรของแต่ละฟอนต์กับตำแหน่งบนชีตพร้อมกับความกว้างและความสูง สิ่งนี้ทำให้นักออกแบบของฉัน (และตัวฉันเอง) สามารถสร้างฟอนต์เก๋ ๆ โดยไม่ต้องสัมผัสรหัส เมื่อวาดสตริงไปที่หน้าจอฉันมีวิธีที่ค้นหาแบบอักษรและcharจากไฟล์. ini เพื่อให้ได้ตำแหน่งและขอบเขตของตัวอักษรจากแผ่นแบบอักษรจากนั้นฉันก็วาดTexture2Dด้วยการSpriteBatch.Draw()ใช้แหล่งที่มาRectangleของตัวอักษร ในคำถาม.


2

UI เป็นวิชาที่กว้างขวางและซับซ้อน การแสดงผลแบบอักษรเป็นส่วนที่ยาก ฉันแนะนำให้คุณใช้ไลบรารีที่มีอยู่แล้วที่อนุญาตให้คุณแสดงเนื้อหา Flash หรือ HTML ในเกมแทนการทำซ้ำทุกอย่างด้วยตัวเอง

Awesomiumดูมีแนวโน้มและควรทำงานกับ XNAดังนั้นคุณสามารถลองได้ ฟรีสำหรับการใช้งานกับเกมที่ไม่ใช่เชิงพาณิชย์หรือหากคุณไม่ได้ทำเงินมากมาย:

ฟรีสำหรับ บริษัท อินดี้
    หากบริษัทของคุณทำเงินน้อยกว่า $ 100K เมื่อปีที่แล้วคุณมีสิทธิ์ได้รับ!
ฟรีสำหรับการใช้ที่ไม่ใช่เชิงพาณิชย์
ฟรีสำหรับการประเมินผลและการพัฒนา


นั่นเป็นความคิดที่ดีงาม - ฉันคิดว่ามันจะย่อรหัส UI บางส่วนที่ฉันต้องเขียนด้วย ฉันจะลองดู ขอบคุณ!
Vaughan Hilts

เนื่องจากเป็นพอร์ตของเอ็นจิ้น Webkit คุณควรจะทำลักษณะข้อความส่วนใหญ่ที่คุณต้องการด้วย CSS รวมถึงโครงร่างเส้นขีดการลากเงาและการไล่ระดับสี
ChrisC

นั่นเป็นวิธีที่ซับซ้อนสำหรับการวาดแบบอักษร
CobaltHex

1
@CobaltHex ฉันเคยเห็นท่าทีนี้มาแล้วหลายครั้งและ UI ที่เสียไปหลายอย่างซึ่งมาจาก "yey ลองทำ UI ตั้งแต่ต้นมันจะต้องง่ายเราจะบูรณาการล้อใหม่ในขณะที่เราอยู่ที่นี่" ที่ฉันเติบโต เบื่อหน่าย. ลองออกกำลังกายตรวจสอบภาพจำลองจาก OP และลองนึกภาพว่าคุณต้องใช้ UI ทั้งหมดในสไตล์เดียวกันในหลาย ๆ แพลตฟอร์มความละเอียดหน้าจอและอัตราส่วน ตอนนี้ความต้องการ UI ที่เหมาะสมกลายเป็นสิ่งที่ชัดเจนนั่นเป็นสาเหตุที่ฉันใช้เสรีภาพในการโพสต์คำตอบนี้แม้ว่าจะไม่ใช่วิธีการแก้ปัญหาโดยตรงก็ตาม
Laurent Couvidou

ฉันไม่ได้บอกว่าคุณสร้าง UI ตั้งแต่เริ่มต้น แต่ถ้าคุณแค่ต้องการวาดตัวอักษรการใส่
เอนจิ้

1

หากคุณกำลังมองหาเอฟเฟกต์นักเล่นมากกว่าตัวผู้นำเข้า. spritefont ธรรมดาคุณสามารถลองค้นหา "ตัวสร้างตัวอักษรบิตแมป"

โดยส่วนตัวแล้วฉันชอบสิ่งนี้: http://www.ironstarmedia.co.uk/2010/01/free-game-dev-utility-fancy-bitmap-font-generator/

แนวคิดอื่น ๆ :

  • ใช้ตัวสร้างฟอนต์บิตแมปแล้วแก้ไขบิตแมปที่สร้างเพิ่มเติมใน photoshop เป็นต้น
  • ใส่ข้อความคงที่มากที่สุดเท่าที่เป็นไปได้ในสไปรต์ก่อนวาด จากนั้นกรอกข้อมูลในสิ่งต่างๆเช่นเกมเมอร์แท็กและคะแนนรวมโดยใช้. spritefonts หรือแบบอักษรที่สร้างจากตัวสร้างฟอนต์บิตแมป

ฉันเห็นแล้วว่า (และมันก็เยี่ยมมาก ๆ ) แต่ฉันหวังว่าจะเปลี่ยนรูปแบบข้อความ Photoshop ของฉันให้เป็นแบบอักษรบิตแมปที่ใช้งานได้โดยตรง
วอฮ์นฮิลต์

0

XNAทำงานหนักสำหรับคุณหรือไม่ ด้วยSpritefontคุณสามารถแปลงไฟล์ฟอนต์บนเครื่องของคุณให้เป็นสไปรท์ชีตที่คุณต้องการได้อย่างง่ายดายโดยการกำหนดไฟล์ XML

เมื่อคุณเพิ่มไฟล์ XML ในโครงการเนื้อหาของคุณโหลดด้วยContentManager:

ContentManager.Load<SpriteFont>(@"MyFont");

นี่คือตัวอย่างของไฟล์. spritefont จากโครงการเนื้อหาของฉัน:

<?xml version="1.0" encoding="utf-8"?>
<!--
This file contains an xml description of a font, and will be read by the XNA
Framework Content Pipeline. Follow the comments to customize the appearance
of the font in your game, and to change the characters which are available to draw
with.
-->
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
<Asset Type="Graphics:FontDescription">

    <!--
Modify this string to change the font that will be imported.
//TODO: A different font should be chosen before shipping for licensing reasons
-->
    <FontName>Pericles</FontName>

    <!--
Size is a float value, measured in points. Modify this value to change
the size of the font.
-->
    <Size>8.5</Size>

    <!--
Spacing is a float value, measured in pixels. Modify this value to change
the amount of spacing in between characters.
-->
    <Spacing>0</Spacing>

    <!--
UseKerning controls the layout of the font. If this value is true, kerning information
will be used when placing characters.
-->
    <UseKerning>true</UseKerning>

    <!--
Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
and "Bold, Italic", and are case sensitive.
-->
    <Style>Bold</Style>

    <!--
If you uncomment this line, the default character will be substituted if you draw
or measure text that contains characters which were not included in the font.
-->
    <DefaultCharacter>@</DefaultCharacter>

    <!--
CharacterRegions control what letters are available in the font. Every
character from Start to End will be built and made available for drawing. The
default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
character set. The characters are ordered according to the Unicode standard.
See the documentation for more information.
-->
    <CharacterRegions>
        <CharacterRegion>
            <Start>&#32;</Start>
            <End>&#126;</End>
        </CharacterRegion>
        <CharacterRegion>
            <Start>&#9;</Start>
            <End>&#9;</End>
        </CharacterRegion>
    </CharacterRegions>
</Asset>
</XnaContent>

1
ปัญหาคือสิ่งเหล่านี้เป็นเพียงแค่แบบอักษร TrueType ฉันต้องการฟอนต์บิตแมปหรือบางอย่างที่มีลักษณะคล้ายกับ dropshadow ของฉันทั้งหมด, เร่าร้อนและสิ่งที่ชอบยังคงใช้
วอฮ์นฮิลต์

ดูการแก้ไขแบบอักษรของฉันเช่นนี้: i.imgur.com/VaBpQ.png
Vaughan Hilts

0

ฉันไม่แน่ใจเหมือนที่ฉันไม่เคยใช้ แต่คนแนะนำให้ฉันใช้ Glyph Designer นี่คือวิดีโอสอน:

http://vimeo.com/32777161

ที่นี่มีการพูดคุยเกี่ยวกับมันเป็น photoshop

มีคนใช้ตัวแก้ไขแบบอักษรของ Hieroด้วย

ในเว็บไซต์นี้มีรายการตัวแก้ไขแบบอักษรอื่น ๆ ที่คุณอาจต้องการดู

บอกให้ฉันรู้ว่าอันไหนดีที่สุดสำหรับคุณ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.