Làm thế nào tôi có đầu vào phím / chuột trong một trò chơi java nâng cao?


9

Tôi là một lập trình viên tự học, vì vậy tôi không biết cách thích hợp để làm việc. Tôi đã tạo ra các trò chơi đơn giản như tiểu hành tinh và rắn, nhưng trong các trò chơi đó, bạn có thể dễ dàng sửa đổi các biến trong các hàm quan trọng. Đây là cách tôi đã làm trong trò chơi Asteroid đơn giản của mình:

/*
* 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;
    }
}

Nếu tôi làm một trò chơi nâng cao hơn (với menu chính, tùy chọn, trò chơi chính, v.v.), tôi nên làm thế nào để nhập phím / chuột?

Ngoài ra, nếu tôi tham gia vào phần chơi đơn, tôi có nên đặt tất cả mã trò chơi vào một lớp không? Có cách nào để đặt mã trình phát đơn vào một lớp riêng biệt và bằng cách nào đó có đầu vào khóa vẫn sửa đổi các biến và như vậy không?


+1 Câu trả lời của bạn cho phép tôi học được điều gì đó mới từ câu trả lời của bearcdp. Cam ơn vi đa hỏi! =)
Will Marcouiller

Câu trả lời:


3

Tôi không phải là chuyên gia và tuy nhiên tôi đề nghị tách cả hai điều khiển và logic kinh doanh / trò chơi / menu (đặt tên cho nó).

Tôi đã trả lời một câu hỏi tương tự liên quan đến việc đưa ra chỉ dẫn cho một con Rắn trong một trò chơi được thiết kế với các lớp. Java là một ngôn ngữ hướng đối tượng, tôi đoán bạn có thể viết các lớp và công cụ đầy đủ. Sau đó, khi bạn đã viết lớp đối tượng của mình, nếu nó là để đối tượng của bạn cần phản ứng với một số phím và nhấp chuột, tôi sẽ đi với lớp Trình điều khiển biết những gì hiện đang hiển thị trên màn hình, sau đó cho đối tượng này biết nó nên làm gì làm tùy thuộc vào phím đã được nhấn hoặc khu vực đã được bấm.

Đây là liên kết đến câu hỏi tôi đã nói với bạn về điều mà tôi đã trả lời về việc tách các điều khiển khỏi logic đối tượng. Nó cũng bao gồm một mẫu mã minh họa suy nghĩ của tôi.

Di chuyển sprite của tôi trong XNA bằng các lớp

( Thật không may, chưa có câu trả lời nào được OP chấp nhận, vì vậy chúng tôi không biết chắc chắn liệu nó có giải quyết được mối quan tâm của anh ấy không. Bên cạnh đó, tôi luôn thiết kế theo cách này và không gặp rắc rối gì khi thực hiện cho đến nay. )

Bây giờ tôi biết, nó được gắn thẻ XNA. Ý tưởng hoặc thiết kế là một mức kiến ​​trúc cao hơn công nghệ được sử dụng, vì vậy thiết kế này có thể được điều chỉnh đơn giản theo cú pháp Java. Ý tưởng chung vẫn giữ nguyên. =)

Tôi hy vọng điều này sẽ giúp! Tôi sẽ vui lòng giúp thêm khi tôi có thể, chỉ cần hỏi! =)


5

Câu trả lời của Will cho bạn thấy điều gì có lẽ là linh hoạt và đơn giản nhất, và tôi khuyên bạn nên làm điều đó nếu điều bạn cần là bỏ phiếu thẳng vào đầu vào.

Nhưng, nếu bạn cần một cách dễ dàng để kiểm tra các tổ hợp nhấn nút khác nhau trong khi tránh số lượng lớn công tắc và nếu báo cáo, bạn có thể sử dụng enum cờ bit.

Tôi không biết những gì bạn biết về vectơ bit, vì vậy đây là một tổng quan: Về cơ bản, bạn có một lớp enum đại diện cho tất cả các khóa có thể. Mỗi enum nên có một giá trị tương ứng với một bit trong một số nguyên. (tức là: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014, v.v.). ( Liên kết để làm điều này trong Java).

Bây giờ, vì bạn có thể chuyển xung quanh thông tin về tối đa 32 (hoặc 64 nếu bạn sử dụng các phím dài), bạn có thể có một bảng băm liên kết các vectơ bit (int hoặc long) với các đối tượng rơi vào giao diện KeyComboCallback nào đó, chỉ chứa một gọi phương thức đơn, Do (), được gọi khi nhấn tổ hợp phím liên quan.

Bây giờ khi bạn khởi tạo / khởi tạo đối tượng trình phát hoặc đối tượng trình đơn của mình, bạn có thể thực hiện cuộc gọi đến một trình quản lý đầu vào nào đó và chuyển tất cả các vectơ bit kết hợp chính mà bạn muốn và liên kết chúng với các lớp bên trong ẩn danh.

// ... 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

Điều này thực sự nhanh chóng và tiện lợi trong C ++ và C #, nhưng các enum Java rất đặc biệt, vì vậy bạn có thể thấy thuận tiện hơn khi tạo lớp KeyCombination hoặc thứ gì đó sẽ lưu trữ tất cả thông tin này mà không phải lo lắng về enums. Nhưng ý tưởng vẫn vậy. Tôi đang sử dụng điều này trong một trò chơi XNA và tôi rất thích thiết bị này. Bạn cũng có thể sử dụng nó để phân tách các khu vực đầu vào, rất hữu ích để so sánh các phần khác nhau của bàn phím hoặc gamepad một cách độc lập (có thể hữu ích cho hai người chơi trên một bàn phím).


Tôi thích bài đăng của bạn, đặc biệt là "this.DoCrazyAw đũaComboAttack ();" XD. Con đường của bạn dường như là cách tốt hơn cho những thứ phức tạp, vì vậy tôi sẽ gắn bó với những thứ dễ dàng hơn. Cảm ơn sự giúp đỡ của bạn!
Steven Rogers

+1 câu trả lời rất thú vị! Tôi đã học được từ câu trả lời này và sẽ chú ý đến nó khi tôi có nhiều thời gian hơn để phát triển trò chơi sở thích của mình. Và cảm ơn vì đã nói rằng câu trả lời của tôi là tốt, mặc dù nó là cho những thứ đơn giản hơn, mà tôi sẽ không tranh luận, vì tôi là người mới bắt đầu học GD. =) Cảm ơn!
Will Marcouiller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.