«یا اللهُ یا رَبِّ یا حَیُّ یا قَیّوم یا ذَالجَلالِ وَ الاکرام اَسئَلُکَ بِاسمِکَ اَلعَظیم اَلاَعظَم اَن تَرزُقَنی رِزقاً حَلالاً طَیِّباً بِرَحمَتِکَ الواسِعَه یا اَرحَمَ الرّاحِمِین.»
fکد هوش مصنوعی دشمن ( خون و حمله ) بسیار ساده در یونیتی به زبان سی شارپ :: گیم اور _ بازیسازی با unity + مطالب متفرقه

گیم اور _ بازیسازی با unity + مطالب متفرقه

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

به نام خدا
--
گروه قدیم ما promakers.ir یا پرومیکرز بود که بالای هزار اموزش توش ساخته بودم به اسم sajjad3011 ولی حیف ادمین سایتش عوض کرد
حالا سوالی بود کاری بود این شمارمه

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

---
سوالی بود بذارید
نظر خصوصی نذارید
پاسخش سخته
دوست داشتید شماره بذارید تو واتساپ یا ایتا یا .... گروه بزنیم.
09358077198

بایگانی
پیوندها

منبع:gameover.blog.ir


نویسنده :alimka
منبع:http://www.crydev.ir/thread79.html

برای اینکه بتونیم از این کد ها استفاده کنیم ابتدا باید دوتا شی ایجاد کنیم . مثلا دو مکعب ایجاد می کنیم به نام Enemy و Player.


حالا یک فایل سی شارپ با نام EnemyAI ایجاد می کنیم ( توجه کنید که حتما اسمش این باشه ). کد زیر رو توش کپی می کنیم.

using UnityEngine;
using System.Collections;
 
public class EnemyAI : MonoBehaviour {
    public Transform target;
    public int moveSpeed;
    public int rotationSpeed;
    public int maxdistance;
     
    private Transform myTransform;
     
    void Awake(){
        myTransform = transform;
    }
 
 
 
 
    void Start () {
        GameObject go = GameObject.FindGameObjectWithTag("Player");
         
        target = go.transform;
     
        maxdistance = 2;
    }
     
 
 
    void Update () {
        Debug.DrawLine(target.position, myTransform.position, Color.red); 
         
 
 
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
         
        if(Vector3.Distance(target.position, myTransform.position) > maxdistance){
        //Move towards target
        myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
     
        }
    }
}


فایل رو سیو می کنیم و به شی Enemy مرتبطش می کنیم و شی Player رو به عنوان هدف بهش معرفی کرده و مقادیر سرعت حرکت سرعت چرخش و میزان فاصلشو با شی مورد نظر مشخص می کنیم.

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

 

using UnityEngine;
using System.Collections; 
public class PlayerHealth : MonoBehaviour {
    public int maxHealth = 100;
    public int curHealth = 100;
     
    public float healthBarLength; 
 
    void Start () {
    healthBarLength = Screen.width / 2;
    }
 
    void Update () {
    AddjustCurrentHealth(0);
         
    }
     
     
    void OnGUI(){
    GUI.Box(new Rect(10, 10, healthBarLength, 20), curHealth + "/" + maxHealth);    
    }
     
    
    public void AddjustCurrentHealth(int adj) {
      curHealth += adj; 
         
        if(curHealth < 0)
            curHealth = 0;
         
        if(curHealth > maxHealth)
            curHealth = maxHealth;
         
        if(maxHealth < 1)
            maxHealth = 1;
         
        healthBarLength = (Screen.width / 2) * (curHealth / (float)maxHealth);
    }
}

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

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

 

 

