2013-08-07 72 views
6

Tôi đã cố gắng tìm ra cách làm cho một hình ảnh hiển thị di chuyển theo đường chéo trong một cửa sổ applet.Cách di chuyển hình ảnh có thể nhìn thấy theo đường chéo?

Nếu bạn nhấn lên, xuống, sang trái hoặc sang phải hình ảnh (gif) di chuyển tương ứng, tuy nhiên nếu bạn cố gắng bấm hai phím cùng một lúc (lên và cùng một lúc chẳng hạn) hình ảnh chỉ di chuyển trong hướng bạn nhấn thứ hai (ngay cả khi bạn nhấn các phím cùng một lúc vẫn còn một sự chậm trễ hiển vi).

Có thể có một cách đơn giản để khắc phục điều này mà tôi không biết, hoặc có lẽ một cách giải quyết mà ai đó đã tìm ra ... Tôi đánh giá cao bất kỳ trợ giúp hoặc lời khuyên nào có thể được đưa ra.

Thank-you

Hero Class (lớp này định nghĩa những gì các "anh hùng" là, trong trường hợp này một người đàn ông đơn giản pixel, và những gì ông có thể làm)

import objectdraw.*; 
import java.awt.*; 

public class Hero extends ActiveObject { 

private DrawingCanvas canvas; 
private VisibleImage player; 

public Hero(Location initLocation, Image playerPic, DrawingCanvas aCanvas) { 
canvas = aCanvas; 

player = new VisibleImage(playerPic, canvas.getWidth()/3, 
     canvas.getWidth()/3, canvas); 
start(); 

} 
public void run() 
{ 

} 

public void move(double dx, double dy) 
{ 
player.move(dx, dy); 
} 
} 

HeroGame lớp (lớp này tạo ra các "anh hùng" và xác định vị trí, cũng như những gì các phím được sử dụng để làm cho anh ta di chuyển)

import objectdraw.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class HeroGame extends WindowController implements KeyListener { 
private Hero theHero; 
private Image playerPic; 
private Location initLocation; 
public void begin() { 
    playerPic = getImage("player.gif"); 
    canvas.addKeyListener (this); 
    this.addKeyListener (this); 
    requestFocusInWindow(); 
    theHero = new Hero(initLocation, playerPic, canvas); 
    } 
public void keyTyped(KeyEvent e) { } 
public void keyReleased(KeyEvent e) { } 
public void keyPressed(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     theHero.move(0,-5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     theHero.move(0,5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     theHero.move(-5,0); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     theHero.move(5,0); 
    } 
    } 
} 

Thank-you một lần nữa đã dành thời gian để đọc và hy vọng giúp đỡ.

Trả lời

0

Đây là tình huống khá bình thường trong các trò chơi chấp nhận đầu vào bàn phím. Vấn đề là trò chơi của bạn cần phải hành động trên tất cả các phím hiện đang được nhấn khi trò chơi liên quan (nghĩa là tất cả các phím mà sự kiện KEY_RELEASE chưa được kích hoạt).

KeyListener sẽ chỉ thông báo cho bạn cho phím cuối cùng được nhấn (và sẽ tiếp tục thông báo cho bạn cùng khóa đó nếu bạn nhấn giữ) để bạn cần theo dõi trạng thái cho các phím còn lại mình.

Để có ý tưởng về cách thực hiện điều đó, hãy tìm kiếm Bỏ phiếu bàn phím (here an example) một kỹ thuật phổ biến mà bạn không hành động ngay lập tức cho đầu vào của người chơi mà lưu trữ các lần nhấn phím xếp hàng tại các khoảng thời gian đều đặn (tức là trong vòng lặp trò chơi của bạn) để quyết định những phím nào được nhấn hay không và hành động tương ứng.

Tôi hy vọng điều này sẽ giúp

3

Tôi khuyên bạn nên sử dụng Swing (JApplet) và Bindings chính. Xem Motion Using the Keyboard để biết các sự cố khi sử dụng KeyListener cùng với giải pháp xử lý nhiều phím được nhấn cùng một lúc.

+0

Ok, cảm ơn bạn tôi sẽ kiểm tra những điều đó; nếu tôi nhận thấy nó là gì thì tôi chắc chắn sẽ đăng nó. – Greywarden

2

thay đổi

if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

để

if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

Và nó nên phản ứng trên cả hai phím.

+0

Nếu không thấy mã hiển thị, tôi không chắc chắn rằng nó sẽ hoạt động. Nếu người dùng truy cập lên và sang trái, đồng bằng chuyển động của ký tự vẫn là -5,0 – MadProgrammer

+0

Cảm ơn bạn, tuy nhiên kết quả vẫn giữ nguyên sau khi tôi thực hiện những thay đổi đó, mặc dù đề xuất của bạn có ý nghĩa đối với tôi. – Greywarden

+0

có 'theHero.move (0,5);' cho phép nhiều cuộc gọi? Giống như, nếu người chơi đang di chuyển, có thể gọi phương thức 'move()' cho 'theHero' lần thứ hai không? – bas

0

Những gì bạn cần làm là truy cập lớp AffineTransform cơ bản của hình ảnh và đặt đúng phương thức dịch. Điều đó sẽ cho phép bạn di chuyển hình ảnh anyway (bởi bất kỳ # độ, theo bất kỳ hướng nào) với một lần bấm phím (mà bạn liên kết với cuộc gọi đó).

đọc về vấn đề này: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

+0

Ngoài xoay vòng, mà tôi khá chắc chắn là không được hỏi, tôi không thấy làm thế nào AffineTranform sẽ giúp đỡ. Có gì sai với Graphics # drawInage và các hình ảnh chồng lên nhau đơn giản? – MadProgrammer

+0

.translate() phương pháp từ AffineTransform? –

+0

Vẫn không chắc chắn cách khắc phục sự cố OP: P – MadProgrammer

1

Thay vì tuyên bố if-else của bạn cho phím, bạn nên sử dụng một loạt các báo cáo if.

Thay vì đặt ra định hướng của hero s cho cả phong trào xy trong những if báo cáo, bạn chỉ nên được cập nhật phù hợp delta

Đối với (rất đơn giản) ví dụ ...

if (up) yDelta = -5; 
if (down) yDelta = 5; 
if (left) xDelta = -5; 
if (right) xDelta = 5; 

hero.move(xDelta, yDelta); 

Tôi cũng đồng ý với camickr