اطلاعیه

Collapse
هیچ اطلاعیه ای هنوز ایجاد نشده است .

دوره آموزش swift - درس ۱۷: ساخت یک بازی ساده برای برنامه نویسی شی گرا

Collapse
X
 
  • فیلتر
  • زمان
  • نمایش
پاک کردن همه
new posts

  • دوره آموزش swift - درس ۱۷: ساخت یک بازی ساده برای برنامه نویسی شی گرا

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


    این بازی که فقط در حالت Landscape نوشته خواهد شد شامل یک بازیکن و دو دشمن خواهد بود. هر کدام از کارکتر ها نیز دارای مقدار مشخصی جان hp و قدرت حمله attack power خواهد بوذ.

    پیش از هر چیزی, عناصر گرافیکی این بازی را از اینجا دانلود کنید, این عناصر گرافیکی صرفا برای آموزش در دسترس است اما برای استفاده تجاری باید آن ها را از سایت cartoonSmart.com خریداری کنید. فعلا این تصاویر ثابت هستند اما در آموزش های بعدی, از انمیشن های گرافیکی تهیه شده از همان سایت را استفاده خواهیم کرد.


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

    در ابتدای کار باید بدانید که بهتر است یک کلاس مرجع به نام character ایجاد کنیم که کلاس player و enemy زیر مجموعه آن خواهند بود زیرا بازیکن ما و دشمن هایش عناصر مشترک زیادی دارند اما جدای از آن, دو دشمن نیز هر یک کلاسی برای خود برای معرفی مشخص هایشان دارند که هر دو کلاس زیر مجموعه کلاس enemy خواهد بود. تمامی کلاس ها در فایل های جداگانه سوئیف نوشته خواهند شد.

    در کلاس character نخست دو متغیر hp و attack power را به صورت private مشخص می کنیم و مقدار پیش فرضی نیز برای آنان در نظر می گیریم. به علت آنکه کلاس کارکتر کلاس مرجع است, تابع هایی کلی ای مانند اینکه چه موقع کارکتر خواهد مرد و یا اینکه پس از حمله و هر ضربه, از hp به مقدار attack power کم شود.

    کد:
    class character { private var _hp : Int = 100 var hp : Int { get { return _hp } } private var _attackPwr : Int = 10 var attackPwr : Int { get { return _attackPwr } } init(startingHp: Int, attackPwr: Int) { self._hp = startingHp self._attackPwr = attackPwr } func attemptAttack(attackPwr: Int) -> Bool { self._hp -= attackPwr return true } var alive: Bool { get { if hp <= 0 { return false } else { return true } } }
    کلاس بعدی متعلق به یک کلاس زیر مجموعه می شود که درباره player است. برای شروع کار نخست یک فایل جدید سوئیف می سازیم و یک کلاس به نام player که زیر مجموعه کلاس character ایجاد می کنیم.
    برای player نیز متغیر هایی معرفی می کنیم. اما هنگام ساخت یک initializer بدلیل اینکه در حال کار روی یک کلاس زیر مجموعه هستیم و می خواهیم به initializer کلاس مرجع عضو هایی اضافه کنیم از convenience init استفاده می کنیم.

    کد:
    class player: character { private var _name = "Player" var name: String { get { return _name } } private var _inventory = [String] () var inventory: [String] { get { return _inventory } } func addItemToInventory(item: String ) { _inventory.append(item) } convenience init(name: String, hp: Int, attackPwr: Int) { self.init(startingHp: hp, attackPwr: attackPwr) _name = name } }

    در ادامه می بایست در یک فایل جدید یک کلاس مربوط به دشمن ها را بسازیم. به این نکته توجه داشته باشید که کلاس enemy خود زیر مجموعه کلاس مرجع character است و در عین حال خود مرجع دو کلاس دیگر برای شخصیت های دشمن است. برای مرحع کلاس دشمن دو غنیمت در نظر میگیرم که پس از شکست آنها را به player بدهند. برای اینکه کدی بنویسیم که به صورت رندوم بین شماره صفر و یک در یک آرایه یکی را انتخاب کند از دستور arc4random_uniform استفاده می کنیم. کلاس enemy :

    کد:
    class Enemy: character { var loot: [String] { return ["Rusty Dagger","Cracked Buckler"] } var type: String { return "Grunt" } func dropLoot() -> String? { if !alive { let rand = Int(arc4random_uniform(UInt32(loot.count))) return loot[rand] } return nil } }

    در ادامه نیز دو کلاس برای دو دشمن با مشخصات مختلف ایحاد می کنیم. با استفاده از قوه تخیل و استفاده از اینترنت دو نام kimara و Devil Wizard رو برای دشمن ها انتخاب می کنیم
    دشمن اول Kimara است. برای دشمن اول یک سپر قوی تر در نظر میگیرم و می گوییم که اگر attackpower قهرمان ما بیشتر از قدرت سپر kiamra باشد ضربه وارد شود و گرنه ضربه ای وارد نخواهد شد. به همین دلیل تابع attemptAttack که در کلاس character معرفی کردیم با دستور override کامل می کنیم و می گوییم که تنها در صورتی که attackpwr بیشتر از قدرت سپر kiamra باشد تابع را براساس تابع اصلی در کارکتر دنبال کنیم. به همین دلیل از return super.atteptAttack استفاده می کنیم.

    دو کلاس مربوط به دشمن ها به شرح زیر است:


    کد:
    class Kimara: Enemy { let IMMUNE_MAX = 15 override var loot: [String] { return ["Tough Hide", "Kimara Venom", "Rare Trident"] } override var type: String { return "Kimara" } override func attemptAttack(attackPwr: Int) -> Bool { if attackPwr >= IMMUNE_MAX { return super.attemptAttack(attackPwr) } else { return false } } }

    کد:
    class DevilWizard: Enemy { override var loot: [String] { return ["Magic Wand", "Dark Amulet", "Salted Pork"] } override var type: String { return "Devil Wizard" } }
    حال نوبت به معرفی المان ها و شروع به کد نویسی منطق بازی است.

    در کد ها مورد جدیدی نیست و اگر درس های قبلی رو دنبال کرده باشید همه رو به خوبی متوجه خواهید شد. در غیر این صورت, در همین تاپیک یا گروه تلگرام این دوره سوال خودتون رو مطرح بفرمایید.
    نها موردی که می بایست اشاره کرد استفاده از کد های NSTimer است که در واقع برای یک تاخیر زمانی که در کیس ما ۲ ثانیه است ازش استفاده شده است


    کد:
    import UIKit class ViewController: UIViewController { override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBOutlet weak var printlbl: UILabel! @IBOutlet weak var playerHpLbl: UILabel! @IBOutlet weak var enemyHplbl: UILabel! @IBOutlet weak var enemyImg: UIImageView! @IBOutlet weak var chestBtn: UIButton! @IBOutlet weak var attachBtn: UIButton! var player: Player! var enemy: Enemy! var chestMessage: String? override func viewDidLoad() { super.viewDidLoad() player = Player(name: "Dark Knight", hp: 110, attackPwr: 15) generateRandomEnemy() playerHpLbl.text = "\(player.hp) HP" } func generateRandomEnemy() { let rand = Int(arc4random_uniform(2)) if rand == 0 { enemy = Kimara(startingHp: 50, attackPwr: 12) } else { enemy = DevilWizard(startingHp: 60, attackPwr: 15) } enemyImg.hidden = false } @IBAction func onChestTapped(sender: AnyObject) { chestBtn.hidden = true printlbl.text = chestMessage NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "generateRandomEnemy", userInfo: nil, repeats: false) } @IBAction func attackTapped(sender: AnyObject) { if enemy.attemptAttack(player.attackPwr) { printlbl.text = "Attacked \(enemy.type) for \(player.attackPwr) HP" enemyHplbl.text = "\(enemy.hp) HP" } else { printlbl.text = "Attack was unsuccessful!" } if let loot = enemy.dropLoot() { player.addItemToInventory(loot) chestMessage = "\(player.name) found \(loot)" chestBtn.hidden = false } if !enemy.alive { enemyHplbl.text = "" printlbl.text = "Killed \(enemy.type)" enemyImg.hidden = true } } }

    سورس کد این بازی را نیز می توانید از این لینک دانلود کنید
    i-phone.ir
    The Best or Nothing



    Twitter : Rouzbeh7000

  • #2
    درود
    بسیار سپاسگزارم از آموزش های مفید و کارآمدی که در اینجا به اشتراک می گذارید .

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

    با سپاس فراوان

    نظر

    صبر کنید ..
    X