using UnityEngine;
using System.Collections;
 public class EnemyAttack : MonoBehaviour {
    public GameObject target;
    public float attackTime;
    public float coolDown;  
    void Start () {
        attackTime = 0;
        coolDown = 2.0f;
     
    }
    void Update () {
        if(attackTime > 0)
            attackTime -= Time.deltaTime;
         
        if(attackTime < 0)
            attackTime = 0;
         
         
    if(attackTime == 0) {
        Attack();
        attackTime = coolDown;
        }
     
    }
     
    private void Attack() {
        float distance = Vector3.Distance(target.transform.position, transform.position);
         
         
        Vector3 dir = (target.transform.position - transform.position).normalized;
        float direction = Vector3.Dot(dir, transform.forward);
         
                 
        if(distance < 2.5f) {
            if(direction > 0) {
         PlayerHealth eh = (PlayerHealth)target.GetComponent("PlayerHealth");
        eh.AddjustCurrentHealth(-10);
            }
        }
    }
}

بعد از اینکار فایل رو ذخیره کرده و به شی دشمن نسبت میدیم و شی هدف که همون Player هست رو بهش معرفی کرده و مقدار زمان حمله و زمان آماده سازی رو براش تعیین می کنیم.

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

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

برای پیاده سازی انیمیشن در این کد می تونید از توضیحات زیر استفاده کنید.
کد EnemyAI را با کد زیر عوض کنید و وقتی مقایسه کنید می فهمید که چطور میشه اجراش کرد.

 

 

using UnityEngine;
using System.Collections; 
  
public class EnemyAI : MonoBehaviour {
    public Transform target;
    public int moveSpeed;
    public int rotationSpeed;
    public int maxdistance;      
    private Transform myTransform;      
    void Awake(){
        myTransform = transform;
    }
    void Start () {
        GameObject go = GameObject.FindGameObjectWithTag("Player");     
        target = go.transform;      
        maxdistance = 2;
    }
        
    void Update () {
        Debug.DrawLine(target.position, myTransform.position, Color.red); 
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
          
        if(Vector3.Distance(target.position, myTransform.position) > maxdistance){
        //Move towards target
          animation.CrossFade("Walk", 0.2F);
          myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
      
        }
    }
}

و در آخر هم توضیحات مر بوط به کد نویسی این سه فایل.

اول کد EnemyAI .
خط اول دو فضای نام مربوط به یونیتی می باشد که باید فراخوانی شود تا بتوان کد نویسی کرد. یک مثال بارز در این باره ، فرض کنید شما می خواهید با پسردایی تان به کوه بروید اما تا دایی شما همراهتان نیاید و اجازه ندهد شما نمی توانید بروید هر چی هم اصرار کنید او نمی آید. در اینجا هم هرچه آن توابع و موجودیت ها را صدا کنید پاسخی داده نمی شود مگر آنکه فضاهای نام را فراخوانی کرده باشید.
خط 4 بصورت خودکار وقتی شما یک فایل سی شارپ ایجاد می کنید این کد در فایل قرار می گیرد و منظور آن این است که یک کلاس عمومی با نام EnemyAI از نوع MonoBehaviour . حال شاید بگویید مونو چیست ؟ مونو در برگیرنده بعضی از توابع و رخداد ها می باشد و باعث دسترسی خیلی بیشتر به اجزا می شود.
خط 5 یک متغیر عمومی از نوع Transform با نام Target ایجاد می کند. این شی موقعیت همان هدف موردنظر را بدست می آورد.
خط 6 یک متغیر عمومی از نوع صحیح با نام MoveSpeed که وظیفه اش تعیین سرعت دشمن می باشد ایجاد می کند.
خط 7 یک متغیر عمومی از نوع صحیح با نام RoationSpeed که وظیفه اش تعیین سرعت چرخش دشمن می باشد ایجاد می کند. که البته شما می توانید از این مورد استفاده نکنید. در صورت حذف کردن این متغیر باید کد را ویرایش نمایید.
خط 8 یک متغیر عمومی از نوع صحیح با نام Maxdistance که وظیفه اش تعیین میزان فاصله دشمن با کاراکتر می باشد را ایجاد می کند.
خط 10 یک متغیر خصوصی از نوع Transform با نام myTransform که موقعیت فعلی شی دشمن را تعیین می کند.
خط بعد یک تابع بدون مقدار بازگشتی یا تهی با نام Awake معرفی می کند. یکی از زیر مجموعه های MonoBehaviour می باشد. موقع فراخوانی می شود که قرار است رخدادی برای اولین بار صورت بگیرد مثال زمانی که کد تازه در حال لود شدن هست اما هنوز شروع نشده است.
در خط بعد موقعیت حال حاضر رو به متغیر myTransform انتقال می دهد و برای استفاده های بعد آماده می کند ، در اصل یک نمونه از مقدار transform شی دشمن می سازد.
در خط 20 یک تابع تهی دیگر با نام Start را فراخوانی می کند توجه کنید که این توابع بصورت پیش فرض وجود دارند و فقط شما از آنها باید بدرستی استفاده نمایید. تعریف اصلی این نوع توابع این است که آنها رخداد هستند مثال هنگامی که بازی شروع می شود یا هنگامی که به یک شی نزدیک می شود. تابع Start برای زمانی که بازی شروع می شود کاربرد دارد.
در خط 21 یک شی با نام go می سازد و به او دستور می دهد که موقعیت شی با نام Player را پیدا کند و در خود قرار دهد. در اینجا یک مثاله مهم وجود دارد که شما باید قبل از هر کاری یک تگ با نام Player تعریف کنید. تگ چیست ؟ تگ برای مشخص کردن گروه یا دسته ای از اشیاست که از طریق کد براحتی می توان به اشیا دسترسی پیدا کرد.
در خط 23 موقعیت فعلی شی Player را به شی مورد نظر نسبت می دهد.


