Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Corona SDK
Code

Corona SDK: membangun permainan tak berujung Runner dari awal!

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Corona SDK: Build an Endless Runner Game From Scratch.
Build an Endless Runner Game From Scratch: Background Motion

Indonesian (Bahasa Indonesia) translation by Taufan Prasetyo Basri (you can also view the original English article)

Seri ini tutorial akan mengajarkan Anda bagaimana membuat tak berujung gaya berjalan permainan menggunakan Corona SDK. Gaya tak berujung yang menjalankan permainan akan menjadi permainan seperti rakasa Dash, Canabalt atau NinJump. Dengan terus bergulir sprite melalui adegan, itu menciptakan penampilan dunia yang sangat besar bahwa pengguna dapat berinteraksi dengan. Gaya permainan ini memiliki banyak manfaat: level dapat dibuat secara dinamis dan acak untuk memberikan lebih banyak replayability kepada pengguna, game dapat menjaga ukuran ingatannya tetap kecil karena aset dapat digunakan kembali, dan permainannya sederhana dan cepat memberikan gamer akses yang mudah ke yang cepat dan menyenangkan gameplay. Pada akhir dari seri ini, Anda akan membangun permainan berikut (menjadi lembut pada grafis-mendapatkan seorang desainer dan berbuat lebih baik!):

Corona SDK Final Preview

Namun, sebelum kita mulai pada gameplay kita akan mulai dengan dasar-dasar sangat. Jika Anda sudah familiar dengan teknik pemrograman umum, Corona SDK atau bahasa pemrograman lua maka Anda harus cukup nyaman untuk skim melalui tutorial pertama. Jika tidak, jangan khawatir karena kami akan membawa Anda melalui seluruh proses menciptakan aplikasi dari awal. Kami akan menjaga tutorial singkat, tetapi cukup teliti untuk memastikan bahwa Anda memahami apa yang sedang terjadi. Struktur dasar dari tutorial akan sebagai berikut:

  • Bagian 1: Persiapan: pengenalan, dasar-dasar dari the Corona SDK dan bahasa Lua, mendirikan proyek, dan dasar proyek Debugging
  • Bagian 2: Dasar bergulir: menambahkan latar belakang untuk permainan, menambahkan tanah, bergerak tanah, menambahkan paralaks bergulir
  • Bagian 3: Bekerja dengan lembar Sprite: menciptakan Sprite lembar, menghidupkan objek dengan seprai Sprite
  • Bagian 4: Membuat Pahlawan: Menambahkan Pahlawan kita, Membuat Pahlawan kita Berinteraksi dengan Dunia
  • Bagian 5: Menciptakan peristiwa sistem: dasar-dasar acara, mengubah tanah acara elevasi, menambahkan acara "Lubang"
  • Bagian 6: Menerapkan Sistem Penilaian: Menampilkan Lari Jarak, Menambahkan Pengganda Skor
  • Bagian 7: Menambahkan hambatan: menambahkan Destroyable rintangan (monster atau pecah dinding)
  • Bagian 8: Menambahkan sebuah peristiwa bos: menambahkan sebuah peristiwa bos permainan
  • Bagian 9: Menambahkan sistem Menu: menggunakan kelas Direktur untuk menambah sistem Menu permainan
  • Bagian 10: Mengirimkan Game: Mengirimkan Permainan kami ke App Store

