ذهن زیبا

A beautiful mind

Latest Posts

به روز رسانی اوبونتو از نسخه های LTS به STS

توزیع اوبونتو، معمولا در دونسخه ارائه میشه. نسخه های «پشتیبانی طولانی مدت» یا همون LTS (مخفف Long Term Support ) که اگر اشتباه نکنم هر کدوم تا پنج سال، پشتیبانی دریافت میکنند. این پشتیبانی به معنای پشتیبانی از سمت کنونیکال (شرکت سازنده این توزیع)، دریافت آپدیت های امنیتی و همچنین به روز شدن مستندات توزیع است.

نسخه های STS که طبق روتین ارائه اوبونتو هر شش ماه یه بار میان، قبلا دو سال پشتیبانی می‌شدند ولی مثل این که الان این پشتیبانی کمتر شده و همون شش ماه (یا یک سال، دقیقا نمیدونم و یادم نیست) پشتیبانی رو دریافت میکنن. این نسخه ها به قول معروف «روی لبه تکنولوژی حرکت میکنند» و معمولا تکنولوژی های جدیدی رو در خودشون جای دادن.

هر کدوم از این نسخه ها، مزایای خودش رو داره. خیلی از افراد رو دیدم که با هر آپدیتی، سریعا سیستم عامل خودشون رو آپدیت میکنند و خیلی ها هم ترجیح میدند دو سال یک بار، نسخه های LTS رو آپدیت کنند و یا حتی کل پنج سالی که برای LTS ها پشتیبانی در نظر گرفته شده، روی اون بمونن. اما برگردیم به دسته اول!

فرض کنیم شما آخرین اوبونتوی LTS (در حال حاضر ۱۸.۰۴ ) رو نصب کردید و میخواهید به STS جدید (در حال حاضر ۱۹.۰۴) به‌روز رسانی کنید. برای این کار، نیاز به چند مرحله داریم. اول لازمه که update-manager رو نصب کنیم :

sudo apt install update-manager-core

و البته معمولا این بسته روی اوبونتو نصب شده. فقط در صورتی که نصب نباشه، این دستور نصبش میکنه. نصب هم باشه یا به شما میگه که آخرین نسخه رو نصب کردید یا به روز رسانی میکنه.

گام دوم، اینه که به آپدیت منیجر، بگیم که به جای lts در نسخه های normal برامون دنبال ریلیز جدید بگرده. فقط کافیه این فایل رو با یک ویرایشگر متن باز کنیم (البته ترجیحا ویرایشگرهای خط فرمان؛ چون دسترسی ریشه نیاز داریم) :

/etc/update-manager/release-upgrades

سپس در این فایل، شما احتمالا این خط رو می‌بینید :

Prompt=lts

با تغییر مقدار متغیر prompt به normal ، شما به آپدیت منیجر گفتید که در نسخه های STS به دنبال ریلیز جدید بگرده. بعد از این که عبارت lts رو با normal جایگزین کردید، کافیه فایل رو ذخیره کرده، ببندید و در ترمینال تایپ کنید :

do-release-upgrade

و جایی هم نیاز به پسورد داشته باشید، این دستور ازتون دریافتش خواهد کرد.

این راه حلی بود که خودم دقیقا استفاده کردم برای آپدیت به ۱۹.۰۴. نمیدونم قبلتر کسی در وب فارسی توضیحش داده یا نه، ولی خب امیدوارم که به کارتون بیاد 🙂

Share

ساختن کنترلر دو بعدی برای بازی های RPG در یونیتی

مدتی میشه که یکی از اسباب بازی های جدیدم، یعنی موتور بازی‌سازی یونیتی رو با جدیت بیشتری دارم دنبال میکنم و چیزای جالبی هم ازش یاد گرفتم. همینطور باعث هم شده دوباره کمی کد بزنم و این داستانها.

یکی از سبکهای مورد علاقه من در بازی‌سازی، سبک Role Playing عه که در این سبک، شما در واقع نقش ایفا می‌کنید، نقش هایی که به شما محول شده و یا این که شما هم میتونید در شکل‌گیری نقش دخیل باشید. بازی‌هایی مثل Elder Scrolls از این دست بازی ها هستند. چندی پیش، با یک ابزار آشنا شدم به اسم RPG Maker که به شما اجازه ساخت این دست بازی ها رو بدون کد زدن میده. اما یک مساله مهمی که احتمالا باهاش روبرو خواهید شد، اینه که این ابزار شدیدا محدوده و به سختی میشه شخصی‌سازیش کرد. به همین خاطر، سعی کردم دنبال این برم که یاد بگیرم چطور یک RPG دو بعدی ساده رو بسازم (حتی شده در حد کنترل کرکتر اصلی!).

نتیجه این شد که یک سری ویدئو دیدم و رفرنسهای برنامه نویسی یونیتی رو چند بار مطالعه کردم و تونستم چنین چیزی بسازم :

نوشتن چنین کدی کار سختی نیست اما کمی دقت لازم داره. به همین خاطر، چندین ساعت درگیرش شدم و در نهایت تونستم اونطوری که دلم میخواد، بسازمش. تمام مراحل طراحی کرکتر، طراحی صحنه، کد زدن و … رو خودم انجام دادم تا ببینم چقدر در جوانب مختلفش، توانایی دارم. خوشبختانه نتیجه خیلی هم بد نشد.

برنامه نویسی

برای کنترل کردن کرکترها در بازی، نیاز به کدی داریم که بتونه دیتا رو از کی‌برد، ماوس، صفحه لمسی و … دریافت کنه و حرکتی که مد نظر داریم رو برای ما، انجام بده. این حرکت میتونه صرفا جابجایی باشه، میتونه هم حرکت و انیمیشن با هم باشه. برای این که کد کامل باشه و بازی حرفه‌ای به نظر برسه، بهتره که انیمیشن هم لحاظ کنیم.

کدی که من نوشتم به این شکله :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : Entity {

    private Animator anim; 

	// Use this for initialization
	void Start () {
        anim = GetComponent<Animator>(); 
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)){
			GetComponent<Rigidbody2D>().transform.position += Vector3.up * speed * Time.deltaTime; 
		}
		if(Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow) )
        {
			GetComponent<Rigidbody2D>().transform.position += Vector3.down * speed *Time.deltaTime; 
		}
		if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow) )
        {
			GetComponent<Rigidbody2D>().transform.position += Vector3.left * speed * Time.deltaTime; 
		}
		if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow) )
        {
			GetComponent<Rigidbody2D>().transform.position += Vector3.right * speed * Time.deltaTime; 
		}

        anim.SetFloat("MoveX", Input.GetAxis("Horizontal"));
        anim.SetFloat("MoveY", Input.GetAxis("Vertical")); 
	}
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

این کد نشون میده که کلاس PlayerController از کلاس دیگری به اسم Entity داره ارث بری میکنه. تنها چیزی که در Entity تعریف شده، یک متغیر برای سرعت کرکتره. البته، سایر ویژگی هایی که نیاز داریم تا در تمام کرکترها (چه Player و چه NPC ) به کار ببریم رو میتونیم در Entity بگنجونیم.

در Update اومدیم بهش گفتیم که اگر ورودی از کلیدهای خاصی بوده، با سرعت مشخصی در جهتهای مشخص، حرکت کنه. متغیر speed هم یک متغیر public بوده که در Entity تعریف کردیم. در انتها هم گفتیم که دو متغیر ممیز شناور برای حرکت در محور X و Y نیاز داریم که با Animator Controller هماهنگ باشن. این میشه کل چیزی که در متد Update داریم.