در خط 26 یک تابع یا رخداد دیگر با نام Update فراخوانی شده است. این رخداد هنگامی که بازی در جریان است هر ثانیه یک بار مقادیر و دستورات درون خود را چک می کند.
در خط 27 یک خط از شی هدف تا شی دشمن با رنگ قرمز ترسیم می شود.
در خط 30 زاویه چرخش شی دشمن اینگونه تعیین می شود . از تابع Quaternion برای چرخاندن هر شی ای که فکر کنید استفاده می شود. در اینجا از خاصیت Quaternion.Slerp استفاده شده است که برای مشخص کردن زاویه چرخش از شی دشمن تا شی هدف و با سرعتی که با زمان ضرب شده و محاسبه می شود اما در اینجا یکم مقدار متفاوت می باشد ما در اینجا از یک خاصیت دیگر Quaternion.LookRotation استفاده کرده ایم که زاویه دید شی دشمن را مشخص می کند. Quaternion.LookRotation به این صورت محاصبه می شود که موقعیت شی هدف منهای موقعیت شی دشمن. در آخر سرعت چرخش در واحد زمان ضرب می شود. یک مقدار درکش سخت است اما با یکم تمرین متوجه خواهید شد.
خط 32 در خود یک شرط را داراست این شرط شامل این می شود که فاصله شی هدف و شی دشمن تا زمانیکه بزرگتر از اندازه ی فاصله ای که ما تعیین کرده ایم باشد دستوری که در خط 34 قرار دارد انجام شود.
خط 34 موقعیت شی دشمن را به این صورت تغییر می دهد که موقعیت شی در سمت جلو حرکت به سمت شی هدف در موقعیت x و y ضربدر سرعت حرکت که ما تعیین می کنیم ضربدر زمان حال حاضر که به ثانیه محاسبه می شود در اصل این مقدار ثانیه را محاسبه می کند.