Apakah ini terlihat seperti banyak pekerjaan? Ya, jadi mari kita mulai! Berikut adalah daftar dari apa yang Anda akan perlu untuk proyek ini:

  1. Corona SDK - besar lintas-platform SDK untuk membantu Anda memompa keluar aplikasi mobile cepat! Lisensi penuh biaya $200 USD dan memungkinkan Anda untuk mengkompilasi untuk iOS dan Android. Lisensi pro dikenakan biaya $ 350 USD dan memungkinkan Anda membuat aplikasi untuk kedua jenis perangkat. Jika Anda seorang mahasiswa di lembaga terakreditasi, Anda bisa mendapatkan mahasiswa harga mereka yang akan menurunkan harga oleh $100 USD sepotong. Jika Anda belum membeli langganan, Anda masih dapat mengunduh program dan menyelesaikan tutorial dengan versi uji coba. Jika Anda bukan seorang programmer, ini adalah tempat yang bagus untuk belajar beberapa dasar-dasar dan masih dengan cepat membuat aplikasi besar. Jika Anda seorang programmer, Anda akan kagum pada seberapa cepat Anda dapat membuat konten berkualitas dengan Corona SDK!
  2. Photoshop (komersial) atau Gimp (gratis). Faktanya, setiap program pengeditan grafis akan berfungsi untuk membuat gambar yang Anda perlukan untuk membuat gim Anda sendiri. Secara pribadi, saya merasa paling nyaman dengan Photoshop dan Gimp, tetapi menggunakan apa pun yang Anda seperti kebanyakan. Program lain yang Anda mungkin ingin mempertimbangkan untuk menggunakan adalah vektor grafis program seperti Adobe Illustrator (komersial) atau Inkscape (gratis). Grafis seri ini dibuat menggunakan kombinasi Inkscape dan Photoshop.

Corona SDK & Lua Basics

Bagi Anda yang tidak memiliki banyak pengalaman pemrograman, kita akan mulai dengan pergi ke beberapa dasar-dasar yang akan Anda lihat sepanjang jalan. Dengan cara itu Anda tidak memiliki pikiran Anda terpesona setiap kali kita menambahkan kode ke proyek. Hal pertama yang Anda akan ingin lakukan membuka simulator Corona SDK dan konsol Corona SDK (perintah terminal). Di Windows, jika Anda membuka simulator akan secara otomatis membuka konsol juga. Pada Mac OS, Anda akan perlu untuk secara manual membuka program yang disebut Corona Terminal. Sekarang bahwa kita memiliki orang-orang yang menjalankan, membuka editor teks favorit Anda. Di Windows, saya menggunakan Notepad ++ dan pada Mac OS saya pribadi lebih suka Unipad. Anda dapat menggunakan apa pun youwould editor seperti. Setelah Anda membuka editor favorit, buat file bernama main.lua. Setiap program yang bahwa kita membuat menggunakan Corona SDK akan memiliki ini sebagai titik awal. Setelah Anda memiliki simulator, konsol, dan editor teks yang terbuka, kami siap untuk memulai coding! Di sini adalah lari cepat turun beberapa hal dasar yang Anda akan melihat selama seri.

Kode komentar

Ini akan tampak seperti cara yang agak membosankan untuk memulai, tetapi sangat penting. Apa pun yang datang setelah karakter--pada baris yang sama tidak akan dijalankan oleh simulator. Hal ini penting karena memungkinkan Anda, pengembang, untuk menulis "komentar" ke dalam kode yang akan membantu Anda mengingat mengapa Anda melakukan sesuatu tertentu cara di lain waktu. Percayalah pada saya ketika saya mengatakan ini penting. Ada akan datang suatu waktu ketika Anda akan harus mengambil istirahat (mungkin Anda lelah bekerja pada proyek itu dan ingin bekerja di sesuatu yang lain selama beberapa hari, Minggu, atau bulan!) dan ketika Anda kembali ke sana Anda menyadari bahwa Anda tidak memiliki ide apa yang Anda coba untuk lakukan ketika Anda meninggalkan. Atau mungkin Anda menyelesaikan proyek dan setahun kemudian memutuskan Anda ingin memperbaruinya. Hal ini juga membantu orang lain yang melihat kode Anda untuk tahu persis apa yang Anda coba lakukan. Juga, kode baik komentar membuatnya mudah untuk lulus kode antara pengembang. Moral dari cerita ini adalah komentar kode sesederhana seperti menambahkan--untuk proyek Anda, sehingga melakukannya!

Cetak Laporan & Debugging

Hal pertama yang kita akan lakukan dalam kode kita adalah untuk belajar bagaimana untuk mencetak hal ke konsol (alias terminal). Mengapa menggunakan konsol ketika pengguna app akan pernah melihatnya? Itulah dimana kita melakukan debugging kami. Debugging adalah proses pengembang pergi melalui ketika ada "bug" (yaitu sesuatu yang salah) dalam kode mereka dan mereka perlu mengetahui mana. Buka file main.lua Anda dan menyalin berikut:

Inilah yang harus Anda lihat di konsol Anda:

Corona SDK Hello World

