سؤال

أنا بدأت قليلا لعبة RTS مع SDL و هنا بعض الأسئلة:

  • أنا أعمل مع العفاريت الصغيرة ، هناك طريقة عرض الشاشة x2 مع scanlines ?حاولت التكبير مع rotozoom ولكنه يبطئ لعبة وأود أن تجنب زيادة بلدي العفاريت باليد.
  • كيف يمكنني التبديل بين ملء الشاشة و إطارات حين يعمل ؟ وجدت SDL_WM_ToggleFullScreen وظيفة ولكن فإنه لا يبدو للعمل على ويندوز وفقا SDL doc.
  • من أجل وضع بلدي المؤشر كنت تحميل العفريت مع مؤشر وجعلها تتبع الماوس.ولكن أود أن مثل انخفاض معدل الإطارات مع SDL_Delay و ذلك يجعل مؤشر حركات غير متجانسة.SDL المؤشر لا يبدو تأثر تطبيق فراميراتي هو أفضل حل استخدامه وإذا كان الأمر كذلك ، هل هناك طريقة استخدام الصورة بدلا من غريب القناع ؟
  • هل هناك طريقة أفضل من الاقتصار فراميراتي ?
  • كيف يمكنني tinte سطح (مثل مع draw_lit_sprite في Allegro)
هل كانت مفيدة؟

المحلول

العفريت حجم أي نوع من الوقت الحقيقي التحجيم أو دوران كنت أفضل حالا مع OpenGL بدلا من البرمجيات blitter مثل SDL.المكتبات الأخرى مثل SFML التفاف هذا الأمر بالنسبة لك.

ملء الشاشة/إطارات - زاك الإجابة تبدو جيدة بما فيه الكفاية فقط اتصل SDL_SetVideoMode مرة أخرى.

حركة المؤشر - عادة نظام التشغيل يجعل الماوس بشكل منفصل عن التطبيق الأساسي بحيث يبقى استجابة.إذا كنت جعل الماوس نفسك ثم خيارك الوحيد هو أن تجعل اللعبة أكثر سرعة.لا أعتقد يمكنك الحصول على الكثير من الخيارات على المؤشر نفسه على الرغم من (ربما بسبب متطلبات عبر منصة).

فراميراتي - اقترح العديد فصل في اللعبة الحركة والفيزياء من فراميراتي (على سبيل المثال.انظر 'إصلاح Timestep').أيضا ، أن تدرك أن SDL_Delay يفرض الأدنى على وقت الانتظار ، وليس الحد الأعلى.

تلوين السطح مرة أخرى, هذا هو أفضل يؤديها OpenGL منذ SDL لا يدعم هذا مباشرة.

نصائح أخرى

كيف يمكنني التبديل بين ملء الشاشة و إطارات أثناء تشغيل ؟ وجدت SDL_WM_ToggleFullScreen وظيفة ولكن لا يبدو أن العمل على ويندوز وفقا SDL doc.

نعم, الولايات الوثائق التي SDL_WM_ToggleFullScreen وظيفة حاليا يعمل فقط على X.

طريقة أفعل مثل ذلك:

void SdlGraphics::setupScreenSurface() {
    Uint32 flags = 0;
    flags |= SDL_HWSURFACE;
    flags |= SDL_DOUBLEBUF;

    if(isFullScreen) {
        flags |= SDL_FULLSCREEN;
    }

    screenSurface = boost::shared_ptr<SDL_Surface>( 
        SDL_SetVideoMode(width, height, depth, flags), 
        utility::NullDeleter() 
    );
}

void SdlGraphics::setFullScreen(bool fullScreen) {
    if(isFullScreen != fullScreen) {
        isFullScreen = fullScreen;
        setupScreenSurface();
    }
}

هذه النقاط:

  • أنا أعمل مع العفاريت الصغيرة هناك طريقة عرض شاشة x2 مع scanlines ?حاولت التكبير مع rotozoom ولكنه يبطئ اللعبة وأود أن تجنب زيادة بلدي العفاريت باليد.

  • كيف يمكنني tinte سطح (مثل مع draw_lit_sprite في Allegro)

أنا تقريبا نوصي باستخدام OpenGL مع SDL.وسوف تعطيك تسارع الأجهزة حرية أن تفعل هذه الأشياء. rotozoom كل ذلك في برنامج (على حد علمي) و هذا هو السبب في انها بطيئة جدا.سوف دائما تكون بطيئة.

خيار آخر قد يكون لديك مع الرسم العفاريت في 2x هو رسم كل شيء 1x الحجم والملمس ، ثم بعد كل شيء يتم رسمها, مقياس نسيج 2x.ثم أنت فقط تجهيز سطح واحد بدلا من العديد من الصغيرة منها مرارا وتكرارا في الإطار.

أما عن قضية المؤشر يبدو أنك قد تريد أن تكون الرسم في أسرع وقت ممكن ، ولكن فقط تحديث اللعبة بمعدل ثابت.بهذه الطريقة سيكون لديك التمرير السلس ولكن اللعب لن تخرج عن نطاق السيطرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top