خب توضیحات کد EnemyAI به پایان رسید حال نوبت به کد PlayerHealth می رسد.
قسمت های که در کد قبل توضیح داده شد دیگر توضیح داده نمی شود و مابقی کدها توضیح داده می شود.
در خط 5 یک متغیر عمومی با نام maxHealth از نوع اعداد صحیح با مقدار 100 تعریف شده که بیشترین میزان ممکنه خون هدف را نمایش می دهد.
در خط 6 یک متغیر عمومی با نام curHealth از نوع اعداد صحیح با مقدار 100 تعریف شده که میزان خون حال حاضر هدف را نمایش می دهد.
در خط 8 یک متغیر عمومی با نام healthBarLength از نوع اعداد اعشار تعریف شده که طول میزان خون هدف در نمایشگر را نمایش می دهد. منظور همان رابط گرافیکی که به کاربر قرار است نشان داده شود می باشد.
در خط 12 وقتی بازی شروع می شود نصف عرض صفحه نمایش به متغیر healthBarLength اختصاص می یابد.
در خط 17 تابع AddjustCurrentHealth که در چند خط بعد تعریف شده فراخوانی می شود و مقداری که برای آن ارسال می شود 0 می باشد. این مقدار از نوع عدد صحیح می باشد.
خط 22 یک رخداد یا تابع می باشد که فعالیت های مربوط به رابط کاربری یا نمایش بعضی از مقادیری که باید کاربر از آن مطلع باشد را در بر می گیرد. نام آن OnGUI می باشد.
خط 23 - به سیستم دستور داده می شود که یک جعبه با ایعاد 10*10 و مقایسی از صفحه نمایش که در کجای تصویر به نمایش درآید که ما در اینجا از متغیر healthBarLength برای مقدار عرض و از 20 برای مشخص کردن ارتفاع یا Height صفحه نمایش استفاده کرده ایم در آخر میزان خون باقی مانده از حداکثر خونی که داشته ایم را نمایش می دهیم.