در متد اول، یعنی Setup هم صرفا به کد گفتیم که انیماتور رو از خود شیء Player بخونه و لود کنه. پس ما نیاز داریم که خودمون یک انیماتور براش بسازیم.

چطور این کد رو آزمایش کنیم؟

آزمایش کردن این کد، هیچ کاری نداره. چون کل انیمیشن و … رو در گیتهاب قرار دادم (لینک) و میتونید از گیتهاب دانلودش کرده و تست کنید. به زودی هم، این ابزار رو به صورت یک prefab برای یونیتی منتشر میکنم که بتونید مستقیما از همین دیزاین و انیمیشن، بدون چسبوندنشون به هم، استفاده کنید.

موفق باشید 🙂

Share

چگونه در سطح سخت افزار، عدد تصادفی تولید کنیم؟

تولید عدد تصادفی، یکی از کارهاییه که در برنامه نویسی بسیار نیازش داریم. برای چه منظورهایی؟ برای مثال فرض کنید میخواهیم یک شبکه عصبی طراحی کنیم و وزن‌های ما باید تصادفی باشن. به همین خاطر، ما از عدد های تصادفی برای تولید وزن استفاده میکنیم. در سطح نرم افزار، تولید عدد تصادفی بسیار آسونه. مثلا در پایتون ما میتونیم به این شکل عدد تصادفی تولید کنیم (راهی غیر از numpy هم هست، ولی من اکثرا از این روش استفاده میکنم) :

from numpy import random 

random.seed(1) 

print(random.random((1, 1)))

ولی در سطح سخت‌افزار، کار کمی پیچیده تر میشه. در اینجا قصد دارم یک مدار ساده بسازم که دقیقا چنین کاری رو انجام میده. البته به این مدار گفته میشه Pseudo Random Number Generator چون نتایج، تصادفی تصادفی هم نیستند ولی برای کارهایی که به عدد تصادفی نیاز داره، خوبن.

خب، طراحی مدار ما به شکل زیره :

ما اومدیم چهار فلیپ فلاپ D رو به هم متصل کردیم. سپس، دو بیت کم ارزش در اتصال این زنجیره را با یک XNOR با هم مقایسه کردیم و یک پالس ساعت هم به مدار وارد کردیم.

وقتی که دو بیت کم ارزش صفر باشن، خروجی XNOR ما یک میشه. یعنی Q در فلیپ فلاپ پر ارزش (سمت چپ ترین)، برابر با یک خواهد شد. در پالس بعدی این اتفاق برای فلیپ فلاپ بعدی میفته، این اتفاق تا جایی میفته که نتیجه مقایسه، صفر میشه و فلیپ فلاپ پر ارزش مقدارش تغییر میکنه، به این شکل، دقیقا ترتیب اعدادی که در این Ring Counter داریم به هم میریزه و اعداد «شبه‌تصادفی» تولید میشن.

این هم از شبیه‌سازی این مدار :

همونطور که در ویدئو مشخصه، داره به صورت رندم عددهای چهاربیتی تولید میکنه.

امیدوارم که این مطلب مفید واقع شده باشه. همچنین اگر با ویدئوی شبیه‌سازی مشکلی دارید و یا لود نمیشه، میتونید از این لینک دانلودش کنید.

Share

ظاهر جدید وبلاگ و چند تغییر

#include <iostream.h> 

void main(){
    printf("Hello, World!\n"); 
}

. مدتها بود که قصد داشتم قالب وبلاگ رو عوض کنم و خب این کار رو کردم و الان شما دارید وبلاگ رو با ظاهر جدید می‌بینید، این قالب به نظرم خوانا تر اومد، و گذشته از اون، ظاهر قبلی وبلاگ هم زیادی تکراری شده بود (فکر کنم ۲-۳ سالی بود همین شکلی مونده بود!)

تغییر دیگر هم، اینه که Syntax Highlighter ای که استفاده می‌کردم رو تغییر دادم تا کدها رو بهتر و بدون تغییر در راست و چپ بودنش، نشون بدم 🙂

Share

راهنمای یک صفحه‌ای برای علاقمندان به رشته کامپیوتر

مدتهاست که با دوستان مختلف، روی نوشتن مطالبی پیرامون رشته مهندسی کامپیوتر بحث می‌کنیم. این بحثها شامل ایرادات روتین بچه‌های مهندسی کامپیوتر تا کار کردن روی یک پروژه نه چندان بزرگ (ولی پرچالش!) میشه. از اونجایی که تازه هم کنکور گذشته و بچه ها کمی آزاد شدن، ولی ممکنه برای انتخاب رشته دچار تردید بشن؛ وقت خوبی بود که مطالبی در مورد ماهیت این رشته نوشته بشه. مطالبی که مینویسم، حاصل مطالعاتیه که در این چند سال داشتم. سعی میکنم کمی تاریخ تعریف کنم، کمی از علوم کامپیوتر بگم و در نهایت هم کمی از چیستی و ماهیت خود خود کامپیوتر (نه رشته).

کمی تاریخ

باید ببینیم کامپیوترها از کجا اومدن و چه اشخاصی در شکل گیری اونها، نقش داشتن. این کمی سخته که دقیقا بخوایم بگیم از کجا اومدن. انسان، از وقتی هوشمند شد و ابزار ساخت به دنبال ابزار کاملی برای حل مساله بود، پس همیشه هم تلاشش در این راستا بوده که این ابزار رو بسازه. در طول تاریخ هم، علوم و فنون مختلف به کمکش اومدن تا این ابزار رو کامل تر کنه. بذارید تعدادی از این علوم رو با هم بررسی کنیم.

فلسفه و ریاضیات

فلاسفه و ریاضی دانان، افرادی بودن که به دنبال پاسخ بودن. البته فلاسفه، پرسشگران قهارتری هم بودن و گاهی، سوالاتی مطرح کردند و ریاضیدانان، اون سوالات رو پاسخ دادن. حالا با توجه به این که کامپیوتر یک «ابزار حل مساله‌»س، میشه گفت هر دو گروه به شدت درش دخیل بودن.گاهی هم فلاسفه‌ای که روی علوم کامپیوتر تاثیر داشتند، ریاضی دان هم بودن. نمونه‌ش هم «محمد بن موسی خوارزمی» دانشمند پارسی‌گو.

خوارزمی، شاید اولین کسی بود که «تفکر رایانش» رو ابداع کرد. در کتاب معروفی به نام «جبر و مقابله» به حل معادلات جبری پرداخته و راه حل هاش، عموما مرحله مرحله و شفافن. به همین خاطر هم وقتی این روش حل مساله به اروپا میرسه، اروپایی ها بخاطر «الخوارزمی» (اسم ایشون) ، که در لاتین «الگوریتمی» گفته می‌شده، روش حل مساله رو «الگوریتم» اسم گذاشتند. چیزی که هنوز که هنوزه، داره استفاده میشه.

البته، کار خوارزمی نظام بخشیدن و سازمان دادن به علوم و فنونی بوده که در زمان خودش، مطرح می‌شده. در واقع، از کشف صفر توسط هندی ها تا قضایای که امثال تالس و فیثاغورث پایه گذاشتن، همه در نوشته شدن «جبر و مقابله» و ایجاد تفکر سیستماتیک برای حل مساله، دخیل بودن.

منطق

