Bagaimana saya membuat game untuk Notepad



Saat membaca tentang solusi yang tidak biasa dari pengembang indie, saya menemukan emas. Berikut adalah artikel tentang game dalam editor teks. Seni, animasi, alur - semuanya sebagaimana mestinya.

Saya membuat game. Namun itu menyakitkan ( mungkin penulis ingin mengatakan itu menyakitkan, tapi saya bisa menggunakan opsi ini dengan sengaja - kira-kira ).


Proyek dapat diunduh di sini , dan kodenya dapat dilihat di Github .

Semuanya dimulai pada 2017 dengan pertanyaan: "Apakah mungkin membuat game di Notepad?" Lalu aku hanya nyengir. Tiga tahun telah berlalu. Setelah memikirkan bagaimana semuanya akan bekerja, dan memastikan itu nyata, saya memutuskan untuk membuat game ini.

Biasanya Anda menekan tombol dan sesuatu terjadi dalam permainan. Hit A, dan Mario melompat. Semuanya terkait dengan menerima informasi dan umpan balik. Game menerima input dan menampilkannya sendiri.

Dalam game untuk Notepad, akan ada perubahan pada input yang dibuat pengguna ke file, dan pada output, perubahan yang dibuat game ke file. Untuk melakukan ini, aplikasi melacak waktu file terakhir disimpan. Jika sudah berubah, game membaca konten file dan memasukkan data baru ke dalamnya.

Ada masalah: Notepad dari Microsoft tidak memeriksa apakah file telah dimodifikasi. Saya harus menyimpan file, tutup dan buka lagi. Membuat game semacam itu dimungkinkan, tetapi kedengarannya tidak terlalu menyenangkan. Saya harus mencari alternatif.

Saya dapat memahami kekecewaan Anda karena kenyataan bahwa permainan itu tidak dibuat di Notepad biasa. Judul saya dapat dijalankan di dalamnya - hanya sedikit proses yang membingungkan. Saya memutuskan untuk mengorbankan kesejukan proyek untuk membuat permainan lebih menyenangkan.



Alternatif


Saya harus mencari editor teks lain. Satu-satunya persyaratan adalah pembaruan file otomatis. Meskipun sedikit kemudian Anda akan melihat bahwa saya menggunakan fitur lain.

Pertama, Notepad ++ dan Sublime Text muncul di benak saya. Tetapi mereka sama sekali tidak terlihat seperti Notepad dalam penampilan, pesona proyek akan benar-benar menghilang. Plus, mereka bertanya kepada pemain apakah dia ingin memperbarui file. Ini jauh lebih baik daripada menutup dan membuka file, tetapi masih mengalihkan perhatian dari gameplay. Saya ingin file diperbarui secara otomatis. Kemudian Notepad2 menarik perhatianku. Dia hampir sempurna.

Editor dapat dikonfigurasi agar terlihat seperti MS Notepad, dan yang paling penting - memeriksa perubahan yang dibuat ke file. Tapi sama seperti Notepad ++ dan Sublime Text, Notepad2 menanyakan pemain apakah file perlu diubah. Untungnya, editor memiliki kode sumber terbuka, dan saya bisa memolesnya dengan sempurna.



Notepad2 ditulis dalam C. Saya sedikit terbiasa dengan bahasa ini, bahkan jika saya tidak bisa disebut ahli. Seorang programmer Javascript yang berpengalaman akan dapat membaca dan memahami esensi umum dari kode, tetapi tidak begitu mudah untuk memahami kode sumber Notepad2 untuk membuat perubahan yang diperlukan.

Sebagai permulaan, saya memutuskan untuk mencari teks dari kotak dialog: โ€œFile tersebut dimodifikasi oleh program eksternal. Reload file? " Ini adalah nilai dari variabel yang digunakan sebagai argumen dalam fungsi kotak dialog. Dan saya menemukannya.

