رمز جميل هو متعة للكتابة ، ولكن من الصعب مشاركة هذا الفرح مع المبرمجين الآخرين ، ناهيك عن غير المبرمجين. في وقت الفراغ بين وظيفتي اليومية ووقت العائلة ، كنت أتلاعب بفكرة قصيدة البرمجة باستخدام عنصر لوحة الرسم في المتصفح. هناك العديد من المصطلحات لوصف التجارب البصرية على الكمبيوتر مثل الفن ديف ورسم الكود التجريبي والفن التفاعلي ، ولكن في النهاية قمت بتسوية قصيدة البرمجة لوصف هذه العملية. إن الفكرة وراء قصيدة هي قطعة نثر مصقولة يمكن مشاركتها بسهولة وموجزة وجمالية. انها ليست فكرة نصف منتهية في كراسة الرسم ، ولكن قطعة متماسكة قدم للمشاهد من أجل التمتع بها. القصيدة ليست أداة ، ولكنها موجودة لإثارة العاطفة.
من أجل الاستمتاع الخاص بي ، كنت أقرأ الكتب في الرياضيات والحساب والفيزياء والبيولوجيا. لقد تعلمت بسرعة أنه عندما أضع فكرة ، فإنه يدمر الناس بسرعة كبيرة. بصريا يمكنني أن أتناول بعضًا من هذه الأفكار التي أجدها رائعة ، وسرعان ما أعطي أي شخص شعوراً بالدهشة ، حتى لو لم يفهموا النظرية الكامنة وراء الكود والمفاهيم التي تحركه. لا تحتاج إلى معالجة أي فلسفة أو رياضيات صلبة لكتابة قصيدة برمجة ، مجرد رغبة في رؤية شيء ما على الهواء مباشرة والتنفس على الشاشة.
إن الكود والأمثلة التي وضعتها معًا أدناه ستجعلنا نفهم كيفية سحب هذه العملية السريعة والمرضية للغاية. إذا كنت ترغب في المتابعة مع الرمز يمكنك ذلك قم بتنزيل الملفات المصدر هنا.
الخدعة الرئيسية عند إنشاء قصيدة هي إبقائها خفيفة وبسيطة. لا تقضي ثلاثة أشهر في بناء عرض واحد رائع حقًا. بدلا من ذلك ، قم بإنشاء 10 قصائد تطوّر فكرة. اكتب رمزًا تجريبيًا مثيرًا ، ولا تخف من الفشل.
وللحصول على نظرة عامة سريعة ، فإن اللوحة هي في جوهرها عنصر صورة نقطية ثنائية الأبعاد تعيش في DOM والتي يمكن رسمها. يمكن أن يتم الرسم باستخدام سياق ثنائي الأبعاد أو سياق WebGL. السياق هو كائن JavaScript الذي تستخدمه للوصول إلى أدوات الرسم. إن أحداث JavaScript المتوفرة لقماش الكتّاب مجردة جدًا ، بخلاف تلك المتاحة لـ SVG. أي حدث يتم تشغيله هو للعنصر ككل ، وليس أي شيء مرسوم على اللوحة ، تمامًا مثل عنصر الصورة العادي. فيما يلي مثال قماش أساسي:
var canvas = document.getElementById('example-canvas');var context = canvas.getContext('2d');//Draw a blue rectanglecontext.fillStyle = '#91C0FF';context.fillRect(100, // x100, // y400, // width200 // height);//Draw some textcontext.fillStyle = '#333';context.font = "18px Helvetica, Arial";context.textAlign = 'center';context.fillText("The wonderful world of canvas", // text300, // x200 // y);
انها بسيطة جدا للبدء. الشيء الوحيد الذي قد يكون مربكًا قليلاً هو أنه يجب تكوين السياق باستخدام الإعدادات مثل fillStyle و lineWidth و font و strokeStyle قبل استخدام استدعاء السحب الفعلي. من السهل نسيان تحديث هذه الإعدادات أو إعادة تعيينها والحصول على بعض النتائج غير المقصودة.
المثال الأول فقط ركض مرة واحدة ورسم صورة ثابتة على اللوحة. هذا أمر جيد ، ولكن عندما يستمتع حقا هو عندما يتم تحديثه في 60 لقطة في الثانية. تحتوي المتصفحات الحديثة على الطلب المدمج في وظيفة AnimationFrame الذي يقوم بمزامنة رمز الرسم المخصص لدورات الرسم الخاصة بالمتصفح. هذا يساعد من حيث الكفاءة والسلاسة. يجب أن يكون هدف التصور هو الشفرة التي يبلغ طولها 60 إطارًا في الثانية.
(ملاحظة حول الدعم: توجد بعض polyfills بسيطة إذا كنت بحاجة إلى دعم المتصفحات القديمة.)
var canvas = document.getElementById('example-canvas');var context = canvas.getContext('2d');var counter = 0;var rectWidth = 40;var rectHeight = 40;var xMovement;//Place rectangle in the middle of the screenvar y = ( canvas.height / 2 ) - ( rectHeight / 2 );context.fillStyle = '#91C0FF';function draw() {//There are smarter ways to increment time, but this is for demonstration purposescounter++;//Cool math below. More explanation in the text following the code.xMovement = Math.sin(counter / 25) * canvas.width * 0.4 + canvas.width / 2 - rectWidth / 2;//Clear the previous drawing resultscontext.clearRect(0, 0, canvas.width, canvas.height);//Actually draw on the canvascontext.fillRect(xMovement,y,rectWidth,rectHeight);//Request once a new animation frame is available to call this function againrequestAnimationFrame( draw );}draw();