Game

saadatmsg

Active Member
سلام دوستان

راستش من يه نمونه بازي درست كردم . كه مي تونه جالب باشه . البته مي دونم اصلا به درد نمي خوره و كامل نيست اما فقط مي تونم بگم جالبه.

هدف تو اين بازي پريدن آدمك از روي مانع وسطه . البته يه جاش گير كردم و اونم اينه كه يه بار كه مي پره دفعه دوم دكمه رو كه مي زني نمي پره. مي دونم مشكلش كجاست اونم تو استفاده از متغير m هست. راستش راه حلي براش پيدا نكردم.

اگر دوستان مي تونن كمك كنن درستش كنم

ممنون
 

پیوست ها

  • game.rar
    4.4 کیلوبایت · بازدیدها: 34

BEHESHT

Well-Known Member
جالب بود منتهی یه چند تا نکته رو عرض کنم

برای کد نویسی اول سعی کنین متغییر ها و عملگر ها ربطی به موضوع داشته باشه مثلا عملگر پرش اسمش بشه jump نه script1 دوم این که از توضیحات استفاده کنین سوم این که مثل یه کار تکرار مثل game over رو تو یه اسکریپت بذارین و هم موقع خواستین استفاده کنین

این سه مورد به کد در تصحیح کد خیلی کمک می کنه و سومی باعث کم شدن حجم کد میشه و خلوت تر شدن اسکریپت:-?

و چهارم به جای استفاده از تایمر حتما از حلقه استفاده کنین اشکم در اومد قضیه رو فهمیدم:wink:

مثال تصحیح شد

موفق باشید:rose:
 

پیوست ها

  • modif.zip
    4.7 کیلوبایت · بازدیدها: 24

BEHESHT

Well-Known Member
خیلی دوست دارم بدونم توجیهش چیه؟
حلقه از تایمر بهتره؟!
مطمئنا" شما بدون نگاه کردن به مثال این دیدگاه رو دارید:)در ضمن توجیح واسه مقصر هست و رفع قصور من دلیل میارم

تو مثال پس از پایان پرش شما مجبور بودی m رو صفر مقدار دهی کنی اما چون کل اسکریپت یک جا اجرا میشد m رو صفر می کردی پرش از صفحه هم بیرون می زد:mad:

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

در ضمن شما با دیباگ اجرا بگیرین ببیند مثال چون تو تایمر افتاده متسفانه تا قیام قیامت ادامه پیدا می کنه و ولی حلقه رو راحت میشد متوقف کرد فقط کافی بود پایانش رو رو طول صفحه قرار می دادین:wink:

حالا شما برعکس این فکر می کنین؟:-?
 

splinter cell

Well-Known Member
مطمئنا" شما بدون نگاه کردن به مثال این دیدگاه رو دارید
اتفاقاً هر دو نمونه رو اجرا کردم و دیدم و بعد اون نظر رو نوشتم.البته کد نویسیش رو زیاد دقیق نشدم.اما جمله شما بشکل کلی بیان شده بود(چون داشتید درباره قواعد کدنویسی صحبت میکردید) و جسارتاً بجای اینکه بنویسین ((بجای استفاده از تایمر از عبارت شرطی استفاده کنید)) نوشتین از حلقه استفاده کنید و اصل جریان از همیتجا شروع شد. آخه منظور از حلقه در بیلدرFor...Next هست و If ...Then رو عبارت شرطی میگیم. اون موقع گمون میکردم توی این مثال , شما به کمک حلقه For ...Next مثال رو درست کردین و اون رو به اسکریپت تایمر ترجیح میدین.به همین دلیل و با توجه به شناختی که از شما داشتم برام تعجب آور بود و دوست داشتم دلیلش رو بدونم.