if ((iFileWatchingMode == 2 && !bModified && iEncoding == iOriginalEncoding) ||
        MsgBox(MBYESNO,IDS_FILECHANGENOTIFY) == IDYES) {

Kode ini memeriksa untuk melihat apakah isi file telah berubah. Jika sudah berubah, jendela terbuka dan program memeriksa untuk melihat apakah pengguna telah memilih "Ya". Saya hanya perlu mengganti sepotong

MsgBox(MBYESNO,IDS_FILECHANGENOTIFY) == IDYES

ke TRUE, dan program mulai memperbarui file secara otomatis. Jadi saya membuat render berbasis ASCII. Masih membuat mesin yang cocok.

Gambar


Gim ini dibuat dengan cinta: Lร–VE adalah kerangka kerja sumber terbuka untuk gim 2D yang ditulis dalam Lua. Saya menggunakan platform ini selama bertahun-tahun dan bahkan menyusun tutorial . Untuk proyek ini, modul Lร–VE dari sistem file terutama digunakan karena menyediakan semua fitur yang diperlukan. Biasanya, Lร–VE membuat gambar yang kemudian ditampilkan di layar.

Saya membutuhkan hal yang hampir sama: output seni ASCII dalam file teks. Saya mulai dengan rumah dan burung, dan burung itu seharusnya terbang melalui file. Saya mengambil seni yang saya temukan di ASCII Art , tetapi hanya karya-karya asli yang digunakan dalam permainan (kecuali font).



Dan:



Mengunduh seni hanya membaca file.

house = love.filesystem.read("art_house.txt")
bird = love.filesystem.read("art_bird.txt")

Rumah digunakan sebagai latar belakang, jadi saya mulai dengan menggambar gambar ini di "layar". Layar dalam kasus ini adalah home.txt.

love.filesystem.write("home.txt", house)

Saya ingin burung itu bekerja dengan cara ini:

local x, y = 20, 40
drawArt(bird, x, y)

x adalah nomor kolom, y adalah nomor baris. Karena itu, ia memecahkan layar dan burung itu ke dalam daftar garis.

-- Get the current canvas
screen = love.filesystem.read("home.txt")

-- Create a table. A table is like an array.
screen_lines = {}

-- The lua pattern (.-)\n says capture everything until the \n (newline).
-- We add an \n to the end of the file so that it captures the last line as well.
for line in (screen .. "\n"):gmatch("(.-)\n") do
    table.insert(screen_lines, line)
end

Dengan burung itu melakukan hal yang sama. Sekarang kode yang menggambarkan burung itu seharusnya tumpang tindih dengan kode rumah. Inilah yang saya butuhkan:

  1. Temukan garis di mana burung itu harus ditarik.
  2. Cetak seluruh baris ke x.
  3. Cetak sisa garis, mulai dengan x + panjang seni dengan burung.
  4. Buat baris baru dengan bagian pertama, burung dan sisanya.
  5. Ulangi hal yang sama untuk semua baris lainnya.

Dalam kode, tampilannya seperti ini:

function drawArt(art, x, y)
    art_lines = getLines(art)

    -- In Lua, you can get the length of a table and string with #
    for i=1, #screen_lines do
        if i == y then
            for j=1 ,#art_lines do
                -- With string:sub(start, end) we can get part of a string
                local first_part = screen_lines[i]:sub(1, x - 1)
                local second_part = screen_lines[i]
                                    :sub(x + #art_lines[j], #screen_lines[i])
                screen_lines[i] = first_part .. art_lines[i] .. second_part
            end
        end
    end
end

Apa yang terjadi:



Mungkin, Anda memperhatikan bahwa burung itu persegi panjang - ruang digunakan dalam seni. Untuk memperbaiki situasi, saya menghitung jumlah spasi di awal setiap baris dan menambahkan nomor ini ke koordinat sehingga hanya seni yang akan digambar.

-- (%s) gets all the whitespace characters.
local spaces = art_lines[j]:match("(%s*)")
-- Remove the spaces from the line.
art_lines[i] = art_lines[i]:sub(#spaces + 1, #art_lines[i])
local first_part = screen_lines[i]:sub(1, x + #spaces - 1)
local second_part = screen_lines[i]:sub(x + #spaces + #art_lines[j], #screen_lines[i])
screen_lines[i] = first_part .. art_lines[i] .. second_part

Itu menjadi jauh lebih baik:



Animasi


Saya mulai menambahkan lebih banyak chip, misalnya, animasi:



Semua frame terletak di satu file dan dipisahkan oleh tag {{F}}. Tag ditentukan saat membaca dan memungkinkan Anda untuk mengatur urutan frame. Berkat ini, kami mendapatkan animasi klasik. Buat pengatur waktu dan gambar bingkai sesuai dengannya.

{{F}}
_   _ 
 'v'
{{F}}
      
--v--
{{F}}
      
_/v\_

Saya juga menerapkan output dari teks yang dicetak dan secara terpisah menampilkan layar, inventaris, dan jendela untuk memasukkan solusi. Ada satu masalah. Bagaimana permainan mengetahui bahwa suatu file telah dibuka? Ini adalah fitur kedua yang saya bicarakan sebelumnya.

Dalam kode sumber Notepad2, saya meresepkan bahwa file tersebut harus disimpan segera setelah dibuka. Permainan kemudian memeriksa untuk melihat apakah waktu hemat terakhir telah berubah. Jadi dia mengetahui bahwa file itu terbuka, dan dapat mengubahnya.

// At the end of the FileLoad function.
// If the file is not new, and the file has not been reloaded, save it.
if (!bNew && !bReload) {
    FileSave(TRUE,FALSE,FALSE,FALSE);
}

Akibatnya, saya mendapat kerangka kerja di mana Anda bisa bekerja. Saatnya membuat game.

Selama sembilan hari pengembangan (dilihat dari tanggal file gif dibuat), saya melakukan ini:



Jika Anda menjalankan game, maka Anda tahu bahwa itu tidak memiliki teks atau animasi yang dapat dicetak. Ada beberapa alasan untuk hal ini:

  • , HDD/SSD . . , .
  • . , , . , .
  • โ€” , . . . , , -, . . , , . , , , โ€” .


Saya sangat marah karena pengguna harus menyeret file ke jendela Notepad2 untuk memulai permainan. Dengan mengklik dua kali pada file, Notepad atau program default lain untuk membaca .txt dibuka. Itu mungkin untuk mendaftarkan perintah yang mengubah aplikasi untuk file seperti itu di Notepad2, tapi saya pribadi tidak akan suka jika beberapa jenis permainan melakukan tipuan seperti itu di komputer saya.

Mungkin mengembalikan pengaturan awal saat Anda menutup game? Itu mungkin, tetapi akan ada masalah jika game crash atau ditutup secara tidak terduga.

Semua keputusan tampaknya tidak cukup dibuktikan sampai saya menyadari bahwa alih-alih file .txt biasa dengan "x" yang lain dapat digunakan. Lebih tepatnya, karakter Unicode adalah U + 0445 (Cyrillic Small Letter Ha). Agar tidak bingung, saya beri nama file * .tXt. Akibatnya, semua file game dengan resolusi * .tXt, dan secara default dibuka di Notepad2.

assoc .tXt=tXt
ftype tXt=[directory]/.notepad/Notepad2.exe "%1"

Program default hanya dapat ditetapkan sebagai administrator. Jika Anda membuka game di bawah akun yang berbeda, file txt akan digunakan. Jika Anda membuka file di Notepad biasa, gim akan memberi tahu Anda bahwa Anda harus menyeret file ke jendela Notepad yang terbuka. Atau jalankan sebagai administrator sehingga terbuka dengan mengklik dua kali.

Motivasi


Padahal, semuanya dilakukan tiga tahun lalu. Apa yang saya lakukan sepanjang waktu? Contoh klasik kurangnya motivasi.

Awalnya, plotnya sedikit lebih lama dari sekarang. Naga itu membunuh orang tuamu, kau harus pergi ke pandai besi Ferdan, jadi dia menempa pedang. Diperkirakan bahwa pedang itu terbuat dari tiga bahan yang perlu dikumpulkan. Ini sangat meningkatkan volume permainan dan mendorong akhir pengembangan. Permainan itu tidak terlalu menghibur, dan saya meninggalkan proyek dua bulan kemudian.

Tapi saya selalu menyimpannya di kepala. Saya men-debug seluruh kerangka kerja yang memungkinkan saya untuk membuat game di Notepad, dan proyek itu tidak bergerak. Itu perlu untuk menyelesaikannya. Pada 2019, saya tidak menyelesaikan hampir semua proyek. Kekecewaan mendorong saya untuk memutuskan: untuk menyelesaikan yang belum selesai pada tahun 2020.

Dan ini dia. Saya memperpendek plot, memberi diri saya sebulan untuk semuanya (ternyata seminggu lebih lama) dan bergegas ke medan perang. Masih diterapkan untuk A MAZE. Penghargaan, masing-masing, batas waktu dijadwalkan untuk 2 Februari. Jadi ada motivasi.

Kesimpulan


Saya senang saya menyelesaikan game. Sungguh menakjubkan berapa lama proyek ini hanya mengumpulkan debu digital, tetapi pada akhirnya, sebulan sudah cukup. Game ini seharusnya tidak dibuat sebesar yang saya inginkan pada awalnya - proyek non-standar seperti itu hanya akan menunjukkan fitur yang dapat diimplementasikan di dalamnya.

Apa berikutnya? Game cat? Game di kalkulator? Saya tidak mungkin membuatnya. Tapi saya suka memikirkan game yang menggunakan platform non-tradisional.

All Articles