ฉันควรมีอินพุต / คีย์ในเกมจาวาขั้นสูงอย่างไร


9

ฉันเป็นโปรแกรมเมอร์ที่สอนตัวเองดังนั้นฉันจึงไม่ทราบวิธีที่เหมาะสมในการทำสิ่งต่าง ๆ ฉันสร้างเกมง่าย ๆ เช่นดาวเคราะห์น้อยและงู แต่ในเกมเหล่านั้นคุณสามารถปรับเปลี่ยนตัวแปรภายในฟังก์ชั่นหลักได้อย่างง่ายดาย นี่คือวิธีที่ฉันทำในเกม Asteroids ง่ายๆ:

/*
* key listener events
*/
public void keyReleased(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = false;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = false;
            break;

        case KeyEvent.VK_UP:
            accel = false;
            break;

        case KeyEvent.VK_1:
            cls = true;
            break;
        case KeyEvent.VK_ENTER:
            break;
        case KeyEvent.VK_SPACE:
            fire = false;
    }
}
public void keyTyped(KeyEvent K){}
public void keyPressed(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = true;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = true;
            break;

        case KeyEvent.VK_UP:
            accel = true;
            break;

        case KeyEvent.VK_1:
            cls = false;
            break;
        case KeyEvent.VK_ENTER:
            clearAllBullets();
            break;
        case KeyEvent.VK_SPACE:
            fire = true;
    }
}

ถ้าฉันจะสร้างเกมขั้นสูงขึ้น (ด้วยเมนูหลักตัวเลือกเกมหลักและอื่น ๆ ) ฉันจะป้อนคีย์ / เมาส์ได้อย่างไร

นอกจากนี้ถ้าฉันต้องไปเป็นผู้เล่นคนเดียวฉันควรใส่รหัสการเล่นเกมทั้งหมดไว้ในชั้นเดียวหรือไม่? มีวิธีในการใส่รหัสผู้เล่นเดี่ยวลงในคลาสที่แยกจากกันและมีการป้อนรหัสที่สำคัญยังคงปรับเปลี่ยนตัวแปรและเช่น?


+1 คำตอบของคุณทำให้ฉันได้เรียนรู้สิ่งใหม่จากคำตอบของ bearcdp ขอบคุณที่ถาม! =)
Marcouiller จะ

คำตอบ:


3

ฉันไม่มีความเชี่ยวชาญและฉันขอแนะนำให้แยกทั้งส่วนควบคุมและตรรกะธุรกิจ / เกม / เมนู (ตั้งชื่อ)

ฉันได้ตอบคำถามที่คล้ายกันในเรื่องที่เกี่ยวกับทิศทางของงูในเกมที่ออกแบบด้วยคลาส Java เป็นภาษาเชิงวัตถุฉันคิดว่าคุณสามารถเขียนคลาสและเนื้อหาที่เพียงพอได้ จากนั้นเมื่อคุณได้เขียนคลาสวัตถุของคุณถ้ามันเป็นเพื่อให้วัตถุของคุณต้องตอบสนองต่อคีย์และการคลิกเมาส์ฉันจะไปกับคลาส Controller ที่รู้ว่าสิ่งที่ปรากฏบนหน้าจอในปัจจุบันแล้วบอกวัตถุนี้สิ่งที่มันควร ทำขึ้นอยู่กับคีย์ที่ถูกกดหรือภูมิภาคที่ถูกคลิก

นี่คือลิงค์ไปยังคำถามที่ฉันบอกคุณเกี่ยวกับสิ่งที่ฉันตอบเกี่ยวกับการแยกการควบคุมออกจากตรรกะของวัตถุ นอกจากนี้ยังมีตัวอย่างโค้ดที่แสดงความคิดของฉัน

การย้ายเทพดาของฉันใน XNA โดยใช้คลาส

( แต่น่าเสียดายที่ไม่มีคำตอบที่ได้รับการยอมรับโดยยัง OP ดังนั้นเราจึงไม่ทราบว่าไม่ว่าจะแก้ไขความกังวลของเขา. นอกจากนี้ฉันมักจะออกแบบวิธีนี้และพบปัญหาในการทำเช่นนั้นเพื่อให้ห่างไกลไม่มี. )

ตอนนี้ฉันรู้แล้วมันติดแท็ก XNA แนวคิดหรือการออกแบบเป็นระดับสถาปัตยกรรมที่สูงกว่าเทคโนโลยีที่ใช้ดังนั้นการออกแบบนี้สามารถปรับให้เข้ากับไวยากรณ์ของ Java แนวคิดทั่วไปยังคงเหมือนเดิม =)