اما الان که با دقت به کدنویسی نگاه کردم دیدم دریغ از یک حلقه بکار رفته توی این مثال!!!؟و همه عبارت شرطی بوده و تازه فهمیدم سوء تفاهم در برداشتی هست که من و شما از حلقه داریم.و صددرصد اشتباه تایپی بوده که بر اثر ریزش ریاد اشک از چشمان مبارک حاصل شده پوریای عزیز :)
درضمن در نمونه ای که شما اصلاح کردین اگر با زدن اینتر کاربر نتونه به موقع پرش کنه و game over بشه کافیه چند ثانیه دیگه به همون حالت صبر کنه تا جمله سبز رنگ و زیبای WIN خودش ظاهر بشه :) کی گفته نابرده رنج گنج میسر نمیشود؟؟ ;-)
حالا خودتون پیدا کنید پرتقال فروش را ;-)
در ضمن اینجانب بر طبق آخرین سندی که در دفترخانه اسناد ملی به ثبت رسوندم ارادتمند همه دوستان و مخصوصاً جنابعالی هستم :)

پ.ن

دوست عزیزsaadatmsg شما میتونید بجای چک کردن هر متغیر با یک عبارت شرطی جداگانه همه شرطها رو یکجا بنویسید.اینطوری موقع مشاهده کدنویسی ها درک اونها براتون راحت تر میشه.مثلاً کد شما به شکل زیر درمیاد

کد:
این کد شماست
 
If (x>302) Then
If (x<379) Then
If (y<92) Then
If (y>85) Then
Hide("gif")
Show("game over")
End
End
End
End
 
 و  شکل خلاصه  اون 
 
 
 
If (x>302 & x<379 & y<92 & y>85) Then
Hide("gif")
Show("game over")
End
 

Silver Soft

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

در ضمن شما با دیباگ اجرا بگیرین ببیند مثال چون تو تایمر افتاده متسفانه تا قیام قیامت ادامه پیدا می کنه و ولی حلقه رو راحت میشد متوقف کرد فقط کافی بود پایانش رو رو طول صفحه قرار می دادین

اما الان که با دقت به کدنویسی نگاه کردم دیدم دریغ از یک حلقه بکار رفته توی این مثال!!!؟و همه عبارت شرطی بوده و تازه فهمیدم سوء تفاهم در برداشتی هست که من و شما از حلقه داریم.و صددرصد اشتباه تایپی بوده که بر اثر ریزش ریاد اشک از چشمان مبارک حاصل شده پوریای عزیز :)

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

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

موق باشید.
 

saadatmsg

Active Member
دوستان از همتون ممنونم كه به بنده كمك مي كنين تا اشكالتمو برطرف كنم.

بله كار من خيلي خيلي ايراد داره اما خوب اميدوارم روند پيشرفتو طي كنم.

حرفي كه آقاي splinter cell زدن (بجای چک کردن هر متغیر با یک عبارت شرطی جداگانه همه شرطها رو یکجا بنویسید) كاملا درسته و منم از اين موضوع اطلاع داشتم اما چون بجاي & از , استفاده مي كردم درست اجرا نمي شد.

يه چيز ديگه هم بگم.راستش ما مبتديا وقتي مشتاق به كار بيشتر مي شيم كه شما حرفه اي ها دلسوزانه كمكمون مي كنن. چون با نقد شما هست كه ايراد ماها مشخص مي شه و در آينده برطرف ميشه.

واقعا از همتون ممنونم:)
 

evil_gates

اين نيز بگذرد ...
با اجازه جناب BEHESHT من يه تغيير كوچولو تو فايلي كه اصلاح كرديد انجام دادم.

تو فايلي كه شما قرار داده بوديد امكان اينكه كليد ENTER رو بزنيم و مجددا آدمك به سمت بالا بپره وجود داره اما نكته اي كه ديده نشده اينه كه اگه وقتي آدمك بالاتر از سطح زمين هست ما پشت سر هم كليد Enter رو بزنيم ديگه تا آخر بازي پايين نمياد و همينطور تو هوا به حركت خودش به سمت جلو ادامه ميده. :green::wink:

اينجوري ميشه تو بازي تقلب كرد و همه موانع رو پشت سر گذاشت.

فكر ميكنم ما لازم داريم تعداد Enter هايي كه پشت سر هم زده ميشه رو چك كنيم و بعد اجازه پرش بديم.

تغييري كه من دادم نتيجش ميشه اين: اگه ادمك رو زمين در حال حركت هست امكان اينكه كليد Enter رو بزنيد داريد. اگه رو هواست فقط يكبار ديگه ميتونيد كليد Enter رو بزنيد و ديگه هرچي اين كليد رو بزنيد تاثيري نداره مگه اينكه آدمك مجددا به زمين برگرده و باز شما اجازه داشته باشيد كه كليد Enter رو بزنيد.