گرچه بهتر بود این یک مورد رو، قبل از فلسفه و ریاضیات میاوردم، ولی به نظر من منطق حاصل برخورد فلسفه و ریاضیه. گرچه خیلی قبل تر از خوارزمی منطق مطرح شده بود، اما دورانی هم که ماحصل کارش یعنی «جبر و مقابله» به اروپا رسید، ابتدای راه استفاده از منطق در بیان و حل مسائل بودند. پس سعی کردند با استفاده از منطق و جبر، بسیاری از مسائل رو حل کنند. منطقی که در اینجا قراره درموردش صحبت کنم همون منطق «ارسطو» است، منطقی که شاید امروزه پایه و اساس همه کامپیوترهاست.

منطقی که ارسطو بنیان گذاشته، یک منطق صفر و یکی به حساب میاد. بذارید اینطوری بگم؛ با منطق ارسطویی میشه اینطور گفت :

علی از احمد قدبلندتره. احمد از حسن قد بلند تر. پس علی از حسن هم قدبلندتره

و در این مورد، منطق ارسطویی کاملا کار میکنه. مثلا ریاضیاتیش میشه :

اگر x آنگاه y ، اگر y آنگاه p -> اگر x آنگاه p

و این بیان رو ما اصولا در نوعی از ریاضیات به نام «ریاضیات گسسته» یاد می‌گیریم. چیزی که پایه و اساس علوم و مهندسی کامپیوتر امروزیه. اما، این فقط کافی نیست؛ منطق در یک محیط خاص کار میکنه که ما اعدادی جز صفر و یک نداریم! پس نیاز به نوعی از محاسبه و جبر داریم که برای فقط صفر و یک، کار کنه و کافی باشه. چیزی به اسم «جبر بول»

آقایی که در تصویر می‌بینید، جورج بول، ریاضی‌دان و فیلسوف انگلیسیه که با پایه گذاری جبر صفر و یکی بر مبنای «صحیح و غلط» خودش، علوم کامپیوتر رو شدید تسریع کرد. در سده نوزدهم خیلی چیزا ساخته شدن و اکثرا هم، بر پایه همین «بودن یا نبودن» آقای بول کار میکردن. اما اشتباهاتی هم در این میان رخ داده که حالا بهش میرسیم!

وقتی همه چیز مکانیکی شد

 

محاسبه گرهای مکانیکی، تقریبا از زمانی که معاملات جزئی از زندگی بشر شدند وجود داشتن. مثل چرتکه که حاصل کار چینی ها بوده (روزگاری هم باقی دنیا از چینی ها کپی می‌کردن!) ، ولی محاسبه‌گرهایی مثل چرتکه، صرفا چهارعمل اصلی رو انجام میدادن و بعدها ریاضی‌دانها از اون وسیله برای محاسبه ریشه دوم و سوم اعداد هم سعی کردند استفاده کنن. ولی محاسبه گرهای پیچیده تری لازم بود!

آقایی که در تصویر می‌بینید «چارلز بابیج» یک ریاضی‌دان و مهندس انگلیسی بود. ایشون ایده «موتور تحلیلی» رو مطرح کرد که چیزی بود شبیه کامپیوترهای امروز. برنامه پذیر و قابلیت حل تعداد زیادی مساله در زمانی کم. اما، کار ایشون مشکلاتی داشت. ایشون سعی داشت همه چیز رو مکانیکی پیاده کنه و زمانی که این ایده رو مطرح کرد ماشین های مکانیکی هنوز اونقدر پیشرفته نبودن. و مشکل دوم رو بالاتر اشاره کردم، ایشون مدعی بوده که بدون جبر بول هم میتونه کامپیوتر رو پیاده کنه و کامپیوتری بسازه که با مبنای ده کار کنه (چیزی که هنوز هم نشده 🙂 ) .

اما ماشین های مکانیکی کم کم به سمت جبر بول و محاسبات آماری رفتن. یک بار دیگه این تصویر رو با هم ببینیم:

این تصویر، تصویری از یک ماشین «شرط بندی» است که در نیوزلند نصب شده بوده. عملکرد مکانیکی برای محاسبات آماری مربوط به شرط بندی روی مسابقه اسبها داشته.

اما مکانیک کافی نبود، لازم بود اما کافی نبود. پس به عصر «الکترومکانیک» باید سفری کوتاه داشته باشیم!

همه چیز از یک رله شروع شد

رله، قطعه الکتریکیه که میتونه مشابه یک کلید عمل کنه. در واقع اعمال ولتاژ به یک قسمتش، میتونه قطع و وصل شدن جریان الکتریکی در یک قسمت دیگر مدار رو تضمین و کنترل کنه (به این شکل ما مثلا میتونیم با استفاده از اینترنت، یک لامپ رو خاموش روشن کنیم!). در اون زمان، به فکر یه مهندس خوش ذوق آلمانی به اسم «کانراد تسوزه» زد که جبر بول رو با رله پیاده کنه. تسوزه چند تا پیاده سازی داشت ولی معروفترینشون این بود :

کامپیوتر Z4 آلمانی که در دهه ۳۰ ساخته شد و خیلی هم به کمک ارتش آلمان در جنگ دوم جهانی اومد. اما مطمئنا یک نابغه خوش ذوق دیگر در طرف انگلیسی وجود داره که بتونه از ساز و کار این ماشین، سردربیاره!

قبل از این که به اونطرف قضیه بپردازیم، این ماشین به شکل امروزی تونست برنامه اجرا کنه و زبان برنامه نویسی خاص خودش رو داشت. مجهز به سیستم ذخیره و بازیابی «پانچ کارد» بود و خیلی از مفاهیم امروزی رو در خودش داشت. اما هنوز نمیتونست «کامپیوتر» کاملی باشه چون خیلی مفاهیم رو نتونست پیاده سازی کنه، مهم تر از همه، شدیدا وابسته به عامل انسانی بود.

شروع بازی تقلید!

موقعی که کشورهای مختلف درگیر جنگ دوم بودن، اکثرا پیامهاشون رو رمزنگاری می‌کردن و شکستن رمزها، واقعا یک نابغه می‌طلبید. یک نابغه خوش ذوق که بتونه قهرمان جنگی باشه و رمز آلمانها رو بشکنه و متفقین رو، پیروز میدان کنه!

آقایی که در تصویر می‌بینید «آلن تورینگ» انگلیسی، این کار رو کرد. رمز آلمانیها موسوم به «انیگما» رو شکست و به این ترتیب قهرمان جنگی شد. اما کارش به همینجا ختم نشد و در دهه ۵۰ میلادی ایده «تفکر در رایانه» و «هوش مصنوعی» رو مطرح کرد که تا امروز هم مطالعه روی این موضوعات، ادامه داره. این شخص به معنای واقعی، نابغه و خوش ذوق بوده.

ترانزیستور و عصر سیلیکون

خب، این هم از فصل آخر تاریخ کامپیوتر. در اواخر دهه ۴۰ ، کامپیوترها یک دفعه رشد کردند. کشف ترانزیستور باعث شد مدارات الکتریکی و الکترونیکی مورد نیاز برای ساخت کامپیوتر بتونن روی یک سطح چند سانتی متری از سیلیکون خلاصه بشن. قطعاتی با کاربرد بالاتر ساخته بشن. عصر سیلیکون مصادف بود با حضور امثال دنیس ریچی و کن تامپسون و مفاهیمی مثل «سیستم عامل» (توضیح این بخش از تاریخ خودش یک پست جدا میطلبه پس شاکی نباشید از من لطفا!) مطرح بشن و رشد نرم افزاری در این حد، باعث شد که اصلا سرعت رشد یک شکل دیگری به خودش بگیره!