Dan itulah bagaimana Anda menulis hal-hal yang ke terminal. Nilai apa pun yang ingin Anda tonton dapat ditampilkan melalui perintah cetak. Cukup mudah, kan? Perhatikan bagaimana tidak muncul dalam simulator, dan berkomentar kode tidak muncul di terminal. Perintah lain akan terlihat di simulator dan pada perangkat, tapi cetak pernyataan hanya akan terlihat dari konsol. Kita dapat menggunakan ini untuk menyaksikan bagaimana alur permainan berkembang dan menemukan masalah yang mungkin kita miliki. Contoh berikutnya akan pergi ke lebih banyak cara untuk menggunakan pernyataan cetak.

Variables

Berikutnya up pada talenan adalah variabel. Variabel, seperti dalam matematika, mewakili sesuatu selain itu sendiri. Mereka adalah penampung. Sebagai contoh, mari kita mengatakan bahwa kita memiliki seperangkat informasi yang mewakili orang. Alih-alih menulis nama seseorang atau usia, kita dapat menetapkan nilai-nilai tersebut ke variabel sehingga kita dapat merujuk kepada mereka di kemudian hari. Pergi ke depan dan membuka main.lua lagi dan menghapus baris sebelumnya kode yang kita miliki dari contoh terakhir, dan menggantinya dengan kode berikut.

Ketika Anda menjalankan ini dalam simulator, Anda akan melihat output ini di konsol:

Corona SDK Variable

Ada 3 jenis variabel yang kami hanya menggunakan dasar: string (teks dalam tanda kutip), bilangan bulat (bilangan bulat), dan Boolean (true atau false). Ada pasti lebih jenis variabel, tetapi ini sudah cukup untuk membuat kita akan pergi. Salah satu hal yang menyenangkan tentang Lua adalah bahwa variabel diketik dengan lemah. Yang berarti bahwa Anda tidak perlu eksplisit mendeklarasikan variabel jenis apa hal ini, kompilator hanya tahu. Variabel akan digunakan sangat sering sehingga mendapatkan digunakan untuk mereka. Beberapa hal yang Anda akan melihat dan perlu tahu tentang variabel adalah apakah mereka lokal dan yang global, konsep yang disebut sebagai "lingkup". Kami akan menyentuh ini sedikit kemudian di.

Matematika dasar

Saya tahu apa yang Anda pikirkan: 'Bluh! Kita tidak perlu matematika untuk membuat permainan! ". Sayangnya, Anda melakukannya. Pada kenyataannya, Anda perlu banyak matematika untuk membuat permainan, jadi kita akan membahas bagaimana untuk melakukan beberapa dasar-dasar di lua. Kepala di belakang ke file utama kami, menghapus segala sesuatu dan menempatkan ini di tempatnya:

Layar Anda sekarang harus menunjukkan:

Corona Math

Sebagian besar dari apa yang kita lihat tidak hanya membangun dari apa yang telah kita lakukan. Satu hal yang baru adalah bahwa kami sekarang mencetak beberapa hal di dalam laporan cetak kami. Cetak laporan dapat sebagai sederhana atau kompleks seperti yang kita perlu bagi mereka. Kita bahkan dapat melakukan matematika kami dari kanan di dalamnya! Satu hal yang perlu diperhatikan ketika merantai pernyataan besar bersama adalah bahwa setiap elemen harus dikombinasikan dengan '..'. Matematika dapat dilakukan murni dengan tanda-tanda operatoring berbeda, namun bila Anda menambahkan string di sana Anda harus menggunakan '... '.

Di atas fungsi matematika dasar seperti penjumlahan dan pengurangan, ada banyak lebih banyak fungsi matematika yang akan berguna bagi kita yang sudah dibangun ke dalam Cocos2D. Untuk daftar lengkap yang dibangun dalam fungsi matematika, Anda bisa pergi di sini. Berikut adalah beberapa yang lebih umum yang akan Anda lihat:

Setiap permainan yang menggunakan jenis pengacakan akan menggunakan fungsi random, dan sering kali jika nomor tidak integer kita perlu mengubahnya ke integer sebelum kita mencetaknya. Juga, untuk dua fungsi pembulatan, tidak masalah seberapa dekat itu dengan satu bilangan bulat atau yang lain. Misalnya: math.floor(1.99999) akan masih putaran ke 1. Ini adalah hanya beberapa contoh untuk apa yang bisa mereka lakukan, dan untuk apa pun yang tidak dibangun di, Anda bisa lakukan sendiri dengan operasi matematika dasar dan sedikit latihan.