ฉันหวังว่านี่จะช่วยได้! ฉันยินดีที่จะช่วยเพิ่มเติมเมื่อฉันสามารถขอเพียง! =)


5

คำตอบของ Will จะแสดงให้คุณเห็นว่าอะไรคือความยืดหยุ่นและตรงไปตรงมาที่สุดและฉันขอแนะนำถ้าสิ่งที่คุณต้องการก็คือการป้อนข้อมูลการลงคะแนนแบบตรงไปข้างหน้า

แต่ถ้าคุณต้องการวิธีที่ง่ายในการตรวจสอบการกดปุ่มหลายแบบรวมกันในขณะที่หลีกเลี่ยงการสลับจำนวนมากและถ้ามีคำสั่งคุณสามารถใช้บิตค่าสถานะ enums

ฉันไม่รู้สิ่งที่คุณรู้เกี่ยวกับบิตเวคเตอร์ดังนั้นนี่คือภาพรวม: โดยทั่วไปคุณมีคลาส enum ที่แสดงถึงคีย์ที่เป็นไปได้ทั้งหมด แต่ละ enum ควรมีค่าที่สอดคล้องกับบิตในจำนวนเต็ม (เช่น: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014, ฯลฯ ) ( ลิงก์สำหรับทำสิ่งนี้ใน Java)

ขณะนี้เนื่องจากคุณสามารถส่งผ่านข้อมูลเกี่ยวกับคีย์มากถึง 32 (หรือ 64 ถ้าคุณใช้ longs) คุณสามารถมีตารางแฮชที่เชื่อมโยงบิตเวกเตอร์ (int หรือยาว) กับวัตถุที่ตกลงมาบางส่วนของ การเรียกใช้วิธีการเดียว, Do (), ที่ได้รับการเรียกเมื่อกดปุ่มการรวมกันที่เกี่ยวข้อง

ตอนนี้เมื่อคุณยกตัวอย่าง / เริ่มต้นวัตถุเครื่องเล่นของคุณหรือวัตถุเมนูของคุณคุณสามารถโทรหาผู้จัดการการป้อนข้อมูลบางอย่างและส่งผ่านเวกเตอร์บิตของการรวมกันที่สำคัญทั้งหมดที่คุณต้องการและเชื่อมโยงกับคลาสภายในที่ไม่ระบุชื่อ

// ... in your init code for Player

InputManager.map(
    KeyMap.A.val() | KeyMap.B.val() | KeyMap.C.val(), 
    new KeyComboCallback(KeyMap keys) {
        public void Do() {
           this.DoCrazyAwesomeComboAttack();
        }
    });

// ...  continue init

นี่คือความสะดวกและรวดเร็วใน C ++ และ C # แต่ Java enums นั้นพิเศษดังนั้นคุณอาจพบว่าสะดวกในการสร้างคลาส KeyCombination หรือสิ่งที่จะเก็บข้อมูลทั้งหมดโดยไม่ต้องกังวลเกี่ยวกับ enums แต่ความคิดยังคงเหมือนเดิม ฉันใช้สิ่งนี้ในเกม XNA และฉันชอบสถานที่นี้มาก คุณยังสามารถใช้เพื่อแยกพื้นที่ป้อนข้อมูลซึ่งมีประโยชน์สำหรับการเปรียบเทียบส่วนต่าง ๆ ของแป้นพิมพ์หรือแป้นเกมอย่างอิสระ (อาจเป็นประโยชน์สำหรับผู้เล่นสองคนในหนึ่งแป้นพิมพ์)


ฉันชอบโพสต์ของคุณโดยเฉพาะ "this.DoCrazyAwesomeComboAttack ();" XD เส้นทางของคุณดูเหมือนจะเป็นวิธีที่ดีกว่าสำหรับสิ่งที่ซับซ้อนดังนั้นฉันจะไปกับสิ่งที่ง่ายขึ้น ขอขอบคุณสำหรับความช่วยเหลือของคุณ!
Steven Rogers

+1 คำตอบที่น่าสนใจมาก! ฉันได้เรียนรู้จากคำตอบนี้และจะคอยสังเกตเมื่อฉันมีเวลามากขึ้นในการพัฒนาเกมงานอดิเรกของฉัน และขอบคุณที่บอกว่าคำตอบของฉันดีแม้ว่ามันจะเป็นเรื่องที่ง่ายกว่าซึ่งฉันจะไม่เถียงเนื่องจากฉันเป็นมือใหม่ใน GD =) ขอบคุณ!
Marcouiller จะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.