در خط 27 تابع عمومی از نوع تهی با نام AddjustCurrentHealth با مقدار دریافتی int تعریف شده است.
در خط 28 مقدار متغیر curHealth با مقداری که در خط 17 برای تابع AddjustCurrentHealth جمع می شود. توجه کنید که آن مقدار ارسالی در متغیر adj ذخیره شده است.
در خط 30 این شرط بررسی می شود که آیا مقدار متغیر curHealth کوچک تر از 0 است یا خیر اگر کوچک تر بود کد خط 31 اجرا شود. این شرط بدان معناست که میزان خون حال حاظر منفی نباشد که اگر بود آنرا برابر 0 قرار دهد.
خط 31 مقدار curHealth را برابر صفر می کند.
در خط 33 شرط اینکه آبا مقدار متغیر curHealth بزرگتر از maxHealth است یا خیر بررسی می شود که اگر بزرگ تر بود کد خط 34 اجرا می شود. این به این معنی است که اگر میزان خون حال حاضر کاراکتر بیشتر از میزان حد تعیین شده باشد مثلا اگر از 100 بزرگتر بود برابر با 100 شود.
خط 34 مقدار متغیر curHealth را برابر مقدار متغیر maxHealth قرار می دهد.
خط 36 شرطی را بررسی می کند که آیا مقدار متغیر maxHealth از 1 کوچکتر است یا خیر. اگر این چنین بود خط 37 اجرا می شود.
خط 37 مقدار متغیر maxHealth را برابر یک قرار می دهد.
خط 39 - اگر در خاطرتان باشد کمی قبل تر گفتیم که متغیر healthBarLength میران خون هدف را در خروجی یا صفحه نمایش به کاربر نشان می دهد. در این خط میزان این متغیر برابراست با نصف عرض صفحه نمایش ضربدر میزان خون حال حاضر تقسیم بر بیشترین میزان خون.
توضیحات مربوط به کد PlayerHealth به پایان رسید و نوبت به کد EnemyAttack می رسد.
در خط 5 یک متغیر عمومی از نوع GameObject تعریف شده که شی هدف در ان تعریف می گردد.
خط6 - یک متغیر عمومی از نوع اعشاری تعریف شده و میزان زمان حمله را در خود نگهداری می کند.
خط7 - یک متغیر عمومی از نوع اعشاری تعریف شده که میزان زمان حمله بعد را در بر می گیرد.
خط12 - زمان حمله را صفر تعیین می کند.
خط13 - زمان زمان حمله بعد را 2 قرار می دهد.
خط19 - شرط ای این قرار است که اگر زمان حمله بزرگ تر از صفر بود کد خط 20 انجام شود.
خط20 - این کد یک واحد زمان از میزان زمان حمله کم می کند.
خط22 - اگر زمان حمله کمتر از 0 بود یعنی منفی باشد کد خط 23 اجرا می شود.
خط23 - این کد زمان حمله را 0 می کند.
خط26 - شرط چک می کند آیا زمان حمله برابر است با صفر یا خیر که اگر شرط برقرار باشد یعنی مصاوی صفر باشد کدهای خط 27 و 28 انجام می شوند.
خط27 - تابع Attack که دو سطر بعد به آن می پردازیم فراخوانی می شود.
خط28 - زمان حمله را برابر میزان زمان حمله بعد قرار می دهد.
خط33 - یک تابع از نوع خصوصی تهی با نام Attack تعریف می کند.
خط34 - یک متغیر اعشاری با نام distance تعریف می کند و مقدار آن برابر می شود با میزان فاصله شی هدف و شی دشمن. توجه کنید که این یک نتغیر مجلی بوده و سراسری نیست. متغیر محلی متغیری است که فقط در اینتابع قابل استفاده است و حتی برنامه اصلی هم به آن دسترسی نحواهد داشت.
خط37 - یک متغیر از نوع Vector3 ساخته و جهت حرکت را با منها کردن مکان فعلی شی هدف و مکان فعلی شی دشمن به دست آورده و آنرا نرمال سازی می کند. در صورتی که نرمال سازی انجام نشود عدد صفر باز می گردد.
خط38 - یک متغیر اعشاری با نام direction تعریف می کند و مقدار آن برابر است با دو محور برداری که حاصل متغیر dir و transform.forward که بیانگر جهت حرکت می باشد است و این جاصل را خصوصیت Dot برای ما بدست می آورد. این حاصل جهت حرکت را مشخص می کند.
خط41 - شرط این را بررسی می کند که اگر فاصله تا شی هدف کمتر از 2.5 بود دستور خط 42 اجرا شود.
خط42 - در این خط شرکت به این گونه می باشد که اگر جهت میزانش بزرگتر از صفر بود کد خط های 43 و 44 اجرا شود.
خط43 - در اینجا یک نکته مهم وجود دارد این کد به کد PlayerHealth که کمی قبل تر بررسی کردیم متصل شده و میزان خون شی هدف را برای ما در متغیر eh ذخیره می کند.
خط44 - در آخر میزان خون شی هدف 10 واحد کم شده و در همان کد PlayerHealth تغییرات اعمال می شود. تابع AddjustCurrentHealth از کد PlayerHealth فراخوانی می شود و مقدار -10 در کد اعمال می شود. فرض کنید مقدار دریافت شده اولیه 100 باشد وقتی این کد رخ می دهد 10 واحد از آن کم شده و مقدار 90 به آن باز گردانده می شود.
خب دوستان اینم از توضیحات مربوط به این کدها. امیدوارم به کارتون بیادو استفاده کنید. در ضمن اگر جایی رو متوجه نشدید جتما بگید تا براتون بیشتر توضیح بدم.اگه بد توضیح دادم ببخشید دیگه خیلی سریع جمع و جورش کردم.

 

اینم کراس فید crossFade

https://xip.li/gBaBcU

 

موافقین ۰ مخالفین ۰ ۹۴/۰۷/۰۵
مدیرکل

نظرات (۱۰)

