سؤال

لقد كنت أحاول الحصول على مدخلات مع IUP لإنشاء لعبة كرة بونج صغيرة.كنت أرغب في تجربة بعض المدخلات، وجربت بعض التعليمات البرمجية التي تأتي مع أمثلة IUPGL، ولكن يبدو أن الإدخال لا يعمل على الإطلاق.إليك الكود كما هو حتى الآن:

require "iuplua"
require "iupluagl"
require "luagl"

paddle = {x = -0.9, y = 0.2}

function drawPaddle(x, y)
    gl.Begin(gl.QUADS)
    gl.Color(0.0, 0.5, 0.0)

    gl.Vertex(x, y)
    gl.Vertex(x + 0.1, y)
    gl.Vertex(x + 0.1, y - 0.4)
    gl.Vertex(x, y - 0.4)
end

canvas = iup.glcanvas{buffer = "DOUBLE", rastersize = "300x300"}

function canvas:action(x, y)
    iup.GLMakeCurrent(self)
    gl.ClearColor(0.0, 0.0, 0.0, 0.0)
    gl.Clear(gl.COLOR_BUFFER_BIT)
    gl.Clear(gl.DEPTH_BUFFER_BIT)

    gl.MatrixMode(gl.PROJECTION)
    gl.Viewport(0, 0, 300, 300)
    gl.LoadIdentity()

    drawPaddle(paddle.x, paddle.y)

    gl.End()
    iup.GLSwapBuffers(self)
end

window = iup.dialog{canvas, title = "Soon to be Pong"}

function canvas:k_any(c)
    if c == iup.K_q then
        return iup.CLOSE
    elseif c == iup.K_w then
        paddle.y = paddle.y + 0.02
        return iup.CONTINUE
    else
        return iup.DEFAULT
    end
end

window:show()

iup.MainLoop()

هذا ما أفهمه canvas:k_any() يتم الاتصال به عند الضغط على أحد المفاتيح، لكنه لا يستجيب، حتى لأمر الإنهاء.أيه أفكار؟

هل كانت مفيدة؟

المحلول

إليك على الأقل جزءًا من مشكلة العينة التي نقلتها.قبل أن يتم تحديد ثوابت اسم مفتاح IUP فعليًا في ملفك iup الجدول، تحتاج إلى استدعاء دالة.الفكرة هي أن مساحة الذاكرة تكون أقل إذا لم تكن بحاجة إلى جميع أسماء المفاتيح، والتي يمكن للعديد من التطبيقات الاستغناء عنها تمامًا.

حاول إضافة الأسطر التالية في وقت ما بعد فترة وجيزة require "iuplua" وقبل استخدام الأسماء في أي كود:

iup.key_open()      -- load key names

تم توثيق هذا بالقرب من أعلى الموضوع رموز لوحة المفاتيح وكذلك في مجموعة متنوعة من الأماكن المتعلقة بلوحة المفاتيح.

دون الدعوة إلى iup.key_open(), iup.K_q يقيم ل nil (كما هو الحال مع أي اسم مفتاح آخر) وبالتالي لا يتطابق أبدًا مع أي رمز مفتاح تم تمريره إليه canvas:k_any().

يحرر: لقد قمت للتو بتشغيل العينة الخاصة بك، وقمت بالاتصال بالفعل iup.key_open() يؤدي إلى التعرف على المفتاحين q وw.لديك خلل آخر ستلاحظه بعد ذلك وهو أن مجرد تحديث موضع المجداف لا يتطلب إعادة رسم اللوحة القماشية.سأترك ذلك كتمرين بينما تمضي قدمًا.

تحرير 2: إضافة الخط iup.Update(self) إلى الوظيفة canvas:k_any() مباشرة بعد تعديل حالة المجداف يظهر أنه يفعل ما تريد.القيام بذلك بهذه الطريقة بدلاً من الاتصال يدويًا بـ action() تتمتع الطريقة بميزة التفاعل مع معالجة حلقة رسائل IUP بالطريقة المتوقعة.في الحالة العامة، الدعوة iup.UpdateChildren(window) بدلا من ذلك قد يكون المفضل.سيؤدي ذلك إلى الحفاظ على تحديث أي عناصر تحكم IUP أخرى يتم عرضها في مربع الحوار بالإضافة إلى اللوحة القماشية، وهو ما يمكن أن يكون مفيدًا إذا كانت لديك عناصر تحكم لا تقوم بجميع التحديثات الخاصة بها داخليًا.

وبدلاً من ذلك، يمكنك نقل إجراءات الرسم إلى وظيفتها الخاصة التي يتم استدعاؤها من كلا الملفين k_any() و action() طرق القماش.لست متأكدًا من أنني أوصي بذلك بشكل عام لأنه لا يتوسع بشكل جيد عندما تريد دعم إطارات عرض متعددة أو عناصر تحكم ذات صلة.

قد ترغب في إعادة ترتيب المنطق في ملفك k_any() المعالج بحيث تقل احتمالية نسيان المكالمة عن طريق الخطأ iup.Update() أثناء إضافة حالات للمفاتيح الجديدة.

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