[英]Java 2d Game: Why is the variable not changing outside of KeyReleased?
我正在嘗試創建自己的版本的著名游戲《太空侵略者》。 我使用zetcode作為參考(不是直接復制和粘貼) http://zetcode.com/tutorials/javagamestutorial/spaceinvaders/
但是我似乎有點卡住了。 即關於使用KeyAdapters和MVC的設計模式。 根據zetcode教程,受保護的int dx會在按下KeyPressed時發生更改,並且在釋放時會再次發生變化,但是在KeyPressed和Keyreleased方法之外,我看不到任何移動或值更改。
我進行了一些簡單的檢查:1:“播放器”圖形是否在完全沒有按鍵輸入的情況下移動(基本上圖形更新起作用)? -是的,我將播放器中的“ move()”方法更改為僅執行“ x--;”,並在屏幕2上看到了明顯的運動:值“ dx”是否有變化? -Kinda,從Keypressed方法中,我可以使用System.out.println(“” + dx); 返回值並從dx更改的方法中看到該值,而在此方法之外看不到,這表明該值更改僅發生在此方法的本地,我認為這很奇怪。
我從社區中提出的問題如下:這是並發性的問題嗎(或者我應該說,對內存中存儲的“ dx”值的2個引用,但是只有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;
}
}
package spaceInvaders;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable{
private Player player;
private Thread animator;
private boolean isRunning;
public GamePanel(){
this.setBackground(Color.BLACK);
this.setDoubleBuffered(true);
addKeyListener(new TAdapter());
setFocusable(true);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
drawPlayer(g);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
public void drawPlayer(Graphics g){
g.setColor(Color.GREEN);
g.fillRect(player.getX(), player.getY(), 50, 50);
}
@Override
public void run() {
isRunning = true;
long startTime, timeDiff, sleepTime;
startTime = System.currentTimeMillis();
while(isRunning){
repaint();
gameUpdate();
timeDiff = System.currentTimeMillis() - startTime;
sleepTime = 5 - timeDiff;
try{
Thread.sleep(sleepTime);
}
catch(InterruptedException ex){
System.exit(0);
}
startTime = System.currentTimeMillis();
}
}
@Override
public void addNotify(){
super.addNotify();
startGame();
}
public void startGame(){
player = new Player();
if(animator == null || !isRunning){
animator = new Thread(this);
animator.start();
}
}
public void gameUpdate(){
player.move();
}
private class TAdapter extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
System.out.println(""+player.getX());
player.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
player.keyReleased(e);
}
}
}
感謝您的迅速反應,非常感謝。 經過x的時間(由於尷尬而保留為x)之后,我實際上發現了一個問題,實際上是一個嚴重的問題。
1:在擴展JFrame的另一個類上復制TAdapter 2:2個類(GamePanel(擴展JPanel)和類(名稱不正確)Main(擴展JFrame))都具有setFocusable(true);
關於文斯的答復,是的,您是正確的,作為調試我自己的代碼的嘗試,我實際上將原來的dx替換為x。 顯然,這兩種方法都不起作用,這使我懷疑其他地方存在編碼問題。
關於MadProgrammer的回復,謝謝,我不熟悉Key綁定,我已經很長時間沒有編程了,這就是為什么我制作自己的版本的Space Invaders的原因,所以我不僅可以重新開始編程,而且可以提高我的知識,我將研究鍵綁定,即使您沒有指定KeyListeners的問題,我也會研究它們之間的區別。 關於處理,是的,再次,不是很熟悉其用途,我認為這是刷新圖形的另一種方式,我將對此進行研究。
總之,我在哪里出錯了:
這個問題可以認為目前已經解決,謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.