کامپیوتر چیست؟ کامپیوتر کیست؟

شاید باورتون نشه ولی قبل از ظهور ماشین های محاسبه گر، کامپیوتر یک عنوان شغلی بوده برای کسانی که محاسبات پیچیده رو انجام میدادن (و طوری که در موردشون مطالعه کردم، ظاهرا حق پرسش در مورد این که این محاسبه رو چرا دارن انجام میدن نداشتن) و بخش جالبتر این بوده که عموما «کامپیوتر»ها رو در سازمانها، خانمها تشکیل میدادن (البته اولین برنامه نویس جهان هم یک خانم به اسم ایدا لاولس بوده که در تصویر زیر می‌بیندشون).

البته، اونقدری نمی‌گذره که «علوم کامپیوتر» مطرح میشه. بعنوان علم مطالعه و پردازش داده. و این پدیده، همزمان بوده با پدیدار شدن کامپیوترهای به معنای امروزی. پس بیشتر اپراتور و برنامه نویس تربیت می‌کردند.

در تصویر بالا هم، عکسی از اپراتورهای کامپیوتر انیاک (در امریکا) رو می‌بینید که هم باید به نرم افزار مسلط می‌بودن و هم سخت افزارش.

اما به طور کل، کامپیوتر امروزه چی تعریف میشه؟ کامپیوتر یعنی وسیله‌ای برای پردازش داده و استفاده از اون داده در علم. ما داده های مختلفی داریم که کامپیوتر میتونه برای ما پردازشش کنه و نتیجه اون پردازش رو در هر شکلی به ما بده (یک نمودار، روشن و خاموش شدن یک دستگاه خاص یا حتی یادگیری و تکرار یک عمل از روی همون داده ها). پس، تا اینجا هم تا حد زیادی تاریخ کامپیوتر رو تونستیم بفهمیم، هم تعریفش رو. شاید براتون جالب باشه که اصلا کامپیوتر ها چطوری هم ساخته میشن!

کامپیوتر چطور داده رو پردازش میکنه؟

برگردیم به همون جبر بول. ما یه سری وسیله (یا بهتر بگم نمایش الکترونیکی!) از عملیات بولی داریم که بهشون میگن «دروازه منطقی» یا همون گیت. گیتها به این شکل هستند :

هر کدوم از اینها میتونن یکی از توابع بولین رو پیاده کنن. حالا، ما اگر اینها رو کنار هم بچینیم میتونیم بخش بزرگی از محاسبات رو به سادگی انجام بدیم. مثلا این مداری که من ساختم رو ببینید :

این مداریه که یک عدد BCD (که نوعی رمزگذاری در کامپیوتره) رو دریافت میکنه، به صورت دهدهی (دسیمال، مبنای ده) در خروجی قرار میده. حالا ما میتونیم اونطرف با یک Encoder این مقادیر رو دوباره به BCD یا هر فرمت دیگری تبدیل کنیم. در واقع کاری که ما انجام دادیم همون پردازش داده‌س. حالا هر قسمتی رو میشه یک بلاک در نظر گرفت و کنار هم قرار داد تا به چنین چیزی رسید :

مداری که در بالا طراحی کردم، یک واحد محاسبه و منطق برای یک کامپیوتر هشت بیتی بود (لینک) و این واحد، همونجاییه که داده پردازش میشه. البته واحد کنترل و حافظه هم در کامپیوتر داریم که برای کنترل پروسه پردازش و ذخیره داده پردازش شده ازشون استفاده می‌کنیم!

خب، فکر کنم به اندازه کافی اون چیزایی که میخواستم رو پوشش دادم، امیدوارم اگر قصد کامپیوتر خوندن دارید، شیرینی و زیبایی این رشته رو قبل از ورود به دانشگاه درک کنید و وقتی واردش می‌شید، لذت ببرید 🙂

Share

صداگذاری بازی کامپیوتری در یونیتی – بخش دوم

در بخش گذشته؛ با نحوه صداگذاری و ورود به Trigger و همچنین اضافه کردن موسیقی متن به بازی، آشنا شدیم. در این بخش میخوایم کمی پا رو فراتر بذاریم و Dynamic Soundscape رو هم یاد بگیریم. فقط قبل از اون باید کمی مفاهیم آهنگسازی/صداگذاری رو با هم مرور کنیم.

مفهوم Soundscape

فضاهایی که توسط صدا ساخته میشن، یا بهتر بگم؛ صدایی که باعث میشه فضایی خاص به ذهن ما بیاد رو بهش میگن Soundscape. مفهوم پیچیده‌ای نیست ولی میتونه به پیچیده شدن سایر مفاهیم یا حتی هموار تر شدن فهمشون، کمک کنه.

در تصویر بالا، چند Soundscape رو مشاهده میکنیم. یکی برای موج، یکی برای باد، یکی برای پرندگان و … . اما آیا همیشه Soundscape ها، صداهای محیطی (Ambient ) هستند؟ خیر. بعضی وقتا هم قطعات کوتاه و کوچک موسیقی هستند که به ما در درک شرایط کمک میکنن (برای اهل فنش : مثلا یه ویولن ترمولو که یه آرپژ مینور رو بزنه، میتونه کمی ترس یا نگرانی رو القاء کنه). پس، ما نیاز به Soundscaping داریم که بتونیم با صداها؛ حس القاء کنیم.

مفهوم Dynamic Soundscape

خب اینجا کمی مفهوم میتونه پیچیده باشه، اصلا چرا میگیم داینامیک؟ مشخصه، چون قرار نیست همیشه یکسان باشه. پس به چه دردی میخوره؟ فکر کنید در بازی شما صحنه‌ای وجود داره که قراره صدای آب پخش بشه، پس باید با نزدیک شدن به آب، صدای آب کم کم بلند بشه و به گوش برسه، و وقتی کارمون با اون مرحله تموم شد، صدای آب قطع بشه. این رو بهش میگیم Dynamic Soundscape . در یونیتی به سادگی میتونیم این مفهوم رو پیاده کنیم .

مفاهیم مورد نیاز در یونیتی

مفهوم Audio Mixer

میکسر، مفهومش تقریبا همه جا یکیه، پس اگر با Reaper, FL Studio, Studio One و نرم افزارهای آهنگسازی دیگر (هزاران نرم افزار دیگه!) کار کردید، با این مفهوم آشنایید پس این بخش رو می‌تونید ازش عبور کنید . اما به طور کل، ما از میکسر استفاده میکنیم جهت این که صداها رو به کانالهای مختلف بفرستیم. در این کانال ها میتونیم بلندی صدا، تغییراتشون و همچنین افکتهایی که نیاز داریم رو کنترل کنیم.

در یونیتی هم امکان ایجاد و مدیریت تعداد بسیار زیادی میکسر وجود داره، گذشته از اون ما میتونیم یه سری میکسرها رو Master در نظر بگیریم و یه سری دیگه رو زیرمجموعه اونا حساب کنیم. به این شکل، تقریبا میشه گفت که خود یونیتی داره به ما یه استودیوی کامل صداگذاری رو تحویل میده.

شروع پروژه

خب، اول از فولدر Assets با راست کلیک، یک Audio Mixer ایجاد کنیم و اسمش رو بذاریم Master (قراره همه میکسرهای دیگرمون زیرمجموعه این باشن) :

بعد از منوی Window گزینه Audio Mixer رو فعال میکنیم و به این شکل اون رو خواهیم دید :

