我正在嘗試創建我自己版本的著名游戲《太空入侵者》。我使用 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 的值
這個問題可以考慮解決,謝謝
添加回答
舉報
0/150
提交
取消