ฉันจะทำให้ความละเอียดของเกม 2D เป็นอิสระได้อย่างไร


10

ฉันกำลังเล่นเกม 2D อย่างง่าย ฉันทำรุ่นโทรศัพท์มือถือเสร็จแล้ว

อย่างไรก็ตามเจ้านายของฉันต้องการให้เกมทำงานบน RT ของเขา ฉันกำลังทำ "การแปลง" แต่ปุ่มของฉันอยู่ในตำแหน่งที่ไม่ถูกต้องเพราะฉันกำหนดขนาดหน้าจออย่างหนักเช่นนี้:

 texture = game.Content.Load<Texture2D>("StartScreen");
 mainFrame = new Rectangle(0, 0, game.GraphicsDevice.Viewport.Width, game.GraphicsDevice.Viewport.Height);

 // button definitions
 startbrect = new Rectangle(300, 258, 88, 88);
 startbtext = game.Content.Load<Texture2D>("bplay");

ในตัวอย่างmainframeนี้ใช้ได้ แต่startbrectไม่ใช่เพราะฉันกำหนดขนาดเพื่อให้ตรงกับหน้าจอของ Windows Phone ฉันจะจัดการการออกแบบที่ตอบสนองได้อย่างไรเมื่อหน้าจอโทรศัพท์ Windows 8 ทุกรุ่นแตกต่างกันอย่างไร มีสูตรหรือมาโครในการคำนวณในแต่ละครั้งที่มีขนาดที่เหมาะสมหรือไม่


คุณสามารถตรวจสอบว่าปุ่ม Windows Phone ของคุณใช้หน้าจอกี่เปอร์เซ็นต์จากนั้นใช้เปอร์เซ็นต์นั้นเพื่อคำนวณหน้าจอที่ถูกต้องสำหรับความละเอียดอื่น ๆ แต่ฉันแน่ใจว่ามีวิธีที่หรูหรากว่านี้
Christian

ฉันกำลังมองหาวิธีที่สวยงามยิ่งขึ้น แต่ฉันจะลองกับเปอร์เซ็นต์ในขณะนี้
Gabson

2
คุณควรจะสามารถทำได้โดยจัดการกล้อง
ashes999

ทางออกของฉันคือการจัดการกับร้อยละไม่พบที่ดีขึ้น
Gabson

คำตอบ:


17

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

private static float CalcRatio(Vector2 Sizes)
{
    return Sizes.y/Sizes.x;
}

public static Vector2 CalculateNewPos(Vector2 RefPos, Vector2 RefScreenSize, 
                                      Vector2 CurrentScreenSize)
{       
    return new Vector2((RefPos.x/RefScreenSize.x) * CurrentScreenSize.x, 
                       (RefPos.y/RefScreenSize.y) * CurrentScreenSize.y);
}

public static Vector2 CalculateNewSize(Vector2 RefSize, Vector2 RefScreenSize,
                                       Vector2 CurrentScreenSize)
{       
    float origRatio = CalcRatio(RefSize);
    float perW = RefSize.x * 100f / RefScreenSize.x;    
    float newW = perW / 100f * CurrentScreenSize.x;
    float newH = newW * origRatio;
    return new Vector2(newW, newH);
}

เพื่อให้แน่ใจว่าเกมดูดีที่ความละเอียดด้วยอัตราส่วนที่แตกต่างจากความละเอียดอ้างอิงของคุณให้กำหนด "พื้นที่ที่สามารถเล่นได้" ซึ่งเหมาะกับหน้าจอทุกประเภทและวางภาพการเล่นเกมที่สำคัญทั้งหมด เติมทุกอย่างภายนอกด้วยพื้นหลัง โดยปกติพื้นที่อ้างอิงที่เล่นได้ของฉันมีขนาดใหญ่เท่ากับขนาดหน้าจออ้างอิง

ในแนวตั้งแนวตั้งฉันคำนวณพื้นที่ที่สามารถเล่นได้ (ใหม่) เพื่อให้หน้าจอเต็มในแนวตั้งและพื้นที่ที่ใช้ในแนวนอนนั้นใหญ่พอ ๆ กับที่ต้องรักษาอัตราส่วน ในแนวนอนฉันวางภาพบนหน้าจอในแนวนอนและรักษาอัตราส่วนเมื่อตั้งค่าขนาดแนวตั้ง

สำหรับข้อมูลเพิ่มเติมโปรดดูhttp://en.wikipedia.org/wiki/Safe_area_(television)เนื่องจากเป็นแนวคิดที่คล้ายกันหากไม่เหมือนกัน


0

ฉันคิดว่าวิธีที่ง่ายที่สุดและเป็นธรรมชาติที่สุดในการแก้ไขเลย์เอาต์ที่เป็นอิสระคือโครงร่าง (เปอร์เซ็นต์) ดังนั้นตั้งแต่เริ่มต้นจะไม่ทำงานกับความละเอียดจริง แต่จะอยู่ในรูปแบบ [0,1] x [0,1] เท่าที่จะทำได้

นั่นหมายความว่าสำหรับตำแหน่งที่ได้รับscreen_sizeและที่กำหนดobject_sizeและที่สัมพันธ์กัน(px, py)(เช่น (0.5, 0.5) สำหรับกึ่งกลางของหน้าจอ) มุมบนซ้ายของวัตถุจะถูกคำนวณโดย:

x = px * screen_size.width - 0.5 * object_size.width
y = py * screen_size.height - 0.5 * object_size.height

แนวคิดควรมีความชัดเจน สิ่งที่เป็นนามธรรมพร้อมจะเป็น

x = cx1 * screen_size.width + cx2 * object_size.width + cx3
y = cy1 * screen_size.height + cy2 * object_size.height + cy3

(cxi, cyi)และทุกตำแหน่งถูกกำหนดไว้แล้วโดย โดยสิ่งนี้สามารถวางวัตถุในมุมที่มีหรือไม่มีเส้นขอบ ฯลฯ

โปรดตรวจสอบให้แน่ใจว่าปรับขนาดองค์ประกอบ (ปุ่มป้ายกำกับ ... ) ด้วย


-2

พิเศษสำหรับ MonoGame ฉันมีวิธีแก้ไขปัญหาแพลตฟอร์มอิสระสำหรับปัญหานี้เรียกว่า IRR (Renderer ความละเอียดอิสระ) มันมีการใช้งานง่ายมาก:

  1. สร้าง IRR ในวิธีการเริ่มต้น ()

    _irr = ResolutionRenderer ใหม่ (นี่คือ VirtualResolutionWidth, VirtualResolutionHeight, _gfx.PreferredBackBufferWidth, _gfx.PreferredBackBufferHeight);

  2. โทร_irr.Draw ()แต่ละรอบในการโทรDraw ()
  3. จัดหา_irr.GetTransformationMatrix ()ในSpriteBatch.Begin ()ใด ๆ ที่โทรหาคุณต้องการใช้ IRR

คำอธิบายอยู่ที่นี่: http://panthernet.ru/forum/index.php?/topic/17-monogamexna-examples-v14/?p=44

รหัสอยู่ที่นี่: https://github.com/panthernet/Monogame- ตัวอย่าง

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