亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 2d 游戲:為什么變量在 KeyReleased 之外沒有改變?

Java 2d 游戲:為什么變量在 KeyReleased 之外沒有改變?

瀟湘沐 2022-06-04 11:08:05
我正在嘗試創建我自己版本的著名游戲《太空入侵者》。我使用 zetcode 作為參考點(不是直接復制和粘貼) http://zetcode.com/tutorials/javagamestutorial/spaceinvaders/但是我似乎有點卡住了。即關于 KeyAdapters 和 MVC 設計模式的使用。根據 zetcode 教程,當 KeyPressed 被按下時受保護的 int dx 發生變化,當它被釋放時再次發生變化,但是我沒有看到 KeyPressed 和 Keyreleased 方法之外的任何移動或值變化。我進行了一些簡單的檢查 1:“玩家”圖形是否在沒有按鍵輸入的情況下移動(基本上圖形更新有效)?- 是的,我將播放器中的“move()”方法更改為簡單地執行“x--;”并在屏幕 2 上明顯看到移動:值“dx”是否發生了變化?- 有點,從 Keypressed 方法,我可以使用 System.out.println(""+dx); 返回值并從 dx 更改的方法內部明顯地看到,而不是在此方法之外,這表明值更改僅在此方法的本地發生,在我看來這很奇怪。我向社區提出的問題如下:這是并發問題嗎(或者我應該說,2 個對存儲在內存中的“dx”值的引用,但只有 1 個引用正在更新,或者我的代碼中還有其他有趣的事情發生我失蹤了?package spaceInvaders;import java.awt.event.KeyEvent;public class Player extends  IngameObjects implements Commons {    private  int startX = 250;    private final int startY = 150;    public Player(){        initPlayer();    }    public void initPlayer(){        this.setX(startX);        this.setY(startY);    }    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public void move(){             this.x += dx;        if (x <= 2) {            x = 2;        }        if (x >= 400 - 2 * 10) {            x = 400 - 2 * 10;        }    }    public void keyPressed(KeyEvent e) {        int key = e.getKeyCode();        if(key == KeyEvent.VK_LEFT){            dx = -1;            System.out.println(""+dx);        }        if(key == KeyEvent.VK_RIGHT){}        if(key == KeyEvent.VK_ESCAPE){            System.exit(0);        }    }    public void keyReleased(KeyEvent e) {        int key = e.getKeyCode();        if(key == KeyEvent.VK_LEFT){            this.x = -1;        }        if(key == KeyEvent.VK_RIGHT){}    }} package spaceInvaders;    public class IngameObjects {        protected int x;        private int y;        protected int dx;           public int getY() {            return y;        }        public void setY(int y) {            this.y = y;        }    }
查看完整描述

1 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

感謝您的快速回復,非常感謝。經過 x 時間(由于尷尬而將其保留為 x)我實際上發現了一個問題,實際上是一個非常嚴重的問題。

1:在另一個擴展 JFrame 的類上復制 TAdapter 2:2 個類(GamePanel(擴展 JPanel)和類(名稱不佳)Main(擴展 JFrame)都具有 setFocusable(true);

關于文斯的回復,是的,你是對的,作為調試我自己的代碼的嘗試,我實際上將原來的 dx 替換為 x。顯然兩者都不起作用,這讓我懷疑其他地方存在編碼問題。

關于MadProgrammer的回復,謝謝,我對Key bindings不熟悉,好久沒編程了,這也是我制作自己版本的太空侵略者的原因,所以我不僅可以重新編程,而且提高我的知識,我會看看鍵綁定,即使你沒有指定 KeyListeners 有什么問題,我會研究差異。關于處置,是的,再次,不是很熟悉用途,我認為這是刷新圖形的另一種方式,我會研究一下。

總之,我哪里出錯了:

  • 在 JFrame 的專用類和 JPanel 中的另一個類中復制了 TAdapter

  • “焦點” setFocusable(true) 的重復請求;

  • 使用 KeyListener 而不是鍵綁定(不確定原因:需要研究)

  • 使用 dispose() 方法

  • 改變 x 而不是 dx 的值

這個問題可以考慮解決,謝謝


查看完整回答
反對 回復 2022-06-04
  • 1 回答
  • 0 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號