حالا که یک Master داریم، دو گروه دیگه (از زیرمجموعه Groups )  ایجاد میکنیم به اسم Soundtrack و Sphere . از Soundtrack برای کنترل موسیقی متن (چطوری؟! یاد میگیریم) استفاده میکنیم و از Sphere برای کنترل موسیقی که کنار Sphere ما پخش میشه.

حالا میریم سراغ دوربینمون و Audio Source ای که بهش اضافه کردیم ، یک گزینه Output داریم، اون رو روی Soundtrack قرار میدیم (به همین راحتی، موسیقی/صدا رو در یک کانال از میکسر فرستادیم!)

و به همین ترتیب، موسیقی که روی Sphere قرار دادیم رو هم به کانال Sphere میفرستیم.

استفاده از Snapshot ها

میکسرها قابلیتی دارن به اسم Snapshot که میتونیم وضعیتی رو از اون میکسرها، ثابت نگه داریم. در واقع انگار که عکس گرفته باشیم (از اسم مشخصه). و به کمک همین Snapshot هاست که میشه وضعیت صدا رو کنترل کرد. در ادامه، کد و روش کار رو با هم یاد میگیریم.

نوشتن اسکریپت Dynamic Soundscape

قبل از هرچیزی، اسکریپتی که در بخش قبل نوشتیم رو از Sphere حذف میکنیم و فایل صوتی رو مستقیم به Audio Source میدیم. سپس به Audio Mixer بر میگردیم و این طور تغییرش میدیم :

با اجرای بازی، الان فقط میتونیم صدای موسیقی متن رو بشنویم. پس میریم به قسمت Snapshots و روی + کلیک می‌کنیم و اسمش رو میذاریم Snap1 . سپس، اون Snapshot ستاره دار (به نوعی Master در اسنپ شاتها!) رو به این شکل تغییر میدیم :

و باز یک Snapshot جدید به اسم Snap2 ایجاد میکنیم. حالا در Asset ها یک C# Script تازه ایجاد میکنیم به اسم DynamicSoundscape . و این ها رو درونش مینویسیم :

در خط چهارم من UnityEngine.Audio رو اضافه کردم، این به این معناست که میتونم از Snapshot ها هم استفاده کنم. در خط ۷ و ۸ هم دو تا Snapshot ساختم به اسم fadeIn (برای آرام بلند شدن صدای مورد نظر) و fadeOut (برای آرام کم شدن صدا)، سپس تعریف کردم که وقتی وارد Trigger شدیم و تگمون هم Player بود، وارد fadeIn بشه و وقتی ازش خارج شدیم، وارد fadeOut . حالا این اسکریپت و دو اسنپ شاتی که ساختیم رو به Sphere میدیم :

حالا وقتشه که بازیمون رو اجرا کنیم و نتیجه رو به چشم ببینیم 🙂

نتیجه کارمون به صورت GIF به این شکله (به تغییر کانالهای میکسر دقت کنید 😀 )

مسلما این همه اون چیزی نیست که برای صداگذاری باید بدونید، ولی به نظر من مهم ترین بخشه. امیدوارم در این دو بخش، تونسته باشم به خوبی پوشش بدم مطلب رو. در آینده هم احتمالا باز مطالبی در مورد کار با یونیتی خواهم نوشت، و اینها آخرین مطالب من در یونیتی نیستن. بهرحال، امید به این که مفید بوده باشه و امید به موفقیت شما 🙂

Share

صداگذاری بازی کامپیوتری در یونیتی – بخش اول

بحث صدا و موسیقی در بازی کامپیوتری، بحث عجیب و گهگاه پرچالشیه. چرا که صداها میتونن جو و هدف بازی ما رو تعیین کنند و بهش فضای بالاتری اختصاص بدن. در این مطلب، قصد دارم بخشی از تجربیات خودم در زمینه صداگذاری (و نه آهنگسازی!) در بازی های کامپیوتری رو با شما به اشتراک بذارم. در این مطلب، چیزی که بررسی میکنیم : ۱. قرار دادن موسیقی متن بازی و ۲. پخش صدا در Trigger های خاص خواهد بود. پس در ادامه با من باشید 🙂

قرار دادن موسیقی متن بازی

اول یک پروژه به اسم Audio Test درست میکنیم، سپس وارد Scene اصلی میشیم تا این صفحه یونیتی رو ببینیم :

حالا باید دو کار انجام بدیم، از Asset های پیشفرض، یک First Person Controller برداریم و Main Camera رو هم پاک کنیم. ضمن این که لازمه حتما یک «زمین بازی» بسازیم. بعد از این کارها Scene من این شکلی شد :

وقتی روی FPSController کلیک کنیم و اولین زیرمجموعه‌ش رو در Inspector ببینیم با این صحنه مواجه میشیم :

همونطور که می‌بینید، در این Inspector ما عنصری به اسم Audio Listener داریم. Audio Listener کارش «شنیدن صدا»ست و روی دوربین سوار میشه. کاراکتر اول شخص هم معمولا همراه خودش یک دوربین داره، پس خیالمون از بابت «شنیده شدن» صدا، راحته. حالا روی Add Component کلیک می‌کنیم و یک Audio Source بهش اضافه میکنیم و سپس، موسیقی متن مورد نظر رو به عنوان Audio Clip بهش معرفی می‌کنیم (در اینجا دوئت پیانو و ویولن که چند وقت پیش ساخته بودم رو معرفی کردم) و تیک Loop هم میزنیم :

(البته اینجا تیک Loop رو نزدم) و حالا تبریک! موسیقی متن بازی شما نشست روی بازی. ولی این همه ماجرا نیست. ماجرا در کل خیلی پیچیده تر میشه ولی این اولین چیزیه که ما باید یاد میگرفتیم (مثلا بعدها در مورد این که چطور موسیقی داینامیک استفاده کنیم و … هم بحث خواهد شد).

حالا که این رو یاد گرفتیم، بریم سراغ اضافه کردن یک لایه صدا که در یک Trigger خاص قرار می‌گیره.

ساخت Trigger های صدا

در Scene یک Sphere میسازیم، یک متریال دلخواه بهش میدیم، یک Collider از نوع Trigger براش تعریف می‌کنیم و نتیجه میشه این :

خب، محتوای Inspector باید مثل این باشه (البته الزامی نیست، صرفا خواستیم که محدوده Collider مشخص باشه). الان کاری که باید بکنیم، اینه که یک Audio Source و یک Script به این Sphere اضافه کنیم (زبان اسکریپت رو سی‌شارپ تعیین کنید). حالا کافیه در اسکریپتمون چنین چیزی بنویسیم :

این اسکریپت، میگه که «اگر چیزی وارد Collider من شد و تگ Player داشت، کلیپی که معرفی شده رو یک بار پخش کن». پس به Inspector باید بریم و برای FPSController مون، یک تگ Player تعریف کنیم. سپس، به Script (و نه Audio Source ) باید یک Clip اختصاص بدیم، به این شکل :

و خب کار تموم شد! این فایل صوتی هم با ورود ما به Trigger تعریف شده، پخش خواهد شد!

چه چیزهایی مونده که هنوز باید یاد گرفت؟

موضوعی که اینجا بهش پرداخته شد خیلی خیلی سطحی بود. برای کار صدا در یونیتی، هم باید با Audio Mixer کار کنیم هم Audio Mixer Snapshot . گذشته از اون، باید با اسکریپت؛ اینها رو به هم مرتبط کنیم، به شکلی که یه جا موسیقی آروم قراره پخش بشه و بعد موسیقی یک صحنه خوفناک وارد بشه و … . سعی می‌کنم در قسمت (های) بعد، این موارد رو هم پوشش بدم.

