01/10/2018, 17:27
Vì sao khi e Run thử thì khi nhấn 1 Phím bất kỳ hoặc ấn chuột thì Con Chim của e (hình vuông đỏ) không bay lên ạ
import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class ManHinh extends JFrame {
TapVe tapve=new TapVe();
ConChim conchim=new ConChim();
public ManHinh() {
setSize(280, 500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(400, 100);
add(tapve);
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
conchim.giamY();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
conchim.giamY();
}
});
}
public static void main(String[]args) {
ManHinh mh=new ManHinh();
}
}
```package RaTruong;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class TapVe extends JPanel implements Runnable {
ConChim conchim= new ConChim();
OngNuoc ongnuoc=new OngNuoc();
Background bg=new Background();
public TapVe() {
Thread threadTV =new Thread(this);
threadTV.start();
}
public void paint(Graphics g) {
g.setColor(Color.CYAN);
g.fillRect(0, 0, getWidth(), getHeight());
ongnuoc.ai(g);
g.setColor(Color.GRAY);
g.fillRect(0, 400, getWidth(), getHeight());
g.setColor(Color.GREEN);
g.fillRect(0, 430, getWidth(), getHeight());
conchim.pt(g);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
repaint() ;
ongnuoc.giamX();
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ongnuoc.lapdilaplai();
}
}
}
```package RaTruong;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;
public class OngNuoc extends JPanel {
private static int x1=175,x2=x1+140,x3=x2+140;
private static int h1,h2,h3;
private static boolean h11=false,h21=false,h31=false;
public void ai (Graphics g) {
g.setColor(Color.RED);
g.fillRect(x1, h1, 35, 175);
g.setColor(Color.RED);
g.fillRect(x2, h2, 35,175);
g.setColor(Color.RED);
g.fillRect(x3, h3, 35,175);
}
public void ngaunhien() {
Random rd=new Random();
if(h11==false) {
h1=rd.nextInt(200);
h11=true;}
if(h11==false) {
h2=rd.nextInt(200);h21=true;}
if(h11==false) {
h3=rd.nextInt(200);h31=true;}
}
public void ngaunhien1() {
Random rd=new Random();
if(h11==false) {
h1=rd.nextInt(200);
h11=true;}
h2=rd.nextInt(200);
h3=rd.nextInt(200);
}
public void giamX() {
x1--;
x2--;
x3--;
}
public void lapdilaplai() {
if(x1==-35) {x1=500;
}
if(x2==-35) {x2=500;
}
if(x3==-35) {x3=500;
}
}
}
```package RaTruong;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class ConChim extends JPanel {
int y=150;
public void pt(Graphics g) {
g.setColor(Color.RED);
g.fillRect(70, y, 26, 25);
}
public void tangY() {
y++;
}
public void giamY() {
y=y-50;
}
}
```vì sao e đã thêm 2 phương thức addKeyListener(),addMouseListener() khi e Run thử thì khi nhấn 1 Phím bất kỳ hoặc ấn chuột thì Con Chim của e ( hình vuông đỏ) không bay lên ạ
Bài liên quan
Không phải chim nào cũng bay được đâu bạn ạ.
Không phải ai cũng rảnh đọc code của bạn đâu bạn ạ.
Không bay được là như nào, hiện tượng ra sao, có vẫy cánh được không, hay là có lỗi gì ?
Có hiện tượng gì thì nói rõ ra chứ bạn, và debug rồi post đoạn code lỗi thôi bạn.
Chắc là chim cánh cụt rồi =))
dạ chỉ có 1 xíu code ở Class ManHinh thôi ạ ? a chỉ e với ạ ? chim của e chỉ là 1 cái hình vuông đỏ thôi ạ . code rất đơn giản thôi ạ . e đã code để ấn 1 phím bất kỳ trên bàn phím hoặc chuột để nó giảm tọa độ X ( để chim bay ) nhưng khi e Run thì khi nhấn chim lại không bay
Sau khi đọc qua code vì max rảnh thì mình có gợi ý về ý tưởng giúp con chim của bạn bay như sau:
Bước 1: Lắng nghe sự kiện ấn/click
Bước 2: Thay đổi tọa độ của con chim
Bước 3: Vẽ lại con chim tại vị trí tọa độ mới
(Nếu vẽ lại chim mới mà chim cũ vẫn còn thì xóa chim cũ đi, tại 1 thời điểm bạn chỉ nên có 1 con chim nếu không sẽ là dị nhân cmnr )
\ Code của bạn hiện tại chỉ gán lại giá trị tọa độ mà không vẽ lại.
Con chim mà bạn giảm Y với con chim mà bạn vẽ là 2 con chim hoàn toàn khác nhau, nên không thấy nó nhúc nhích là đúng rồi
Con chim bị bạn xua đuổi để bay lên được khai báo ở đây
con chim cần phải bay lên lại ở đây
PS: nếu được, bạn tìm đọc 1 số tài liệu về java convention và viết code lại theo convention. Bạn viết code không theo chuẩn nên rất khó theo dõi và hiểu nên làm khó cho các bạn muốn giúp bạn
dạ e code theo cái video này ạ . e cũng k hiểu sao Chim của Họ bay được còn của e thì không ạ .
Đọc title giật bắn người
Chắc chim của họ đủ tuổi nên bay được, chim của bạn còn non nên chưa bay được
Mình đang thắc mắc là không thấy Kích thước của ConChim là bao nhiêu (
setSize()
). Và không thấy bạn thêm ConChim vào đâu cả (add()
)vậy bây giờ a có thể chỉ e các sửa lỗi để đồng bộ hóa lại thành 1 con chim được không ạ ? vì e chưa học đc nhiều nên còn rất ngu ạ
e up lại code bỏ những class thừa đi .mong a chị chỉ giúp e lỗi sai chỗ nào .khi mà e Nhấn 1 phím từ bàn phím hoặc chuột mà Chim không bay ( Chim là 1 cái hình vuông màu đỏ ạ - bay là Hình vuông đó giảm tọa độ ạ )
chắc chắn là chim của ngta khác của bạn nên nó bay được còn chim của bạn thì không chứ sao.
Mình không cho rằng ai đó ngu hay không đâu, quan trọng là tinh thần học hỏi.
Cách đơn giản nhất là bạn làm cho vị trí y của ConChim thành static, nhưng cách này có hạn chế là con chim nào cũng y hệt nhau, con này ở đâu thì con kia cũng đi theo. Cách 2 đúng hơn là giết con chim ở class ManHinh đi và sử dụng con chim ở class TapVe thôi
Chim của bạn đó chỉ có 1 size thôi nên không cần khai báo size, và cũng là chim sống nhờ cơm của thằng khác (paint graphics được class khác gọi trực tiếp chứ không phải của swing component) nên không cần add luôn.
Ở đây bạn mới giảm giá trị y đi thôi chứ chưa hiển thị lên màn hình dẫn đến Chim đứng yên ==> Thêm 1 đoạn code hiển thị lên thôi
dạ ! ở Cách 1 e có đổi sang static int y=150; ở class con ConChim và con chim đã bay được ạ . tuy nhiên a bảo nếu đổi sang Static có những hạn chế .
còn ở Cách 2 e có thắc mắc 1 chút ạ , theo như anh bảo giết conchim ở Class ManHinh đi và sử dụng conchim ở class TapVe thì như vậy , ở Class màn hình sẽ không khai báo đối tượng ConChim nào nữa ( xóa dòng này ConChim conchim=new ConChim() ; ). nhưng nếu như vậy thì làm sao mà mình còn đối tượng conchim ở class ManHinh để khai báo phương thức này khi nhấn nút từ Bàn phím để Chim bay lên được ạ ?
Cảm ơn, thế mà không nhận ra
Cách sửa nhanh là thế này:
Xong.
À mà, nếu bạn thực hiện vẽ từ
TapVe
thì các lớpConChim
,OngNuoc
không cầnextends JPanel
làm gì.e cám ơn 2 anh Phát và Quân ạ. càng gặp nhiều lỗi thì càng phải tìm cách sửa cho bằng được, không sửa được thì thì phải đi hỏi cách sửa =)) càng nhiều kinh nghiệm và e lên tay hơn ạ. Đúng là không chặng đường nào trải hoa hồng cả