พอดีว่าผมต้องทำ method GetDown เอาไว้ใช้เอง เพราะว่าหาใน doc แล้วมันไม่เจอ มีแต่ get value แบบต่อเนื่อง frame by frame
หลักการของมันก็คือจะ return true ก็ต่อเมื่อ state ก่อนหน้าไม่เป็นจริง แต่ state ปัจจุบันเป็นจริง ที่เหลือคือ return false ทั้งหมด
ตัวอย่าง
ตะกี้ยังไม่ได้กด key A แต่ตอนนี้กด key A แล้ว
แต่มันก็ไม่ได้ง่ายปานนั้น เพราะผมจะต้องเปลี่ยน state เดิมด้วย
ต่อจากตัวอย่างข้างบน
พอตอนนี้กด key A แล้วแต่ไม่ยอมปล่อยมือ ในระหว่างที่กด key A ค้าง ผมก็ไม่ควรได้ return value เป็น true เพราะถ้าได้ true มันก็คือกันกับ get value แบบต่อเนื่อง ใช่มะ
เราก็จะเห็นภาพคร่าวๆแล้วว่า method นี้มันทำงานประมาณนี้
- อัพเดต state เสมอ
- return true เมื่อ state ก่อนหน้าเป็น false และ state ปัจจุบันเป็น true
ทีนี้พอวิเคราะห์ดูดีๆ จะเห็นว่ามันไม่จำเป็นต้องอัพเดต state ตลอดเวลาหรอก เราแค่ไปอัพเดตมันตอนกด key A ครั้งแรก กับตอนปล่อย key A ก็ได้นี่
สุดท้าย ท้ายสุด method นี้มันก็จะทำงานแบบนี้
- อัพเดต state เมื่อ state ก่อนหน้า ไม่เท่ากับ state ปัจจุบัน
- return true เมื่อ state ก่อนหน้าเป็น false และ state ปัจจุบันเป็น true
ด้วยความมึนของผม ผมเขียนโค้ดออกมาเป็นแบบนี้
โค้ดผมเป็น c# นะ เผื่อวาน syntax ภาษาอื่นมันไม่เหมือนกัน
//
bool prev
bool current
if (!prev && current) {
prev = true
} else if (prev && !current) {
prev = false
}
//
พอเห็นมันมี if รุงรังขนาดนี้ก็เลยอยากลดโค้ดลง พอดีนึกถึง logical operator ได้พอดี ในเคสที่เราดูกันนี้มันจะเปลี่ยน state ก็ต่อเมื่อ prev กับ current ไม่เท่ากัน มันก็จะมี operator ตัวนึงที่จะได้ผลเป็น true เมื่อ value ทั้งสองฝั่งไม่เหมือนกันด้วย
มันก็คือ XOR นั่นเอง!!
พอรู้แบบนี้แล้วก็ต้องจัดเลย โอ้แม่เจ้า
//
bool prev
bool current
if (prev ^ current) {
prev = current
}
//
ซึ่งเอาจริงๆแล้ว มันเขียนแค่นี้ก็ได้คือกัน 555
//
bool prev
bool current
if (prev != current) {
prev = current
}
ผมควรไปนอนแหละ😴
ไม่มีความคิดเห็น:
แสดงความคิดเห็น