Vì sao khi nhấn 1 phím bất kỳ hoặc ấn chuột thì con chim (hình vuông đỏ) không bay lên?

package RaTruong;

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 ạ

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 =))

1 Like

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 :joy::joy:)

\ Code của bạn hiện tại chỉ gán lại giá trị tọa độ mà không vẽ lại.

1 Like

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

public class ManHinh extends JFrame  {
	TapVe tapve=new TapVe();
	ConChim conchim=new ConChim(); // Đây là con chim bạn bắt nó bay lên
	public ManHinh() {
		addKeyListener(new KeyAdapter() {	
		    public void keyPressed(KeyEvent arg0) {
			 conchim.giamY();
		   }
	 });
	 addMouseListener(new MouseAdapter() {
		public void mousePressed(MouseEvent arg0) {
			conchim.giamY();
		}
	 });
}

con chim cần phải bay lên lại ở đây

public class TapVe extends JPanel implements Runnable {
	ConChim conchim= new ConChim(); // Đây là con chim mà bạn vẽ

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

2 Likes

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 :smile:

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 :joy:

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 độ ạ )

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 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;
}
}

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

1 Like

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.

2 Likes

Ở đâ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 :wink:

1 Like

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 ạ ?

addKeyListener(new KeyAdapter() {
				@Override		
		public void keyPressed(KeyEvent arg0) {
			// TODO Auto-generated method stub
			 conchim.giamY();
			
		}
	 });

trình biên dịch sẽ báo lỗi ngay như thế này ạ !

Untitled

package RaTruong;

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();	
	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();	
}
}

Cảm ơn, thế mà không nhận ra :hugs:

Cách sửa nhanh là thế này:

public class ManHinh extends JFrame {
   ConChim conchim=new ConChim();
   TapVe tapve=new TapVe(conchim); //<=
//...
}

////

public class TapVe extends JPanel implements Runnable {
	ConChim conchim; // <=
	OngNuoc ongnuoc=new OngNuoc();
	Background bg=new Background();
	
public TapVe(ConChim c) {
        comchim =c; //<=
	Thread threadTV =new Thread(this);
	threadTV.start();
}

Xong.

À mà, nếu bạn thực hiện vẽ từ TapVe thì các lớp ConChim, OngNuoc không cần extends 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ả

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?