در واقع شما فقط دوبار پشت سرهم ميتونيد Enter رو بزنيد و بعد بايد منتظر بمونيد تا آدمك به زمين برگرده و دوباره بتونيد اين كار رو تكرار كنيد.

فايل اصلاح شده پيوستي و وضعيت متغير enternum رو تو Page start اسكريپت Enter-Jump و اسكريپت jump (شرط چهارم) ببينيد
 

پیوست ها

  • modif.zip
    4.7 کیلوبایت · بازدیدها: 10

saadatmsg

Active Member
واقعا ازتون ممنونم

اما يه سوال ديگه هم داشتم . حالا فرض كنيد كه اون جعبه وسط بخواد تغيير مكان بده و به سمت آدمك بياد. براي حركتش كه مشكلي وجود نداره ولي چجور مي تونم موقعيت فعلي اونو تشخيص بدم تا هر جاي صفحه بود و آدمك بهش خورد بازي Game Over بشه؟

من از كد زير استفاده كردم :
کد:
objx1=ObjectX(box)
objw=ObjectWidth(box)
objx2=x1+objw
objy1=ObjectY(box)
objh=ObjectHeight(box)
objy2=y1+objh

كه تو هر لحظه مي شه مساحت شي يا محدوده اي كه وجود داره تعيين كرد :

ولي وقتي تو شرطم مثلا نوشتم
کد:
If (x>objx1) Then
  RunScript("gameover")
End

جواب نگرفتم و بلافاصله پيام Game over ميده.

مي شه بگين ايراد كار من كجاست؟
 

evil_gates

اين نيز بگذرد ...
ميشه بگيد x كه تو شرط نوشتيد چه متغيري هست و چه مقداري رو برميگردونه؟

ضمن اينكه توصيه ميكنم نام جعبه رو تو يك متغير رشته‌اي قرار بديد و مقدار متغير رشته‌اي رو تو توابع ObjectX و ... بنويسيد مثل اين كد:
کد:
obj$ =[COLOR=DarkRed] 'box'[/COLOR]
objx1=[COLOR=Blue]ObjectX[/COLOR](obj$)
objw=[COLOR=Blue]ObjectWidth[/COLOR](obj$)
objx2=x1+objw
objy1=[COLOR=Blue]ObjectY[/COLOR](obj$)
objh=[COLOR=Blue]ObjectHeight[/COLOR](obj$)
objy2=y1+objh
 

splinter cell

Well-Known Member
در کل استفاده از حلقه به حای تایمر درست نیست ، حلقه برای زمانی باید به کار بره که قراره یکسری کار در سیکل زمانی خاصی انجام بشه و رابط کاربری در این بین دخیل نباشه ، از اونجایی که بیلدر از برنامه نویسی MultiThreading پشتیبانی نمیکنه با انجام همچین عملیاتی برنامه فریز میشه و وقتی از این حالت در میاد که کار از کار گذشته باشه .
کــــــــــــــــــــــــــــــــــــــاملاً
و منم با استناد به همین نکته اون سئوال رو پرسیدم.حقیقتش یه لحظه به دانسته هام شک کردم.


حرفي كه آقاي splinter cell زدن (بجای چک کردن هر متغیر با یک عبارت شرطی جداگانه همه شرطها رو یکجا بنویسید) كاملا درسته و منم از اين موضوع اطلاع داشتم اما چون بجاي & از , استفاده مي كردم درست اجرا نمي شد.
اگر بخواهیم در صورت درستی چند شرط یک عمل انجام بشه از عملگر ( و ) & استفاده میشه و اگر برآورده شدن یکی از شرطها کافی باشه از عملگر (یا) با این نماد | استفاده میکنیم. x>2 |y<3 در این صورت هر کدوم درست باشن منجر به اجرای دستور میشه.