من هر کاری می کنم این کد ها به هم میچسبن و من باید جدا کنم
پاسخ:
اول تو کانال ما عضو شو
بعدش بیا تو گروه تلگرام ما
۰۴ شهریور ۹۷ ، ۲۳:۵۰ رامتین بختیاری
سلام این کد اخر CrossFade چی هست ارور میده میشه راهنمایی کنید
پاسخ:
بیا گروه گیم اور تو کانال لینکش رو میذاریم جوین شو:
@gameoverblog
سلام خدمت دوستان عزیز خیلی ممنون بخاطر کد ها من میخام بیام توی کانالتون ولی نمیتونم لطفان لینگ کانال جدیدتونو بزارید

پاسخ:
ایدیتو بده اد کنم
@game_engine

سلام . الان کد سوم باعث میشه وقتی دشمن پلیر رو دید بره دنبالش؟ 

ببخشید تو خط پنجم باید دقیقا چی بنویسم؟ 

پاسخ:
بیا گروه تلگرام  تو کانال گذاشتم لینکو
gameoverblog

۲۹ دی ۹۹ ، ۰۱:۵۱ عرفان سراوانی

سلام واقعا دستتون درد نکنه ممنون که وقت گزاشتید و به ما هم یاد دادید من خیلی چیز ها از شما یاد گرفتم

پاسخ:
التماس دعا
۲۶ بهمن ۹۹ ، ۱۵:۵۸ ناصر علی رمضانی

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

پاسخ:
دو بعدی هم راحته. فقط باید فکر کنی توابع و متدهای مختلف و جدید و قدیمی رو بشناسی ازشون با فکر و در جای مناسب استفاده کنی. مثلا rayCast و سیستم بینایی . باید محور دو بعدی و سه بعدی رو بشناسی و و طبق کد بگی مثلا توی دو بعدی محور z نداریم با xy بازی کنی. بگی اگه مثلا فاصله یا Distance بین گیم ابجکت(جسم بازی) دشمن(enemy) و بازیکن(player) مثلا از مقدار 2 کمتر شد و از 1 بیشتر تیر بزنه اگه جلوشون مانعی نبود و دشمن پلیر رو دید(این دیدن رو با ری کست ایجاد می کنیم) .
بیاید تو گروه

سلام

واقعا مرسی که انقد زحمت کشیدی من عاشق اموزش شمام

دم شما گرم

پاسخ:
سلام
مرسی

سلام  و عرض ادب 

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

 

پاسخ:
سلام
یه متغیر مثلا به اسم دلخواه bazikon از نوع GameObject تعریف می کنی یا Transform فکر کنم از نوع Public یا عمومی .بعدش اسکریپت رو با ماوس می کشی می اندازی روی دشمن سپس دشمن رو انتخاب می کنی و در inspector یا کادر خصوصیات اشیای این جسم انتخاب شده،متغیر bazikon شما میاد. بعد جسم یا گیم ابجکت یا شی بازیکن یا پلیرت رو با ماوس می گیری از توی کادر اجزای صحنه(hierarchy) و رها می کنی روی این متغیر . یا کنارش یه دایره کوچک دایره توش یه نقطه هست. روی همون توی inspector کنار متغیر bazikon که ساختی بزنی یه لیست میاره از همون لیست می تونی بازیکن رو انتخاب کنی.
بعد اسکریپت نسبت داده شده به جسم دشمن رو باز می کنی و داخل ش با استفاده از اسم تعریف شده در اینجا همین bazikon می تونی بازیکن ات رو کنترل کنی و تموم دستورهای حرکت یا تغییر رنگ یا پرش یا حرکت و چرخش و غیره رو با استفاده از متدها یا کلاس هایی که بهت میده می تونی مدیریت کنی(می نویسی baizon و نقطه میذاری بعدش کلاس های مربوط رو نشونت میده)

یک سوال دیگه هم داشتم آیا ین کد ها برای بازی دو بعدی هم مناسب است

پاسخ:
هر جا z داشتیم میشه سه بعدی
z یعنی عمق
x واسه  چپ و راست و y واسه بالا پایین کردن هست . z هم برای حرکت جلو و عقب.(منفی بدی می یاد عقب مثبت بدی میره جلو)...

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی