ঠিক আছে, আপনাকে নির্দিষ্ট এক্সএনএ কোড না দেওয়ার জন্য আপনি আমাকে ক্ষমা করতে চলেছেন, কারণ আমি সেই প্ল্যাটফর্মটিতে জ্ঞাত নই, তবে আমি আপনাকে যা বলতে চাইছি এমন কোনও গেম ইঞ্জিনে কাজ করা উচিত যা আপনাকে স্প্রেটিস আঁকতে দেয়।
হরফগুলি আপনার একমাত্র সমস্যা নয়, সুতরাং আমি আপনাকে এক টুকরো পরামর্শ দিতে যাচ্ছি, এবং তারপরে আমি আপনার প্রশ্নের উত্তর দিতে যাচ্ছি। এই দুটি জিনিসের সাহায্যে আপনার জিইউআই ডিজাইনারের সাথে একটি প্রেমময়-কবি সম্পর্ক তৈরি করতে সক্ষম হওয়া উচিত এবং আপনি দুজনেই খুব আনন্দের সাথে গেম তৈরি করতে সক্ষম হবেন।
প্রথমটি হ'ল আপনি আপনার ডিজাইনারের সাথে বসে যাবেন এবং আপনি তাকে দুটি সেট ফাইল দিতে বলছেন। প্রথমটি হ'ল স্বচ্ছ ফাইলগুলির একটি সেট যা আপনার জিইউআই তৈরি করে (অনুকূলভাবে পিএসডি বা ডিএক্সটি ফর্ম্যাটে)। প্রতিটি বোতাম, ফিক্সড লেবেল, ব্যাকগ্রাউন্ড, সীমানা এবং পাঠ্যবক্সের জন্য আপনি একটি ফাইল পাবেন (আপনি টেক্সচার অ্যাটলাসিংও করতে পারেন, তবে আমি আপনাকে সুপারিশ করব যে আপনি আপনার জিইউআই জড়ো করার পরে এটি করবেন, এবং তারপরে ব্লিটি করার সময় আপনার উত্স স্থানাঙ্কগুলি সামঞ্জস্য করুন)। অ স্থির পাঠ্যটি এই মুহুর্তে ছেড়ে দেওয়া উচিত (আমি এটি পরে আবার ঘুরে দেখব)।
দ্বিতীয় জিনিসটি আপনি পাবেন আসল জিইউআই ডিজাইন, এবার ফটোশপের ফর্ম্যাটে। এই ফাইলটি জন্য, আপনি সমগ্র গুই নকশা করার জন্য আপনার ডিজাইনার জিজ্ঞাসা করতে ব্যবহার চলুন শুধুমাত্র ফাইল সে পূর্বে আপনাকে দিয়েছেন।
তারপরে তিনি প্রতিটি জিইআইআই উপাদানকে কোনও পৃথক স্তরে রাখবেন, কোনও প্রভাব ছাড়াই ব্যবহার করুন। আপনি তাকে এই পিক্সেলটি নিখুঁত করতে বলছেন, কারণ যে জায়গাগুলিতে তিনি সমস্ত কিছু স্থাপন করতে চলেছেন, সেখানেই সবকিছুই চূড়ান্ত খেলায় আসবে।
এটি একবার পেয়ে গেলে, প্রতিটি স্তরের জন্য, আপনি Ctrl-T টিপতে চলেছেন, এবং তথ্য ফলকে (F8), আপনি প্রতিটি উপাদানটির জন্য এক্স এবং ওয়াই স্থানাঙ্কের নোট নেবেন। নিশ্চিত করুন যে আপনার ইউনিটগুলি পিক্সেল (পছন্দসমূহ-> ইউনিট এবং শাসক-> ইউনিট) এ সেট আছে। আপনার স্প্রেটিস আঁকতে আপনি যে অবস্থানগুলি ব্যবহার করতে যাচ্ছেন এটি এটি।
এখন, ফন্টগুলির জন্য, আপনি এখন স্পষ্টভাবে জানতে পারেন, আপনি টেক্সট রেন্ডারিং এপিআইগুলি ব্যবহার করে আপনার ফন্টগুলি ফটোশপটিতে দেখতে দেখতে ঠিক একইভাবে দেখতে পাবেন না। আপনাকে আপনার গ্লাইফগুলি প্রি-রেন্ডার করতে হবে এবং তারপরে আপনার পাঠ্যক্রমগুলিকে প্রোগ্রামাগুলি একত্রিত করতে হবে। এটি করার অনেকগুলি উপায় রয়েছে এবং আমি যেটি ব্যবহার করি তার উল্লেখ করব।
প্রথম জিনিসটি হ'ল আপনার সমস্ত গ্লাইফগুলি এক বা একাধিক ফাইলে রেন্ডার করা। আপনি যদি কেবল ইংরেজিকেই যত্নশীল করেন তবে সমস্ত গ্লাইফগুলির জন্য একটি টেক্সচার যথেষ্ট হবে তবে আপনি যদি আরও বর্ধিত অক্ষর সেট করতে চান তবে আপনি বেশ কয়েকটি ফাইল ব্যবহার করতে পারেন। কেবলমাত্র নিশ্চিত করুন যে আপনার পছন্দসই সমস্ত গ্লাইফগুলি আপনার ডিজাইনার চয়ন করেছেন ফন্টে উপলব্ধ।
সুতরাং, গ্লাইফগুলি রেন্ডার করতে, আপনি 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());
এটির সাহায্যে আপনি পিএনজি ফাইলগুলির একগুচ্ছ স্বচ্ছ পটভূমিতে সাদা গ্লাইফগুলি আঁকেন এবং একটি সূচি ফাইল তৈরি করেছেন যা প্রতিটি কোডপয়েন্টের জন্য আপনাকে বলে, কোন ফাইলটিতে গ্লাইফটি রয়েছে, এর অবস্থান এবং মাত্রা। লক্ষ্য করুন যে আমি প্রতিটি গ্লিফ পৃথক করতে আরও দুটি অতিরিক্ত পিক্সেল রেখেছি (আরও প্রভাবের জন্য সামঞ্জস্য করতে)
এখন, এই ফাইলগুলির প্রত্যেকের জন্য, আপনি এটি ফটোশপটিতে রেখেছেন এবং আপনার পছন্দসই সমস্ত ফিল্টার করুন। আপনি রঙ, সীমানা, ছায়া, আউটলাইন এবং আপনার পছন্দসই কিছু সেট করতে পারেন। কেবল নিশ্চিত হয়ে নিন যে প্রভাবগুলি গ্লাইফগুলি ওভারল্যাপ করে না। যদি তাই হয় তবে ব্যবধানটি সামঞ্জস্য করুন, পুনরায় রেন্ডার করুন, ধুয়ে নিন এবং পুনরাবৃত্তি করুন। পিএনজি বা ডিএক্সটি হিসাবে সংরক্ষণ করুন এবং সূচি ফাইল সহ, আপনার প্রকল্পে সমস্ত কিছু রাখুন।
অঙ্কন পাঠ্য খুব সহজ হওয়া উচিত। প্রতিটি চরের জন্য আপনি মুদ্রণ করতে চান, সূচীটি ব্যবহার করে এর অবস্থানটি সন্ধান করুন, এটি আঁকুন, অবস্থানটি এগিয়ে করুন এবং পুনরাবৃত্তি করুন। আপনি ব্যবধান, কর্নিং (কৌতূহলী), উল্লম্ব ব্যবধান এবং রঙ করার জন্যও সামঞ্জস্য করতে পারেন। লুয়া ইন:
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()
কারণ তারা উভয়ই পৃথক পরিমাপ ব্যবস্থা ব্যবহার করে এবং পরিমাপ করা গ্লাইফ এবং আঁকা একটিতে বিশেষত কিছু ফন্টে পাওয়া ওভারহ্যানিং গ্লাইফগুলির মধ্যে অসঙ্গতি সৃষ্টি করতে পারে। আরও তথ্য এখানে ।