Jika/lain pernyataan

Jika Else laporan adalah apa yang dikenal sebagai pernyataan kontrol. Pernyataan kontrol memungkinkan kita untuk mengarahkan gerakan program atau aplikasi yang didasarkan pada kondisi tertentu. Misalnya, bagaimana jika kita memiliki permainan yang punya pintu itu bisa menjadi baik terkunci atau dibuka, ketika pemain mencoba untuk membuka pintu, kita perlu cara untuk memeriksa jika itu terkunci atau tidak. Ini dipenuhi dengan pernyataan if / else. Mari kita menjalankan contoh ini dan saksikan Bagaimana berperilaku. Kosongkan main.lua dan masukkan ini sebagai gantinya:

Ketika Anda menjalankan Anda akan melihat ini:

If/Else Corona SDK

Jadi, apa yang terjadi di sana? Dalam pertama jika pernyataan, kami memeriksa untuk melihat apakah door1 adalah unlocked. Itu, jadi kita dicetak pesan. Di kedua jika pernyataan, kami memeriksa untuk melihat jika door2 terkunci. Itu, jadi kami membukanya (mengubah variabel) dan memeriksanya lagi. Menggunakan jika/lain pernyataan dalam cara ini memungkinkan kita untuk membuat beberapa unsur permainan yang sangat menarik untuk semua jenis permainan. Jadi sekali lagi: hal yang penting untuk diingat untuk jika/lain pernyataan apapun yang ada di dalam kurung harus mengevaluasi untuk true atau false. Jika memang benar, maka itu akan menjalankan apa yang datang setelah "selanjutnya", jika tidak maka itu akan menjalankan apa yang datang setelah "lain" jika ada hal lain (Apakah Anda melihat bagaimana aku diam-diam menyelinap if pernyataan ke contoh... Shameless saya tahu!). Berikut adalah beberapa contoh bagaimana Anda dapat menggunakan jika pernyataan:

Selalu ada lebih banyak cara untuk menggunakan jika/lain pernyataan, tetapi untuk sekarang ini akan memberikan Anda ide yang baik bagaimana untuk memulai dengan mereka.

Fungsi

Topik berikutnya adalah sesuatu yang akan membuat hidup Anda jauh lebih mudah sebagai pengembang. Fungsi memberi Anda kemampuan untuk mengambil chuck kode; kelompok itu, nama, dan menyebutnya dari tempat lain dalam program Anda. Misalnya Anda memiliki bagian dari kode yang Anda tahu Anda akan memiliki untuk menjalankan lebih dari sekali. Contoh yang baik dari ini adalah memperbarui skor permainan. Alih-alih menulis kode yang akan diperlukan update Skor ribuan kali bahwa Anda akan ingin untuk meng-update, Anda dapat hanya menulis sekali dan kemudian menyebutnya dari lokasi yang tepat. Mari kita lihat bagaimana untuk melakukannya.

Pergi ke depan dan mencobanya dan pastikan bahwa Anda mendapatkan hasil ini:

Corona SDK - Learning Lua

Fungsi juga bagus karena Anda dapat mengelompokkan mereka semua dalam file terpisah (di luar main.lua), termasuk file, kemudian memanggil mereka seperti biasa. Ini
membantu menjaga kode Anda bersih dan terorganisir, yang terutama berguna pada proyek-proyek besar.

Loops

Loop membantu untuk sama alasan fungsi bagus: mereka membiarkan Anda mencapai banyak dengan sedikit jumlah kode. Untuk contoh ini berikutnya, mari kita
kembali kode yang sama yang kita sebelumnya. Hanya menghapus baris yang mana kita sebut updateScore(), dan menggantinya dengan bagian kode berikut:

Simpan yang aktif dan menjalankan kode Anda dan untuk hasil Anda sekarang harus memiliki output Anda terlihat seperti ini:

For Loop

