1. Pengantar latar belakang permainan (omong kosong tertulis di depan):
Suatu hari di awal Mei, saya melihat situs web tertentu merekomendasikan game ini, Pongo. Saya terlihat cukup bagus dan mencobanya dengan iPad. Setelah bermain dua pertandingan, saya merasa itu adalah hal yang baik, dan itu cukup memuaskan, karena itu adalah permainan yang merupakan jenis tangan berhutang. Semua orang tahu itu.
Tetapi setelah beberapa saat, saya menemukan bahwa permainan tampaknya memiliki beberapa bug di iPad. Saya akan terjebak setelah bermain untuk sementara waktu dan saya hanya bisa memaksanya untuk mundur. Itu benar -benar memilukan, dan catatan itu masih menunggu untuk dipatahkan.
Apa yang harus dilakukan? Gagasan bahwa lebih baik bermain game daripada bermain game Anda sendiri muncul Evilly lagi, dan kemudian saya melemparkan pad ke memilukan teman saya. Saya diam -diam kembali ke komputer dan mulai menulis sesuatu yang saya tidak bisa macet.
Butuh sekitar dua jam untuk menuliskan kerangka dasar, dan kemudian melemparkannya ke Sinaapp dan mencobanya. Itu pada dasarnya yang terbaik untuk dimainkan dan kemudian mandi dan pergi tidur.
Ketika saya bangun keesokan harinya, saya menghabiskan waktu merancang antarmuka karena saya tidak ada hubungannya pada akhir pekan. Sayangnya, saya menemukan beberapa bug serius sendiri, dan akhirnya meluangkan waktu untuk memperbaikinya.
Akhirnya, permainan itu bernama "Pongo+" (klik saya untuk bermain di ponsel). Komputer tidak didukung untuk saat ini. Ngomong -ngomong, kode sumber diunggah di GitHub dan modul skor pengiriman telah dihapus.
2. Situs web uji coba game:
Pongo+ (hanya seluler): http://mypongo.sinaapp.com/
Github Open Source (Fork dipersilakan untuk membuat game lebih baik): https://github.com/chenreason/pongo/blob/gh-pages/index.html
3. Aturan game dan gameplay:
Mengklik pada layar akan mengubah arah gerakan bezel. Mengklik bezel akan mengubah arah bezel sekali, dengan tujuan memblokir bola -bola kecil bergulir dan mencegah mereka kehabisan lingkaran besar. Semakin lama waktu, semakin baik! Akhirnya, Anda dapat mengirimkan skor Anda sendiri untuk peringkat!
4. Teknologi yang digunakan dalam permainan:
Html, css, javascript, kanvas, php
5. Ide Desain Game:
a) Gunakan kanvas untuk menggambar antarmuka utama permainan. Bagian bawahnya adalah persegi panjang monokrom, ditutupi dengan lingkaran besar, dan lingkaran kecil dan penyekat ditarik pada lingkaran besar. Ada juga lingkaran super kecil dengan ukuran 1px di tengah -tengah baffle (untuk deteksi tabrakan).
b) Ada 8 arah pergerakan lingkaran kecil: bagian atas, bawah, kiri, kanan, kiri atas, kiri bawah, kanan atas dan kanan bawah.
c) Hanya ada dua arah pergerakan baffle, searah jarum jam dan berlawanan arah jarum jam.
d) Deteksi tabrakan tidak melibatkan penggunaan mesin, melainkan membuat penilaian jarak berdasarkan lingkaran kecil dan lingkaran super di tengah -tengah baffle, dengan demikian mencapai deteksi tabrakan sederhana.
e) Arah rebound setelah bola bertabrakan ditentukan, dan pengetahuan umum digunakan untuk mencantumkannya, dan ada 8 situasi secara total.
6. Kesulitan dalam Implementasi Game:
a) Deteksi tabrakan.
b) Pengatur waktu setIinterval timer dan apakah itu jelas dan menyeluruh.
c) Hubungan antara panjang siklus pengatur waktu dan pengalaman bermain game.
d) Masalah kelancaran game yang disebabkan oleh berbagai kinerja perangkat Android dan iOS.
7. Masalah yang ada dengan permainan:
A) Karena deteksi tabrakan adalah untuk membandingkan jarak tengah antara dua lingkaran dan melibatkan penggunaan penghitung waktu, karena interval timer yang sangat singkat, lusinan tabrakan sebenarnya terjadi di balik tabrakan yang terlihat oleh mata telanjang. Ini akan menyebabkan arah rebound bola yang sebenarnya berbeda dari teorema fisik yang sebenarnya. Setelah optimasi, probabilitas kejadiannya rendah, tetapi belum dihindari. Oleh karena itu, beberapa pemain akan menemukan bahwa jika lingkaran tidak mencapai tengah baffle secara akurat, itu dapat menyebabkan permainan gagal.
b) Karena fungsinya terlalu bertele-tele, efisiensi rendah, dan penggunaan pengatur waktu, pengalaman bermain game di Android berbeda dari iOS atau perangkat seluler lainnya (secara umum, iOS disebabkan oleh Android).
c) Daftar peringkat belum mencapai pembaruan real-time otomatis. (Basis data belum digunakan)
8. Pratinjau Antarmuka Game:
(Gambar 1 adalah edisi pertama, Gambar 2 telah menghapus tombol, Gambar 3 adalah edisi terakhir, dan Gambar 4 adalah daftar peringkat)
Gambar 1
Gambar 2
Gambar 3
9. Bagian dari kode sumber JavaScript:
Salinan kode adalah sebagai berikut:
var ifingame = 0;
var maxgrade = 0, grade = 0;
var grade1, grade2;
julukan var;
var gamespeed = 1.4; // kecepatan bola
var linespeed = math.pi/95; // lacak kecepatan garis
var crashdistanceFaild = -7; // parameter deteksi tabrakan
var crashdistancesuccc = 15
var fantanjuli = 7;
var themaxgradeline = 12.1;
fungsi getCookie1 (nama panggilan)
{
if (document.cookie.length> 0)
{
c_start = document.cookie.indexof (nama panggilan + "=")
if (c_start! =-1)
{
c_start = c_start + nickname.length + 1;
c_end = document.cookie.indexof (",", c_start);
if (c_end ==-1)
c_end = document.cookie.length;
return unescape (document.cookie.substring (c_start, c_end));
}
}
kembali ""
}
fungsi getCookie2 (mymaxgrade)
{
if (document.cookie.length> 0)
{
c_start = document.cookie.indexof (mymaxgrade + "=")
if (c_start! =-1)
{
c_start = c_start + mymaxgrade.length + 1;
c_end = document.cookie.indexof (";", c_start);
if (c_end ==-1)
c_end = document.cookie.length;
return unescape (document.cookie.substring (c_start, c_end));
}
}
kembali ""
}
fungsi setCookie (nama panggilan, nilai, mymaxgrade, maxgrade, kedaluwarsa)
{
var exdate = tanggal baru ()
exdate.setDate (exdate.getDate ()+kedaluwarsa)
document.cookie = nama panggilan + "=" + Escape (value) + "," + mymaxgrade + "=" + Escape (maxgrade) + ((kedaluwarsa == null)? "": "; Expires =" + exdate.togmtstring ());
}
function checkCookie ()
{
nickname = getCookie1 ('nickname');
maxgrade = parseInt (getCookie2 ('mymaxgrade'));
if (isnan (maxgrade) == true)
{
maxgrade = 0;
}
if (nickname! = null && nickname! = "")
{
alert ('Welcome'+Nickname+'Back!'+'/n'+"Jika Anda suka, silakan bagikan ~");
}
kalau tidak
{
nickname = prompt ('Harap masukkan nama panggilan Anda: (namanya terlalu lama dan akan ditampilkan tidak lengkap)', "")
if (nickname! = null && nickname! = "")
{
var maxgradestring = maxgrade.tostring ();
setCookie ('julukan', julukan, 'mymaxgrade', maxgradestring, 365);
}
}
}
var objPane = document.getElementById ("pane");
var ctxpane = objpane.getContext ("2d");
ctxpane.translate (150.150); // Diperlukan Terjemahan Titik Pusat Canvas
fungsi sendmail ()
{
if (grade2> themaxgradeline)
var max_grade = grade2;
window.location.href = 'index.php? max_grade ='+max_grade+'& nick_name ='+julukan;
/* {
<? php
$ grade = $ _ get ['max_grade'];
$ nickname = $ _ get ['nick_name'];
$ mail = Saemail baru ();
$ ret = $ mail-> quicksend ('[email protected]', $ grade, $ nickname, '[email protected]', 'mypongo');
$ mail-> clean ();
?>
}*/
Peringatan (nama panggilan+"Nilai Anda adalah:"+grade2+"dengan sukses ~");
}
var gamedirection = {
Shang: 1,
Xia: 5,
Zuo: 7,
Anda: 3,
Zuoshang: 8,
Zuoxia: 6,
YouShang: 2,
Youxia: 4,
Jam: 0,
Anticlock: 9,
};//arah
var canvas = {
Lebar: 300,
Tinggi: 300,
};//kanvas
var bigcircle = {// parameter lingkaran besar
x: 0, // Nilai koordinat sumbu x dari pusat lingkaran
Y: 0, // Nilai koordinat sumbu y dari pusat lingkaran
r: 150, // jari -jari lingkaran
C: 'RGB (255.255.255)',
}; // dayuan
var smallcircle = {// parameter smallcircle
x: 0, // Nilai koordinat sumbu x dari pusat lingkaran
Y: 0, // Nilai koordinat sumbu y dari pusat lingkaran
r: 12, // jari -jari lingkaran
C: 'RGB (204.105.106)',
Arah: gamedirection.xia,
}; // Lingkaran kecil
var line = {// Parameter dari garis baffle
x: 0, // Nilai koordinat sumbu x dari pusat lingkaran
Y: 0, // Nilai koordinat sumbu y dari pusat lingkaran
r: 150, // jari -jari busur
Mulai: (Math.pi/2-math.pi/16),
Akhir: (Math.pi/2+Math.pi/16),
C: 'RGB (55.55.55)',
Arah: gamedirection.anticlock,
}; // Baris pelacakan
var dot = {// parameter titik pelacakan
x: (Bigcircle.r*Math.cos (line.start+math.pi/16)), // Gunakan lingkaran besar sebagai asalnya
Y: (Bigcircle.r*Math.sin (Line.Start+Math.pi/16)),
R: 1,
} // Titik pelacakan
function changelinedirection ()
{
if (line.direction == gamedirection.clock)
{
line.direction = gamedirection.anterlock;
}
kalau tidak
{
line.direction = gamedirection.clock;
}
}
fungsi getDistance () {
var jarak = math.sqrt ((smallcircle.x)*(smallcircle.x)+(smallcircle.y)*(smallcircle.y));
jarak kembali;
} // Kembali ke jarak persegi antara bola kecil dan GetDistance pusat lingkaran besar ()
Fungsi ifgameover () {// menilai apakah itu di luar batas
if ((getDistance () - bigcircle.r)> 5)
Kembali Benar;
kalau tidak
mengembalikan false;
} // menilai apakah game berakhir ifgameover ()
Fungsi ifcrash () {// deteksi tabrakan
var dx = dot.x-smallcircle.x;
var dy = dot.y-smallcircle.y;
var dd = math.sqrt (dx*dx+dy*dy);
if (dd <crashdistancesuccc)
Kembali Benar;
kalau tidak
mengembalikan false;
} // deteksi tabrakan ifcrash ()
fungsi randomeback ()
{
var x = math.floor (math.random ()*3);
sakelar (smallcircle.direction) {
case gamedirection.shang:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.xia;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.zuoxia;
smallcircle.x = smallcircle.x-fantanjuli;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.youxia;
smallcircle.x = smallcircle.x+fantanjuli;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
case gamedirection.xia:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.shang;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.zuoshang;
smallcircle.x = smallcircle.x-fantanjuli;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.youshang;
smallcircle.x = smallcircle.x+fantanjuli;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
case gamedirection.zuo:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.you;
smallcircle.x = smallcircle.x+fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.youshang;
smallcircle.x = smallcircle.x+fantanjuli;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.youxia;
smallcircle.x = smallcircle.x+fantanjuli;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
Case gamedirection. Anda:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.zuo;
smallcircle.x = smallcircle.x-fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.zuoxia;
smallcircle.x = smallcircle.x-fantanjuli;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.zuoshang;
smallcircle.x = smallcircle.x-fantanjuli;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
case gamedirection.zuoshang:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.youxia;
smallcircle.x = smallcircle.x+fantanjuli;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.xia;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.you;
smallcircle.x = smallcircle.x+fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
case gamedirection.zuoxia:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.youshang;
smallcircle.x = smallcircle.x+fantanjuli;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.shang;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.you;
smallcircle.x = smallcircle.x+fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
Case gamedirection.youshang:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.zuoxia;
smallcircle.x = smallcircle.x-fantanjuli;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.zuo;
smallcircle.x = smallcircle.x-fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.xia;
smallcircle.y = smallcircle.y+fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
Case gamedirection.youxia:
{
Switch (x)
{
Kasus 0:
smallcircle.direction = gamedirection.zuoshang;
smallcircle.x = smallcircle.x-fantanjuli;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.zuo;
smallcircle.x = smallcircle.x-fantanjuli;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.shang;
smallcircle.y = smallcircle.y-fantanjuli;
merusak;
bawaan:
merusak;
}merusak;
}
bawaan:
{
merusak;
}
}
} // bola terbalik secara acak randomeback ()
fungsi smallcircledirection ()
{
sakelar (smallcircle.direction) {// bergerak sesuai dengan arah bola
case gamedirection.shang:
{
smallcircle.y = smallcircle.y-gamespeed;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
case gamedirection.xia:
{
smallcircle.y = smallcircle.y+gamespeed;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
case gamedirection.zuo:
{
smallcircle.x = smallcircle.x-gamespeed;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
Case gamedirection. Anda:
{
smallcircle.x = smallcircle.x+gamespeed;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
case gamedirection.zuoshang:
{
smallcircle.x = smallcircle.x-gamespeed*0.8;
smallcircle.y = smallcircle.y-gamespeed*0.8;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
case gamedirection.zuoxia:
{
smallcircle.x = smallcircle.x-gamespeed*0.8;
smallcircle.y = smallcircle.y+gamespeed*0.8;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
Case gamedirection.youshang:
{
smallcircle.x = smallcircle.x+gamespeed*0.8;
smallcircle.y = smallcircle.y-gamespeed*0.8;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
Case gamedirection.youxia:
{
smallcircle.x = smallcircle.x+gamespeed*0.8;
smallcircle.y = smallcircle.y+gamespeed*0.8;
grade ++;
if (grade> maxgrade)
{
maxgrade = grade;
newRecoder ();
}
addone ();
merusak;
}
bawaan:
{
merusak;
}
}
} // Bola menggerakkan smallcircledirection ()
/*Gambar lingkaran bawah*/
ctxpane.beginpath (); // dayuan
ctxpane.arc (bigcircle.x, bigcircle.y, bigcircle.r, 0, math.pi*2, true);
ctxpane.fillstyle = bigcircle.c;
ctxpane.fill ();
ctxpane.closepath ();
/*Gambar garis pelacakan bawah*/
ctxpane.beginpath ();
ctxpane.linewidth = 6;
ctxpane.strokestyle = line.c;
ctxpane.arc (line.x, line.y, line.r, line.start, line.end, false);
ctxpane.stroke ();
ctxpane.closepath ();
fungsi tapMe () // tapme
{
ctxpane.beginpath ();
ctxpane.strokestyle = "rgb (255.222.195)";
ctxpane.font = "80px papyrus";
ctxpane.stroketext ('tap',-95,30);
ctxpane.fillstyle = "rgb (255.205.105)";
ctxpane.font = "35px papyrus";
ctxpane.filltext ('me', 70,30);
ctxpane.closepath ();
}
function newRecoder ()
{
ctxpane.beginpath ();
ctxpane.fillstyle = "rgb (255,0,0)";
ctxpane.font = "18px papyrus";
ctxpane.filltext ("baru!", 58,80);
ctxpane.closepath ();
}
fungsi addone ()
{
grade1 = (grade/150) .tofixed (1);
grade2 = (maxgrade/150) .tofixed (1);
var mengatakan1 = "sekarang";
var mengatakan2 = "terbaik"
ctxpane.beginpath ();
ctxpane.strokestyle = "rgb (250.222.185)";
ctxpane.font = "60px papyrus";
ctxpane.stroketext (grade1, -45, -60);
ctxpane.stroketext (grade2, -45.100);
ctxpane.fillstyle = "rgb (255,0,100)";
ctxpane.font = "15px papyrus";
ctxpane.filltext (say1,58, -60);
ctxpane.fillstyle = "rgb (255,0,100)";
ctxpane.font = "15px papyrus";
ctxpane.filltext (say2,58.100);
ctxpane.closepath ();
}
function movetest () {
if (ifgameover ())
{
ifingame = 0;
if (maxgrade> parseInt (getCookie2 ('mymaxgrade')))
{
setCookie ('julukan', julukan, 'mymaxgrade', maxgrade.tostring (), 365);
}
clearInterval (timer);
tapme ();
}
kalau tidak
{
if (ifcrash ())
{
randomeback ();
}
ctxpane.clearrect (-150, -150.300.300); // Hapus layar
ctxpane.beginpath (); // dayuan
ctxpane.arc (bigcircle.x, bigcircle.y, bigcircle.r, 0, math.pi*2, true);
ctxpane.fillstyle = bigcircle.c;
ctxpane.fill ();
ctxpane.closepath ();
if (line.direction == gamedirection.clock) // track line searah jarum jam
{
line.start = line.start + linespeed;
line.end = line.end +linespeed;
ctxpane.beginpath ();
ctxpane.linewidth = 4;
ctxpane.strokestyle = line.c;
ctxpane.arc (line.x, line.y, line.r, line.start, line.end, false);
ctxpane.stroke ();
ctxpane.closepath ();
}
if (line.direction == gamedirection.anticlock) // pelacakan berlawanan arah jarum jam
{
line.start = line.start - linespeed;
line.end = line.end -inespeed;
ctxpane.beginpath ();
ctxpane.linewidth = 4;
ctxpane.strokestyle = line.c;
ctxpane.arc (line.x, line.y, line.r, line.start, line.end, false);
ctxpane.stroke ();
ctxpane.closepath ();
}
dot.x = bigcircle.r*math.cos (line.start+math.pi/32) // titik pelacakan
dot.y = bigcircle.r*math.sin (line.start+math.pi/32)
ctxpane.beginpath (); // titik pelacakan online
ctxpane.arc (dot.x, dot.y, dot.r, 0, math.pi*2, true);
ctxpane.fillstyle = smallcircle.c;
ctxpane.fill ();
ctxpane.closepath ();
smallcircledirection (); // smallcircledirection (); //
ctxpane.save ();
ctxpane.beginpath ();
ctxpane.arc (smallcircle.x, smallcircle.y, smallcircle.r, 0, math.pi*2, true);
ctxpane.fillstyle = smallcircle.c;
ctxpane.fill ();
ctxpane.closepath ();
ctxpane.restore ();
}
} // fungsi utama
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
tapme ();
var timer;
function startgame () {// mulai game
if (ifingame == 0)
{
ifingame = 1;
grade = 0;
var xx = math.floor (math.random ()*8);
/* switch (xx)
{
Kasus 0:
smallcircle.direction = gamedirection.shang;
merusak;
Kasus 1:
smallcircle.direction = gamedirection.xia;
merusak;
Kasus 2:
smallcircle.direction = gamedirection.zuo;
merusak;
Kasus 3:
smallcircle.direction = gamedirection.you;
merusak;
Kasus 4:
smallcircle.direction = gamedirection.zuoshang;
merusak;
Kasus 5:
smallcircle.direction = gamedirection.zuoxia;
merusak;
Kasus 6:
smallcircle.direction = gamedirection.youshang;
merusak;
Kasus 7:
smallcircle.direction = gamedirection.youxia;
merusak;
bawaan:
merusak;
}*/
smallcircle.direction = gamedirection.xia;
smallcircle.x = smallcircle.y = 0;
line.start = math.pi/2-math.pi/26;
line.end = Math.pi/2+Math.pi/26;
line.direction = gamedirection.anterlock;
clearInterval (timer);
timer = setInterval (MovTest, 10);
}
} // Mulai game startgame ()
fungsi opentop ()
{
window.location = "http://pongotop.sinaapp.com";
}
10. ditulis di akhir
Ini murni hemat diri. Pada hari ketiga setelah menulis, saya sibuk mengirimkan resume untuk menemukan magang dan saya tidak punya waktu untuk mengurusnya. Saya melemparkannya ke lingkaran teman saya untuk dimainkan teman -teman saya. Bulan ini telah berlalu dan saya menonton pertandingan ini lagi. Saya merasa itu seharusnya tidak mati begitu saja. Saya tidak memiliki keterampilan dan melakukannya dengan sangat baik. Karena itu, saya berharap artikel ini dapat membantu beberapa teman yang tertarik pada Pongo. Selain itu, saya berharap bahwa jika ada ahli di bidang ini dapat memberi saya nasihat jika dia melihatnya, dia menyambut saya untuk meninggalkan pesan untuk semua keraguan dan nasihat. Terima kasih!