نكته اي كه ديده نشده اينه كه اگه وقتي آدمك بالاتر از سطح زمين هست ما پشت سر هم كليد Enter رو بزنيم ديگه تا آخر بازي پايين نمياد و همينطور تو هوا به حركت خودش به سمت جلو ادامه ميده.
از شما چه پنهون یکبار ما هم به همین روش مزه پیروزی رو توی این بازی چشیدیم :) خیلی هم حال داد.یاد فیلم بتمن میافتی که توی هوا پرواز میکنه تا به مقصد برسه.
 

saadatmsg

Active Member
x همون متغيري هست كه براي حركت آدمك استفاده مي شه و هر دفعه يكي بهش اضافه مي شه تا آدمك حركت كنه.

اگر مثال همرا هتون باشه داخل اسكريپت move اين شرطو مي بينيد.

واسه زماني كه x ادمك با x جعبه يكي مي شه و پيغام Game Over نمايش داده مي شه

اين كارم كه شما گفتين انجام دادم ولي مجدد به همون مشكل برخوردم
 
آخرین ویرایش:

evil_gates

اين نيز بگذرد ...
تو مثال شما موقعيت x شي مربع 350 هست در حالي كه شرط شما موقعيت 302 رو بررسي ميكنه

احتمالا با آزمايش و خطا به اين عدد رسيديد تا وقتي x كه همون مقدار متغيري هست كه حاصل حركت آدمك به سمت جعبه هست از عدد 302 بيشتر شد نتيجه بگيريم كه كاراكتر وارد منطقه جعبه شده پس game over ميشيم.

توصيه ميكنم به جاي اين كار موقعيت آدمك رو نسبت به موقعيت جعبه بررسي كنيد.

ObjectX آدمك رو بدست بياريد و اون رو با ObjectX جعبه مقايسه كنيد و تو شرط بنويسيد در صورتي كه مثلا ObjectX آدمك بزرگتر از ObjectX جعبه بود پيغام game over صادر بشه
 

saadatmsg

Active Member
البته آزمون و خطاي خاصي نبود فقط عكسو كنار جعبه گذاشتم و xشو پيدا كردم

در مورد مورد بعدي هم اجازه بدين امتحان كنم اگر به مشكلي برخوردم خبر مي دم .

ممنون
 

evil_gates

اين نيز بگذرد ...
منظور منم از آزمايش و خطا همينه دوست عزيز.

شما با قرار دادن تصوير آدمك روي جعبه عدد 302 رو به صورت دستي بدست آورديد. حالا اگه جعبه رو جابجا كنيد مجبوريد دوباره به صورت دستي به عدد ديگه اي برسيد. اين كار منطقي نيست دوست عزيز.

اگه به روشي كه گفتم اختلاف موقعيتx آدمك رو با موقعيت x جعبه چك كنيد در هر لحظه و هر شرايطي ميتونيد شرطتون رو به درستي اجرا كنيد و نيازي نيست كه اعدادي رو به صورت دستي بدست بياريد و تو شرط بزاريد
 

saadatmsg

Active Member
بله درست مي فرماييد

كد اولي رو كه من نوشتم هم بابت همين بود . كه موقعيت هر لحظه جعبه براي ما مشخص مي شد. اجازه بديد مثالو براتون بذارم تا متوجه بشيد ايراد كارم كجاست.

مثال زيرو با توجه به نكاتي دوستان گفتند تصحيح كردم اما يه نگاه به اسكريپت move بندازيد. و اسكريپت location هم كه موقيت فعلي شي box رو تعيين مي كنه

اما وقتي آدمك به موقعيت box مي رسه ديگه پيامي نمي ده
 

پیوست ها

  • modif.rar
    4.7 کیلوبایت · بازدیدها: 8

saadatmsg

Active Member
دوستان يه كم روش وقت گذاشتم و تكميلترش كردم.

تو بازي از شخصيت هاي Super Mario استفاده كردم . الن ديگه به جاي جعبه وسط همون قارچ معروف و اخمو قرار داره و حركتم مي كنه

البته قول ميدم اگر وقت كردم حتما از ايني كه هست تكميلترش كنم....(البته با عقل ناقص خودم و كمك شما دوستان)

اميدوارم خوشتون بياد
 

پیوست ها

  • modif.rar
    128.6 کیلوبایت · بازدیدها: 18

جدیدترین ارسال ها

بالا