Jadi, mengapa kita mendapatkan 10 bukan 1 waktu itu? Jawabannya adalah bahwa untuk loop yang kami sebut berlari segala sesuatu dalam melakukannya dan akhir 10 kali. Dalam hal ini, updateScore () dipanggil 10 kali. Jadi, mari kita melihat persis apa yang terjadi, karena ada beberapa hal penting untuk memperhatikan.

Ketika kami menciptakan untuk loop, ada 3 bagian Deklarasi, semua yang telah dipisahkan dengan koma. Bagian pertama digunakan untuk mendeklarasikan variabel. Kita bisa saja dengan mudah mengatakan untuk monyet = 1, 10, 1 karena satu-satunya bagian ini tidak inisialisasi variabel. Dalam kasus ini kita diinisialisasi variabel dan mengaturnya sama dengan 0. Dalam bagian kedua kita mengatakan untuk loop seberapa jauh untuk menghitung, dan di bagian ketiga kami memberitahu untuk loop berapa banyak untuk menghitung oleh. Mari kita lihat contoh sederhana lain. Menyingkirkan kode lama dan menggantikannya dengan ini.

Anda harus melihat sesuatu seperti ini:

for loop

Seperti yang Anda lihat, untuk loop hanya melakukan apa pun yang dalamnya kali sebanyak yang Anda butuhkan untuk. Sesuatu yang lain untuk melihat adalah bahwa variabel tidak mendapatkan berubah sampai setelah isi untuk loop telah dijalankan. Mudah-mudahan Anda dapat melihat bagaimana loop digunakan dalam pemrograman. Ada lebih banyak jenis loop daripada hanya untuk loop, semua yang berguna, tetapi mendapatkan nyaman dengan untuk loop dan Anda akan mampu mencapai paling Anda butuhkan. Meskipun yang lain loop (sementara dan melakukan-sementara) hanya sebagai mudah digunakan.

Obyek Tampilan

Tampilan objek yang persis apa yang mereka terdengar seperti: benda-benda yang ditampilkan pada layar Anda. Hampir segala sesuatu yang Anda lihat di layar Anda adalah objek tampilan. Corona SDK membuatnya bagus dan mudah bagi kita untuk mendapatkan barang-barang di layar. Satu-satunya hal yang harus Anda lakukan untuk mendapatkan sesuatu di luar sana adalah melakukan hal berikut:


displayObject = display.newImage("imageName")

Dalam rangka untuk benar-benar menunjukkan sesuatu pada layar, Anda perlu memiliki gambar bernama "imageName" dalam folder yang sama sebagai file main.lua Anda. Berikut adalah gambar cepat saya membuat dalam 4 detik jika Anda terlalu malas untuk membuat gambar cepat untuk diri sendiri. ;)

Corona Image

Jadi dalam contoh ini berikutnya, dalam folder yang sama sebagai file main.lua saya, saya memiliki folder bernama gambar. Dalam folder gambar saya memiliki gambaran yang bernama "man.png". Untuk mengakses file dari main.lua saya akan menggunakan newImage("images/man.png") seperti yang ditunjukkan di sini:

Sekarang pahlawan kita siap untuk ditampilkan di layar. Pergi ke depan dan jalankan dan itu akan terlihat seperti ini:

Ketika menetapkan x dan y nilai-nilai objek, sudut kiri atas layar (x = 0, y = 0) tanpa orientasi permainan. Juga perhatikan bahwa x dan y koordinat objek merujuk ke pusat objek. Jadi menempatkan koordinat objek di (0,0) akan menempatkan gambar setengah dari layar. Sekarang karena pahlawan kita adalah objek, kita dapat menetapkan lebih banyak variabel untuknya sehingga kita dapat menyimpan semua informasi yang berkaitan dengan pahlawan kecil kita di. Contoh yang baik dari ini adalah x dan y koordinat untuk pahlawan. Jika Anda menambahkan sebuah pernyataan cetak setelah itu Anda telah ditugaskan nilai-nilai 2 tersebut dan mengatakan print(hero.x) akan mencetak nilai yang disimpan di hero.x. Mari kita pergi ke depan dan menambahkan beberapa variabel lain untuk pahlawan kita bahwa kita mungkin perlu nanti. Letakkan kode berikut di bawah kode yang ada dari contoh sebelumnya:

Menjalankannya dan Anda akan melihat ini di konsol Anda:

Corona functions

Cukup lurus ke depan, Anda dapat membuat anggota variabel menjadi apa saja yang Anda perlu bagi mereka. Hanya ingat untuk menggunakan baik dan konsisten konvensi penamaan yang akan membantu Anda sepanjang proyek Anda.

Kelompok

Hal lain yang Anda akan melihat digunakan beberapa tempat dalam kode disebut kelompok. Mengelompokkan barang-barang serupa memudahkan untuk melacak hal-hal. Katakanlah, misalnya, bahwa kita memiliki 3 jenis item di layar kita: orang baik, orang-orang jahat dan peluru 's. Seperti yang kita update permainan kita harus memperbarui setiap obyek individual, dengan kelompok-kelompok yang kita dapat menyederhanakan bahwa dengan mengatakan memperbarui segala sesuatu dalam kelompok dan program kami akan mengurus semuanya untuk kita. Mari kita lihat bagaimana untuk melakukannya. Silakan dan hapus semua kode kami sebelumnya dan ganti dengan ini:

Anda ouput pada terminal Anda akan terlihat seperti ini:

Corona SDK Groups

Singkatnya, kami pergi meskipun setiap grup, diperbarui kelompok kita ingin, dan mencetak hasilnya. Proses ini membuat memperbarui kumpulan data besar sangat mudah. Mudah-mudahan yang memberi Anda sedikit wawasan mengapa kelompok bermanfaat. Salah satu aspek penting dari kelompok-kelompok untuk menjaga dalam pertimbangan adalah bahwa bagaimana Anda memasukkan item ke dalam kelompok-kelompok akan menentukan urutan apa yang mereka tertarik. Sebagai contoh, katakanlah pada layar Anda memiliki latar depan, middleground, dan latar belakang. Anda ingin menempatkan latar belakang ke dalam kelompok pertama, kemudian middleground dan akhirnya memberikan latar depan. Lapisan terakhir akan selalu digambar di atas lapisan sebelumnya.

Timer

Bagian terakhir yang akan kita bahas dalam ini primer adalah "timer". Pengatur waktu cukup jelas. Mereka memungkinkan kita untuk melakukan 2 hal dasar. Yang pertama adalah mereka akan menunggu selama waktu tertentu, kemudian melakukan suatu tindakan. Yang kedua adalah mereka akan berjalan peristiwa tertentu untuk jumlah waktu yang ditentukan. Kedua dari mana yang akan Anda gunakan dalam permainan sepanjang waktu. Membersihkan segala sesuatu dan kemudian jalankan kode ini.

Ketika Anda menjalankan kode ini Anda akan melihat pernyataan cetak pertama segera di terminal, cetak pernyataan kedua (yaitu satu yang ditemukan di dalam fungsi afterTimer) seharusnya tidak muncul selama 3 detik. Jadi, Anda dapat melihat bahwa ada 3 parameter untuk fungsi ini. Parameter pertama adalah berapa lama Anda
ingin ada antara setiap kali timer dijalankan dalam milidetik. Yang kedua adalah nama fungsi yang ingin Anda jalankan ketika durasi pertama berakhir. Yang ketiga adalah jumlah waktu yang Anda inginkan fungsi untuk dijalankan. Jadi jika kita telah memasuki 5 untuk parameter terakhir kami akan mempunyai fungsi afterTimer menjalankan 5 kali masing-masing dengan 3 detik jeda di antara. Jika Anda ingin sesuatu untuk terus berjalan selamanya, hanya menempatkan 1 untuk parameter terakhir. Ini berguna untuk hal-hal seperti fungsi pembaruan yang perlu terus memperbarui game Anda.


Membungkus

Konsep-konsep yang disajikan dalam tutorial ini tentu saja tidak semua yang akan Anda lihat dalam proyek seri, tapi mudah-mudahan tutorial ini sudah cukup kecelakaan kursus yang Anda akan merasa nyaman dengan segala sesuatu yang muncul dalam posting berikutnya. Jadi, terus berlatih dan belajar dan Anda akan siap untuk bagian berikutnya yang mana kita masuk ke dalam gameplay aktual. Jika Anda memiliki pertanyaan tentang apapun atau saran suara di komentar!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.