الطريقة الصحيحة لقياس سطح SDL بدون قطة؟
سؤال
ما هي الطريقة الصحيحة لقياس سطح SDL؟ لقد وجدت تفسيرا واحدا على الانترنت ولكن ذلك يتطلب إعادة رسم بكسل السطح بكسل. يبدو وكأنه يجب أن يكون هناك طريقة للقيام بذلك أصلا من خلال SDL بدلا من إعادة رسم صورة من هذا القبيل. لم أكن قادرا على العثور على أي شيء في وثائق SDL التي تغطي هذا. وأنا قادرة على تغيير حجم الأسطح دون أي مشكلة عن طريق تعديل عرض الأسطح والارتفاع، ولكن يتم قص السطح الناتجة عن ذلك.
المحلول
وSDL لا يدعم blitting تحجيمها. ووفقا لتوثيق SDL_BlitSurface :
<اقتباس فقرة>ملحوظة: لblitter SDL لا (حتى الآن) لديها القدرة على التوسع في blitted السطوح أعلى أو لأسفل كما هي الحال مع البعض أكثر تطورا blitting الآليات. عليك أن الرقم شيئا لنفسك إذا تريد حجم الصور (استخدام مثل SDL_gfx).
اقتباس فقرة>هل يمكن أن تجد SDL_gfx هنا . كتابة وظيفة blitting الخاصة بك ليست سيئة، وأنه قد يكون متعة وفائدة تجربة التعلم (وإن كنت تريد ان تكون إعادة اختراع العجلة). باستخدام برنامج OpenGL هو أيضا خيار، وأشياء من هذا القبيل التوسع، ويمكن أن يتم ذلك في مكالمة ظيفة واحدة بالتناوب.
نصائح أخرى
وأنا أعلم أن هذا الجواب هو الطريق بعد فوات الأوان لمساعدة الشخص الذي يطلب منه، لكنني قررت أن أكتب هذا لمساعدة أي شخص يعثر على هذا السؤال. في SDL 2.0 يمكنك استخدام وظيفة SDL_BlitScaled()
لتوسيع نطاق سطح إلى SDL_Rect
المستهدفة. هناك البرنامج التعليمي LazyFoo حيث يصف هذا، أو تحقق من هذا <أ href ل = "https://wiki.libsdl.org/SDL_BlitScaled" يختلط = "نوفولو noreferrer"> وثائق .
لاكتمال، ولأن السؤال لا يحدد نسخة SDL، والقياس هو ممكن في SDL2 باستخدام SDL_RenderCopyEx
طريقة API. ليست هناك حاجة ليبس إضافية إلى جانب ليب SDL2 الأساسي.
int SDL_RenderCopyEx(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect,
const double angle,
const SDL_Point* center,
const SDL_RendererFlip flip)
ومن خلال تحديد حجم dstrect
يمكن للمرء أن حجم نسيج لعدد صحيح من وحدات البكسل. ومن الممكن أيضا لتدوير والوجه والملمس في الوقت نفسه.
ومن الناحية الفنية لم يكن هذا التوسع سطح بل رفع الملمس. يجب أن تكون الإجراءات ذات الصلة كما لو كما الأسطح يتم تحويل دائما تقريبا إلى القوام قبل وقوع التقديم في التطبيقات المستندة إلى SDL2.
والمرجعي: https://wiki.libsdl.org/SDL_RenderCopyEx
إنشاء القوام كالمعتاد:
surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);
وعندما حان الوقت لجعله، والدعوة SDL_RenderCopyEx
بدلا من SDL_RenderCopy