موفق باشید 🙂

Share

نصب و راه اندازی KTechLab برای پروژه های الکترونیک

پروژه های الکترونیک، مثل طراحی مدار، مدارهای منطقی، الکترونیک دیجیتال و … ، همه معمولا توسط نرم افزار Proteus و در سیستم عامل ویندوز انجام میشن. پروتئوس نرم افزار کامل و جامعیه و همه چی هم داره. شما میتونید به سادگی یک پروژه میکروکنترلری در پروتئوس پیاده سازی و اجرا کنید و مطمئن باشید نتیجه‌ای که میگیرید، تا حد بسیار زیاد و قابل قبولی، شبیه نتیجه‌ایه که در پیاده‌سازی حقیقی از پروژه خواهید داشت.

اما مشکلی که اکثر کاربران لینوکس دارند، اینه که پروتئوس نسخه لینوکس نداره. اجرای اون روی واین هم زیاد چنگی به دل نمیزنه و گذشته از اون، همه هم سیستمی ندارند که ماشین مجازی رو تحمل و ساپورت کنه، پس نتیجتا اکثر افرادی که پروژه های الکترونیک انجام میدن، یک سیستم عامل ویندوز هم کنار لینوکسشون دارند. امروز تصمیم داشتم که یک پروژه‌ای رو آزمایش کنم و میخواستم ببینم که روی اوبونتو، چه ابزاری نصب دارم. طبق معمول به دنبال Logisim گشتم ولی فهمیدم که هنوز نسخه جدیدش رو دانلود نکردم. پس، گفتم بهتره سرچ کنم و به نتیجه مطلوب برسم.

در نتیجه جست و جو، به KTechLab رسیدم. گرچه اسمش برام آشنا بود ولی هیچوقت ازش استفاده نکرده بودم. گفتم که بهتره الان به دنبالش باشم و ازش کمی (حتی شده آزمایشی) استفاده کنم. شاید، نتیجه‌ای که خواستم رو گرفتم. خب، خوشبختانه این نرم افزار اون چیزایی که میخواستم رو داشت. این هم تصویری از محیطش :

و الان یک سوال پیش میاد :

چطور نصبش کنیم؟

من اسمش رو جست و جو کردم و به وبسایتش رسیدم (لینک) و بعد سورس کدش رو دانلود کردم. اما فهمیدم که برای نصبش نیاز به cmake دارم، پس اون رو نصب کردم :


کد   
sudo apt install cmake

و بعد از نصب این، کمی گشتم تا ببینم چه پیش‌نیازهایی داره، سپس اونا رو نصب کردم :


کد   
sudo apt install git kdelibs5-dev kdevplatform-dev qt4-dev-tools cmake libglib2.0-dev

بعد از نصب، فایل فشرده حاوی سورس کد رو از حالت فشرده درآوردم، درون پوشه سورس یک پوشه به اسم build ساختم و به ترتیب این سه دستور رو زدم :


کد   
cmake ..
make
sudo make install

و در آخر، دیدم که KTechLab به لیست نرم افزارهای نصب شده اضافه شده.

در آینده، در مورد این که این نرم افزار چطوره و کجاها به درد میخوره، بیشتر خواهم نوشت. امیدوارم این پست مفید واقع شده باشه، موفق باشید 🙂

Share

امنیت حسابهای اجتماعی

امروز صبح در تلگرام پیامی برای من فوروارد شد که حاوی یک اسکرین شات از توییت خود شرکت توییتر بود. این اسکرین شات :

همونطوری که می‌بینید، توییتر میگه یک باگ پیدا کردن که باعث شده یک سری پسوردها، بدون این که ماسک بشن، لاگ شدن. یعنی چی؟

فرض کنیم ما یک پسورد میسازیم، پسورد ما موقعی که داریم وارد میکنیم یک چیزی مثل MySecurePassword@123456 عه. این پسورد تقریبا تمام فاکتورهای یک پسورد امن رو داره. ولی اگر به صورت Plain Text بخوایم ذخیره‌ش کنیم این که جای خود، یک میلیون کارکتر دیگر هم داشته باشه احتمال لو رفتنش بسیار بالاست. (داخل پرانتز عرض کنم خدمت آقای علیرضا شیرازی، مدیریت محترم بلاگفا که تا چند سال پیش هم همینطوری پسورد ها رو نگهداری میکرد، جای این که در توییتر و … ملت رو بخاطر مواخذه کردنتون بلاک کنید، پاسخ میدادید که چرا اینطور بود! چون همون موقع هم بسیاری از اسکریپت های مدیریت محتوا پسوردها رو ماسک می‌کردن!).
حالا بخوایم MySecurePassword@123456 رو در دیتابیسی ذخیره کنیم باید چه کنیم؟ باید از «هش» و الگوریتم های مربوطه استفاده کنیم. مثلا الگوریتم MD5 (لینک جهت مطالعه). حالا این عبارت نسبتا سخت رو من با کمک ابزارهایی که دم دستم بود به MD5 هش میکنم و نتیجه میشه :

23b7618b2a23e171e6cda057a9736423

و وقتی من پسورد رو وارد کنم، اسکریپتی که برای لاگین نوشتم، یا API ای که وظیفه لاگین کردن من رو برعهده میگیره، اول پسورد رو هش میکنه بعد در دیتابیسش چک میکنه و اگر هش یکی بود، اجازه میده من به سیستم دسترسی داشته باشم. برای مثال این یک سیستم لاگین بسیار ساده بود که خودم نوشته بودم :

کد   
post '/welcome' do
 begin 
  params[:user][:password] == params[:user][:password_again]
  user = User.create(:username => params[:user][:username], :password => Digest::MD5.hexdigest(params[:user][:password]))
  redirect to("/welcome")
 rescue
  redirect to("/signup_error")
 end
end

و این یعنی ذخیره ایمن پسورد در یک دیتابیس (در اینجا از دیتابیس های مونگو استفاده کردم). و حالا اگر اون قسمتی که مربوط به هش کردن پسورد نمیشد رو، در کد قرار میدادم چه میشد؟ وقتی قرار بود Query بزنم مثلا به یوزر mamad و پسوردش 1125 بود، اینطور بر میگردوند :

کد   
{
"username":"mamad", 
"password":"1125"
}

و مثلا اگر شما قرار بود با API ای که من برای عضوگیری سرویس نوشتم کار کنید (مثلا لاگین کردن به وسیله سرویس من در اپلیکیشن، بازی یا سیستم حضور غیاب و … )، پسوردها رو به سادگی میتونستید ببینید. اما چیزی که الان بر میگرده اینه :

کد   
{"username":"mamad","password":"c21002f464c5fc5bee3b98ced83963b8"}

و خب شما نمیتونید به پسورد دسترسی پیدا کنید، مگر این که ابزار یا دیکشنری مربوط به شکستن این الگوریتم رو داشته باشید. البته معمول هم نیست شما JSON مربوط به اطلاعات کاربران رو برگردونید! چون باز هم دیتای کاربر به خطر میفته.

فکر کنم به قدر کافی در مورد پسورد و نحوه ذخیره سازیش توضیح داده باشم، هدف این بود که مباحثی مربوط به هک شدن و نفوذ به تلگرام هم در این پست مطرح کنم که متاسفانه این پست بیش از چیزی که فکر کردم، طولانی شد. پس در مورد تلگرام در پست جداگانه ای خواهم نوشت 🙂

 

