PDA

View Full Version : سوالی درباره کلاس Graphics...?



سارا_ر
جمعه 12 مرداد 1386, 12:21 عصر
دارم یک بازی طراحی می کنم که برای این کار به تعداد زیادی مربع کوچولو نیاز دارم برای اینکار می خواستم خودم یک مربع بسازم و از اون به تعداد زیاد در فرمم استفاده کنم (درست مثل زمانی که یک TextBox با تمام خصوصیاتی که مد نظرمونه Build می کنیم و از اون درفرم استفاده می کنیم) می خوام ببینم می شه کلاسی برای این مربع تعریف کنم که از کلاس graphics ارث می بره و یه سری خصوصیات هم خودم بهش بدم می شه اگر بلدین codesho بگین

saeed_rezaei
جمعه 12 مرداد 1386, 13:14 عصر
همانطور که خودتون هم گفتید، می شه یه کلاس ساخت که از کلاس دیگه ای به راث برسه. سپس خصوصیات و متدها و event های خودتون رو بهش اضافه کنید.
خودتون جواب سوال رو می دونید،دنبال چه کدی می گردید؟
بعدشم این رو مشخص کنید که این مربعهایی که شما می خواید توی برنامه استفاده کنید، سیاهی لشکر داستان بازی هستند یا آبجکتهای اصلی هستند. منظورم اینکه قراره کاربر با اونها بازی کنه یا اینکه قراره فقط صفحه رو پر کنند.

سارا_ر
جمعه 12 مرداد 1386, 13:26 عصر
بازی Tetris رو می خوام بنویسم برای اینکار نیاز به تعداد زیادی مربع دارم نمی دونم برای تعریف این کلاس از چه کلاسی به ارث ببرم از system.drawing به بعد بقیشو چی بنویسم که اینقدر Error نده یعنی دقیقا از کدوم کلاس باید به ارث ببرم می شه اگر می دونید بقیه اش چیه بگین؟

حامد مصافی
جمعه 12 مرداد 1386, 15:19 عصر
کلاس Graphics قابلیت ساخت نسخه جدید رو نداره!
این کلاس برای هر کنترل با استفاده از متد CreateGraphics موجوده.
اگر قراره مربع های شما بصری باشند (!) بهتره از یکی از کنترل های ویندوز مشتق بشوند یا اینکه یک User Control ایجاد کنید مگر اینکه نصمیم به نوشتن برنامه با استفاده از متد های گرافیکی داشته باشید. که در اینصورت هم می تونید شی Bitmap خاص خودتون رو ایجاد، مقدار دهی و استفاده کنید.

saeed_rezaei
جمعه 12 مرداد 1386, 15:44 عصر
من این بازی رو که می گید نمی دونم کدومه اما تصویر از یه بازی زدم امیدوارم منظورتون همین باشه.
تجزیه و تحلیل من از برنامه اینه:
این بازی رو توی دو حالت ارائه می دن.
حالت ساده تر حالتی هست که کافیه یک خط تکمیل کنی تا خط حذف شد و بهت امتیاز بده.
حالت دوم ، باید تمام مربع های یک خط همرنگ باشن تا خط پذیرفته شه و بهت امتیاز بده


اما در کل اگه دقت کرد باشید می بینید که صفحه این بازی از یه سری اجزاء تشکیل شده.
در این بازی ما یه صفحه خالی داریم. که انواع شکلها که تعدادشون هم زیاد نیست (تقریب 3-4شکل) در اون چیده می شن.

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

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

حالا من یه سوال دارم.
این برنامه ای که من دارم توضیح می دم همونی که شما خواستید؟ یا سرکارم؟ :متفکر:

سارا_ر
جمعه 12 مرداد 1386, 19:37 عصر
ممنون از راهنماییتون چون دقیقا دارین همون بازی رو توضیح می دین که من می خوام خودم تمام توابع رو نوشتم یعنی به همین صورت که می گین با یک ماتریس 3*3 این کاررو انجام دادم تمام کارها با این توابع انجام می شه و اشکال گرافیکی فقط کار منو روی فرم منعکس می کنه مشکلم با ترسیم گرافیکیه حالا چطوری می تونم اصلا این مربعها رو طوری بکشم که هرکدومشون یه اسم داشته باشن که بشه اونا رو بررسی کرد چون مثلا برای اینکه بخوام نشون بدم شکلم یک خط پایینتر اومده باید بگم مربع پایینی(اسمش) برابر با همون مقدار 1 شده که شما می گی( نشون می ده خونه من الان پره) نمی دونم کارم درسته یا نه اما یه کلاس تعریف کردن و توی این کلاس یک تابع کشیدن مربع گذاشتم بعد روی فرمم از این کلاس نمونه گیری کردم و با دوتا حلقه For به هر تعداد که بخوام مربع برام می کشه اما نمی دونم چطور این مربعات رو اسم گذاری کنم روش من غلطه؟ راه دیگه ای واسه این کار هست؟

__H2__
شنبه 13 مرداد 1386, 10:18 صبح
سلام
مثل بازی های سه بعدی و واقعی عمل کنید.

یک واسط یا کلاسس پایه تعریف کنید که
-یک زیربرنامه یا متد به نام paint داشته باشد که نمونه ای از شی graphic را تحویل میگیرد
-دارای خصوصیت Size و Location باشد که مکان و اندازه را مشخص کند.

بعد تمام اشکال نمایشی را از کلاسس فوق وراثت بگیرید و تمام نمونه ها را در یک Collection از اشیای نمایشی جای دهید (مثلاً System.Collections.Generic.List) سپس در زمان paint فرم اصلی با یک حلقه For Next یا ForEach تمام اعضای داخل Collection را به کمک متد paint خودشان ترسیم کنید.

یعنی هر شی شما خودش میداند چگونه باید ترسیم شود و این کار را در متد paint خودش که یک graphic هم تحویل گرفته به کمک size و location خودش انجام میدهد.
و بعد شما در Paint اصلی فرمتان کافیست به تک تک زیر جزها فرمان ترسیم خودشان را بدهید و کلاسس graphic را هم که دات نت به شما داده به صورت آبشاری شما هم به بقیه بدهید تا خودشان خودشان را رسم کنند.

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

__H2__
یک شنبه 14 مرداد 1386, 09:39 صبح
سلام
البته حالا که فکرش را میکنم، میبینم برنامه مورد نظر شما ساده تر از این حرفهاست!!!
شما میتوانید یک ماتریس بزرگ Boolean بسازید (یا Color) که شامل کل خانه ها در صفحه نمایش باشد، و برتنامه ی مدیریتتان صرفاً خانه ها را برای نمایش یا عدم نمایش بلوک True یا false کند و پخش نمایش که در داخل کدPaint قرار دارد بر اساس ان ماتریس شکل نهایی را ترسیم کند.