Share

چگونه بازی‌ساز شویم؟

بارها این مطلب را آمدم بنویسم ولی هربار پاکش کردم. هی پاک کردم و هی دوباره از نو. اما این بار با قصد و نیت جدی تری به دنبال اینم که بنویسم. تا کمی با «صنعت گیم» آشنا بشیم. چون اکثر ما در «بازی کردن» خوبیم. پول خیلی خوبی برای بازی کامپیوتری پرداخت میکنیم، مدتی را در نوجوانی معتاد کلش آو کلنز بودیم و … . پس، بهتره کمی از «بازی کردن» فرا تر بریم و به «بازی ساختن» فکر کنیم.
حداقل برای کسانی که در رشته های مرتبط تحصیل می‌کنند، صرف بازی کردن کافی نیست، بلکه باید کمی هم با تکنولوژی و راه و رسم ساخت بازی آشنا باشیم.

در سال ۹۶، حدود دو ماه در استودیویی مشغول کار شدم، بعنوان «آهنگساز» برای بازی کامپیوتری. اول که قرار بود کار آهنگسازی و دیزاین صدا به واسطه کامپیوتر رو براشون انجام بدم. یعنی طراحی ساندترک های بازی (موسیقی متن) و طراحی ساند افکت (صداهایی که می‌شنویم، مثل باد، صدای دستگاههای عجیب و غریب آخرالزمانی یا صدای هیولا و … ) ولی کم کم بخاطر کمبود نیرویی که به کار صدا وارد باشه، رُل «صدا گذار» هم به من داده شد. حالا دیگه صرفا کسی که کل روز وقتش پشت FL باشه نبودم و باید در یونیتی انجین کد میزدم و Sound Object و … وارد میکردم و با میکسرهای یونیتی بازی میکردم. برای من سخت بود چون اولا که به من گفته نشده بود قراره صداگذاری کنم، دوما زبان یونیتی سی شارپه و من هم چندان دل خوشی ازش ندارم. پس به شدت سعی میکردم تن ندم و از زیرش دربرم (حتی نیروی کمکی هم با خودم برده بودم 😀 ). ولی باگ قضیه این نبود. باگی که در این سیستم بود فراتر از این ماجراها بود. که در این مطلب قراره در موردش توضیح بدم!

از کجا شروع کنیم؟

برای بازی سازی، ما رُل های متعددی داریم. از برنامه نویسان و متخصصین هوش مصنوعی گرفته تا رُلهای کاملا سینمایی مثل نویسنده و کارگردان، همه حیاتی و مهم هستند و باید در یک تعادل حساس، کنار هم قرار بگیرند. نه این که یک یا دو نفر سعی کنند همه این رُل ها رو داشته باشند. حداقل وقتی که قراره بازی پدرمادر دار و درست و حسابی بسازیم، نیاز داریم برای هربخشی یک متخصص (یا یک تیم متخصص) داشته باشیم. در این قسمت، با هم کمی نقش ها رو بررسی میکنیم. از یک «ایده» ساده تا یک «بازی» کامل.

ایده خام

اگر همین لحظه که این متن رو میخونید یک دقیقه متوقف بشید و سعی کنید برای «موضوع آزاد» انشاء بنویسید، چه خواهید نوشت؟ مثلا آیا «یک سرباز رومی گرفتار شده در ایران» یا «یک سردار صفوی گرفتار شده در عثمانی»؟ یا حتی ساده تر، «کودکی که از سر کنجکاوی وارد یک قلعه ویکتوریایی شده». همه این ها جذابن. ولی زیادی خام هستند، شما نیاز دارید که کمی این ها رو پرورش بدید تا برسید به «ایده خام».

بیاید به «کودکی که از سر کنجکاوی وارد یک قلعه ویکتوریایی شده» رو با هم کاملش کنیم. میگیم «کودکی داشت در یکی از خیابانهای لندن، توپ بازی میکرد. ناگهان توپش درون قلعه افتاد. هیچ کس از بزرگترها – به خاطر داستانهایی که از آن قلعه شنیده بودند – داخل نمی‌شدند تا توپ را برای کودک بیاورند. حالا کودک بخاطر شجاعت و نترسی کودکانه‌اش، این خطر را به جان خرید و وارد قلعه شد». تا اینجا یک ایده بسیار خوب داریم. حالا لازم شد که روی ایده کار کنیم. پس این ایده رو با یک «نویسنده» در میان میگذاریم (یا خودمان، اگر توانش رو داریم، روی بسطش فکر میکنیم).

نویسندگی و بسط ایده

تا اینجا، ساخت فیلم و بازی بسیار شبیه بودند. اما از اینجا به بعد قراره که متفاوت تر بشن. بازی یک نوع رسانه «اینتراکتیو» یا «تعاملی» به حساب میاد ولی فیلم نه. کنترل بخشی از بازی دست پلیره ولی فیلم نیست. بنابراین باید اول تصمیم بگیریم «کجا قراره بازی مثل یک فیلم روند خودش رو طی کنه» و «کجا قراره بازی دست پلیر بیفته». حالا میتونیم ایده ها رو کنار هم بچینیم. ولی قبل از چیدن این مسائل کنار هم، نیاز داریم که یک سری المان ها را به خوبی کنار هم قرار بدیم :
۱. پیش زمینه و تاریخچه از موضوع کلی (چرا مردم حاضر نیستند در اون قلعه برن؟ حتی وقتی توپ کودک معصومی آنجا افتاده؟)
۲. طرح سوال کلی و شروع داستان (ورود کودک به قلعه)
۳. ایجاد تنش (رو به رو کردن کودک با چیزی که تا به حال با اون مواجه نشده، دیدن موجودات ماوراء الطبیعی و …)
۴. حل سوال توسط قهرمان و پایان داستان (جنگیدن کودک با توهماتی که درون قلعه با آن دچار شده، جنگیدن کودک با طرز تفکر مردم و غالب شدن یک طرز تفکر جدید).
بسیار خب، حالا بیایم با هم کل ایده رو به «طرح کلی» یا همون «پلات» تبدیل کنیم :

«سالیان سال، قلعه‌ای ویکتوریایی در جنوب شهر لندن بود که مردم منطقه شبها از آن صدای جیغ و داد می‌شنیدند. گاهی هم مردمی که در روز از کنار آن قلعه عبور می‌کردند، صدای گریه و زاری زنی را می‌شنیدند، گویی که به سوگ فرزندش نشسته باشد.
روزی، «آلن» ، کودک ۱۰ ساله‌ای که ساکن جنوب لندن است، به تنهایی با توپ خود بازی میکند، ناگهان توپ او از  دریچه قلعه، به درون آن میفتد. پسربچه از چند بزرگتر خواهش میکند که توپش را برای او بازگردانند، اما همه آنها با اتکا به اتفاقاتی که در آن قلعه افتاده است، می‌ترسند که داخل شوند؛ چرا که هراس از «زنده برنگشتن» در وجود آنان نهادینه شده است.
آلن، دیگر از دست آن آدم بزرگها به ستوه آمده و خودش وارد قلعه می‌شود. در اولین نگاه، اسکلت زنی را می‌بیند که با لباس عروسی کهنه و تارعنکبوت بسته، روبروی یک دست آینه و شمعدان نقره نشسته است؛ نماد های سلطنتی مجارستان و انگلیس را می‌بیند که تارعنکبوت بسته و از رنگ و رو افتاده اند. محو تماشای شکوه از دست رفته خاندانهای سلطنتی شده که ناگهان یادش میفتد به دنبال توپش آمده.
وقتی آلن در قلعه به دنبال توپش میگردد، ناگهان پایش روی یک چیزی – مانند یک تکه استخوان – رفته و صدای جیغی در محیط می‌پیچد. تمام افرادی که سالها در آن قلعه حبس شده و مُرده بودند، زنده می‌شوند و حالا وظیفه آلن است که به داستان آنها گوش دهد و و وقتی که به صورت کامل، هم داستانها را شنید و هم نامه ها و خاطرات را خواند، تازه می‌تواند از قلعه خارج شود و خارج از آن قلعه، ماجرای زنی که به انتظار دامادش نشسته بود را، برای آدم‌بزرگها تعریف کند و پلیس نیز جرات کند به قلعه ورود کرده و سپس ماجرا در تمام دنیا، پخش شود».

چیزی که در بالا خواندیم، یک پلات ساده بود. این پلات رو من بداهه نوشتم و شاید پلات درستی نباشه، ولی ممکنه سالها بعد به یک بازی تبدیل بشه. حالا نکته مهم اینه که این پلات باید به فیلمنامه تبدیل بشه، مثلا گشت و گذار صرف توی یک قلعه به اندازه کافی هیجان انگیز نیست، پس یک جا لازمه که مثل بازی «لایه های ترس» ، از بُردهای «وی‌یا» (برد Ouija که از دو کلمه Oui فرانسوی و Ja آلمانی تشکیل شده و برای احضار ارواح استفاده میشه) برای ارتباط با ارواح یا حل یک معما استفاده کنیم. یا مثلا، در کشوی میزکار افسر آلمانی – که چندین روز مهمان آن خانم ثروتمند و نجیب‌زاده بوده – یک کلید قایم کنیم که مربوط به یکی از درهای اصلی قلعه باشه. پس اینجا کار نویسنده به «طراحی گیم‌پلی» تغییر میکنه. معمول هم اینه که طراح گیم‌پلی شخص متفاوتی از نویسنده باشه، مگر این که تیم ما به قدر کافی بزرگ نباشه. بعد از این که گیم پلی طراحی شد، و حالا داستان و گیم پلی پخته ای داریم، وقتشه که از دو نفر کمک بگیریم : هد تیم برنامه نویس ها و کارگردان.

شروع به ساخت و کارگردانی

شما در متنی که نوشتید احتمالا برای هر کاراکتری یک شرح حالی دادید. مثلا «آلن» در پلات ما یک کودک ده ساله از خانواده ای متوسط در جنوب لندن، که هم‌بازی نداره. این شرح حال برای «کاراکتر آرتیست» مهمه چرا که داره روی اون قضیه، کاراکتر رو متصور میشه. یا در مورد اماکن و … . «یک قلعه ویکتوریایی قدیمی خزه بسته» توصیف بسیار خوبیه برای یک «آرتیست محیط» که اون رو چطور طراحی کنه که هم در نگاه اول یک خرابه متروکه به نظر برسه و هم یک محیط خوفناک. حالا کارگردان باید از طرحهایی که براش زده میشه انتخاب کنه. آرتیست های دیجیتال با نرم افزاری مثل بلندر یا تری‌دی مکس، اونها رو تبدیل به آرت سه بعدی کنن، و تحویل برنامه نویس ها بدن.

برنامه نویس ها هم وظیفشون ایجاب میکنه که در محیط بازی‌سازی (مثلا یونیتی) داستان رو به کد تبدیل کنند. انیماتور ها بخش های «غیر اینتراکتیو» رو میسازند و برنامه نویس بخش اینترکتیو رو. بعضی وقتها هم با هم همکاری میکنند (مثلا وقتی که قراره کاراکتر وارد یک Trigger خاصی بشه و مثلا سقف بریزه) و این مرحله تولید هم به خوبی پیش میره. تا این که یک بازی کامل ولی بدون صدا داریم. حالا وقتشه که «بازیگران صدا» و «صدا بردار» و «صدا گذار» هم وارد بشن. حالا بازی ما هم صدا داره هم گیم پلی. هم مکانیک بازی به خوبی در محصول ما پیاده شده. پس در «پس تولید» چه میکنیم؟

پس‌تولید

در پس تولید، موسیقیدان و آهنگساز وارد میشن و متناسب با سینماتیک، مکانیک و گیم پلی موسیقی میسازن. ممکنه صداگذار خود تیم، حاضر به صداگذاری نشه (چون کار اصلیش در تولید بوده و نه پس تولید) پس تیم آهنگسازی خودش یک صداگذار هم داره (شاید هم همون صداگذار تیم باشه ولی این بار بعنوان صداگذار تیم آهنگسازی!)، موسیقی روی بازی قرار داده میشه و بازی آماده عرضه برای بازار. ولی هنوز زوده پس عجله نکنید!

توی این مرحله از خوره بازی ها، کسانی که اون ژانر رو دوست دارند و حتی «کسی که صرفا بازی رو دوست داره ولی نه گیمره و نه اهمیتی به محتوای بازی میده» دعوت میشه که بازی رو تست کنن. تست هم معمولا یا از طریق اینترنت اطلاع رسانی میشه (تا جایی که میدونم فن‌افزار چنین کاری کرد) و یا از تیمهای دیگر درخواست میشه که تسترهاشون رو در اختیار تیم بذارن. تسترها تست میکنن. بازی میکنن و میگن «فلان جا بهتر بود معما سخت تر میشد» یا «بهمان جا موسیقی به صحنه نمیخورد». پس یک بازنگری میکنیم و اونجاهایی که واقعا توی ذوق میزنه رو تعویض میکنیم، اونجاهایی که از قصد یک تناقضی ایجاد کردیم (مثلا قرار دادن موسیقی جز امریکایی روی یک صحنه قتل پر خون) رو توضیح میدیم.

حالا وقتشه که بازی رو منتشر کنیم. چه روی استیم، چه مستقل، چه روی بازار یا هیولا، فرقی نداره. مهم اینه که باید مارکتینگ خوبی داشته باشیم (در مورد مارکتینگ خوب بازی کامپیوتری و جذب نیرو در استدیو هم خواهم نوشت) که مشتری جلب کنیم. با خارجی ها در ارتباط باشیم (چون اونها هم منتقدان خوبی دارند!) و فقط به داخل ایران محدود نشیم. ولی یادتون نره «نقدها باید شنیده بشن ولی الزامی در عمل کردن به اونها نیست». و آماده بشیم برای پروژه های بعدی.

یک کلام، برای بازی ساز شدن باید چه کار کنیم؟

اگر نظر من رو میخواید، هم باید بازی کنید، هم فیلم ببینید هم کتاب بخونید. خوندن داستانهایی مثل IT یا «برج سیاه» از استفن کینگ، دیدن فیلمهایی مثل «سگ اندلسی» از لوییس بونوئل یا حتی دیدن فیلمهای پرهیاهو و تجاری مثل «دانکرک»، بازی کردن بازیهای مستقل مثل «اینساید» یا «لایه های ترس» یا بازی های تجاری مثل «رزیدنت اویل» همه و همه کمکه. ایده ها از کره مریخ در ذهن ما نمیان، با دید ما از دنیای اطراف ساخته میشن. علاوه بر این آشنایی و کار با موتورهای بازی سازی (بخصوص یونیتی) شدیدا مهمه. حتی اگر شما صرفا تهیه کننده هستید و قرار نیست حتی یک خط هم کد بزنید، لازمه که آشنا باشید.

 

 

 

 

Share