본 글의 예제에서는 Swing을 기반으로 Java로 구현된 사냥 및 사격 게임 코드를 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요.
구체적인 구현 코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 게임;
import java.awt.Graphics;
java.awt.Image 가져오기;
import javax.swing.JPanel;
공개 클래스 BackgroundPanel은 JPanel을 확장합니다.
개인 정적 최종 긴 serialVersionUID = 1L;
개인 이미지 이미지;// 배경 이미지
공개 BackgroundPanel() {
setOpaque(false);
setLayout(null);
}
공공 무효 setImage(이미지 이미지) {
this.image = 이미지;
}
/**
* 배경 그리기
*/
protected void PaintComponent(그래픽 g) {
if (이미지 != null) {
//이미지 너비
int 너비 = getWidth();
// 사진 높이
int 높이 = getHeight();
//그림을 그린다
g.drawImage(이미지, 0, 0, 너비, 높이, this);
}
super.paintComponent(g);
}
}
다음과 같이 코드 코드를 복사합니다.
패키지 게임;
import java.awt.Container;
import java.awt.event.*;
import javax.swing.*;
공용 클래스 BirdLabel은 JLabel을 확장하여 Runnable을 구현합니다.
개인 정적 최종 긴 serialVersionUID = 1L;
// 스레드의 수면 시간을 무작위로 생성합니다. 즉, 새의 이동 속도를 제어합니다.
private int sleepTime = (int) (Math.random() * 300) + 5;
개인 int y = 100;
private Thread thread; // 스레드를 멤버 변수로 사용합니다.
개인 컨테이너 상위;
private int Score = 15;//이 역할 유형에 해당하는 점수
/**
*시공방법
*/
공공 BirdLabel() {
감독자();
//새 아이콘 객체 생성
ImageIcon icon = new ImageIcon(getClass().getResource("bird.gif"));
setIcon(icon);//컨트롤 아이콘 설정
addMouseListener(new MouseAction());//마우스 이벤트 리스너 추가
//컨트롤 이벤트 리스너 추가
addComponentListener(new ComponentAction());
thread = new Thread(this);//스레드 객체 생성
}
/**
* 컨트롤의 컨트롤 이벤트 리스너
*/
개인 최종 클래스 ComponentAction은 ComponentAdapter를 확장합니다.
공개 무효 구성 요소 크기(최종 ComponentEvent e) {
thread.start();//스레드 시작
}
}
/**
* 컨트롤의 마우스 이벤트 리스너
*/
비공개 최종 클래스 MouseAction은 MouseAdapter를 확장합니다.
공공 무효 mousePressed(최종 MouseEvent e) {
if (!MainFrame.readyAmmo())// 총알이 준비되지 않은 경우
return;//아무것도 하지 않음
MainFrame.useAmmo(); // 총알을 소모합니다.
appScore(); // 보너스 포인트
destroy(); // 이 컴포넌트를 파괴합니다.
}
}
공개 무효 실행() {
부모 = null;
정수 너비 = 0;
노력하다 {
while (너비 <= 0 || 부모 == null) {
if (부모 == null) {
parent = getParent(); // 부모 컨테이너를 가져옵니다.
} 또 다른 {
width = parent.getWidth(); // 부모 컨테이너의 너비를 가져옵니다.
}
Thread.sleep(10);
}
for (int i = 너비; i > 0 && 상위 != null; i -= 8) {
setLocation(i, y);//이 구성요소의 위치를 오른쪽에서 왼쪽으로 이동합니다.
Thread.sleep(sleepTime);//잠깐만 자요
}
} 잡기(InterruptedException e) {
e.printStackTrace();
}
if (부모 != null) {
MainFrame.appScore(-score * 10); // 자연 파괴 시 포인트가 차감됩니다.
}
destroy();// 이동이 완료된 후 이 컴포넌트를 삭제합니다.
}
/**
* 본 성분을 용기에서 꺼내는 방법
*/
공공 무효 파괴() {
if (부모 == null)
반품;
parent.remove(this);//상위 컨테이너에서 이 파일을 제거합니다.
parent.repaint();
parent = null; // 이 문을 통해 스레드 루프를 종료합니다.
}
/**
* 포인트 추가 방법
*/
개인 무효 appScore() {
System.out.println("새가 맞았습니다.");
메인프레임.appScore(15);
}
}
다음과 같이 코드 코드를 복사합니다.
패키지 게임;
import java.awt.Container;
import java.awt.event.*;
import javax.swing.*;
공개 클래스 PigLabel은 JLabel을 확장하여 Runnable을 구현합니다.
개인 정적 최종 긴 serialVersionUID = 1L;
// 멧돼지의 이동 속도인 수면 시간을 무작위로 생성
private int sleepTime = (int) (Math.random() * 300) + 30;
private int y = 260;//컨트롤의 수직 좌표
private int Score = 10;//이 문자에 해당하는 점수
개인 스레드 스레드; // 내장 스레드 객체
private Container parent;//컨트롤의 상위 컨테이너 객체
/**
*시공방법
*/
공개 PigLabel() {
감독자();
ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));//멧돼지 사진 로드
setIcon(icon);//이 구성 요소의 아이콘을 설정합니다.
//마우스 이벤트 어댑터 추가
addMouseListener(새 MouseAdapter() {
// 마우스 버튼 누름을 처리하는 방법
공공 무효 mousePressed(최종 MouseEvent e) {
if (!MainFrame.readyAmmo())
반품;
MainFrame.useAmmo(); // 총알을 소모합니다.
appScore(); // 게임에 포인트를 추가합니다.
destroy(); // 이 컴포넌트를 파괴합니다.
}
});
//컴포넌트 이벤트 어댑터 추가
addComponentListener(새 ComponentAdapter() {
//컴포넌트 크기를 조정할 때
공개 무효 구성 요소 크기(최종 ComponentEvent e) {
thread.start();//스레드 시작
}
});
//스레드 객체 초기화
스레드 = 새 스레드(this);
}
공개 무효 실행() {
부모 = null;
정수 너비 = 0;
while (width <= 0 || parent == null) {//상위 컨테이너의 너비를 가져옵니다.
if (부모 == null)
부모 = getParent();
또 다른
너비 = parent.getWidth();
}
//이 구성요소를 왼쪽에서 오른쪽으로 이동합니다.
for (int i = 0; i < 너비 && 상위 != null; i += 8) {
setLocation(i, y);
노력하다 {
Thread.sleep(sleepTime);//잠깐만 자요
} 잡기(InterruptedException e) {
e.printStackTrace();
}
}
if (부모 != null) {
MainFrame.appScore(-score * 10); // 자연 파괴 시 포인트가 차감됩니다.
}
파괴하다();
}
/**
* 본 성분을 용기에서 꺼내는 방법
*/
공공 무효 파괴() {
if (부모 == null)
반품;
parent.remove(this);
parent.repaint();
parent = null; // 이 문을 통해 스레드 루프를 종료합니다.
}
/**
* 포인트 추가 방법
*/
개인 무효 appScore() {
System.out.println("멧돼지가 맞았습니다.");
메인프레임.appScore(10);
}
}
다음과 같이 코드 코드를 복사합니다.
패키지 게임;
정적 java.lang.Math.random 가져오기;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
공개 클래스 MainFrame은 JFrame을 확장합니다.
개인 정적 최종 긴 serialVersionUID = 1L;
개인 정적 긴 점수 = 0 // 점수
private static Integer ammoNum = 5;//총알 수
개인 정적 JLabel ScoreLabel;// 점수
개인 BackgroundPanel 배경패널;
개인 정적 JLabel ammoLabel;
개인 정적 JPanel infoPane;
/**
*시공방법
*/
공개 메인프레임() {
감독자();
setResized(false);//폼의 크기를 조정합니다.
setTitle("사냥 게임");
infoPane = (JPanel) getGlassPane(); // 유리 패널 가져오기
JLabel label = new JLabel("Load bullets...");//프롬프트 레이블 구성요소 생성
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setFont(new Font("楷体", Font.BOLD, 32));
label.setForeground(Color.RED);
infoPane.setLayout(new BorderLayout());
infoPane.add(label);//유리 패널에 프롬프트 레이블 구성 요소 추가
setAlwaysOnTop(true);//양식은 최상위 수준에 유지됩니다.
setBounds(100, 100, 573, 411);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundPanel = new BackgroundPanel(); // 배경이 있는 패널을 만듭니다.
backgroundPanel.setImage(new ImageIcon(getClass().getResource(
"배경.jpg")).getImage());//배경 이미지 설정
getContentPane().add(BackgroundPanel, BorderLayout.CENTER);
//마우스 이벤트 어댑터 추가
addMouseListener(new FrameMouseListener());
ScoreLabel = new JLabel(); // 점수를 표시하는 레이블 구성요소
ScoreLabel.setHorizontalAlignment(SwingConstants.CENTER);
ScoreLabel.setForeground(Color.ORANGE);
ScoreLabel.setText("점수:");
ScoreLabel.setBounds(25, 15, 120, 18);
backgroundPanel.add(scoreLabel);
ammoLabel = new JLabel(); // 라벨 구성 요소의 자동 수를 표시합니다.
ammoLabel.setForeground(Color.ORANGE);
ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
ammoLabel.setText("총알 수: " + ammoNum);
ammoLabel.setBounds(422, 15, 93, 18);
backgroundPanel.add(ammoLabel);
}
/**
* 추가 포인트 방식
*/
공개 동기화 정적 무효 appScore(int num) {
점수 += 숫자;
ScoreLabel.setText("점수: " + 점수);
}
/**
* 총알 섭취 방법
*/
공개 동기화 정적 무효 useAmmo() {
동기화됨(탄약수) {
ammoNum--;// 총알 수 감소
ammoLabel.setText("총알 수: " + ammoNum);
if (ammoNum <= 0) {// 총알이 0보다 작은지 확인
새로운 스레드(새로운 Runnable() {
공개 무효 실행() {
//프롬프트 정보 패널 표시
infoPane.setVisible(true);
노력하다 {
// 총알을 로드하는 데 1초
Thread.sleep(1000);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
ammoNum = 5;//총알 수를 복원합니다.
// 글머리 기호 수량 라벨의 텍스트를 수정합니다.
ammoLabel.setText("총알 수: " + ammoNum);
infoPane.setVisible(false);//프롬프트 정보 패널 숨기기
}
}).시작();
}
}
}
/**
* 총알이 충분한지 확인
*
*/
공개 동기화 정적 부울 ReadyAmmo() {
동기화됨(탄약수) {
탄약수 > 0을 반환합니다.
}
}
공개 정적 무효 메인(문자열 인수[]) {
EventQueue.invokeLater(새로운 Runnable() {
공개 무효 실행() {
노력하다 {
메인프레임 프레임 = new MainFrame();
프레임.setVisible(true);
프레임.시작();
} 잡기(예외 e) {
e.printStackTrace();
}
}
});
}
/**
* 게임을 시작하는 방법
*/
공개 무효 시작() {
새로운 PigThread().start();
새로운 BirdThread().start();
}
/**
* 양식에 대한 마우스 이벤트 리스너
*
*/
비공개 최종 클래스 FrameMouseListener는 MouseAdapter를 확장합니다.
공공 무효 mousePressed(최종 MouseEvent e) {
구성 요소 = backgroundPanel.getComponentAt(e.getPoint());
if (instanceof BackgroundPanel) {//패널을 클릭하면 글머리 기호도 차감됩니다.
MainFrame.useAmmo(); // 총알을 소모합니다.
}
/*
* if (BirdLabel 인스턴스에서) {//birdMainFrame.appScore(32)를 클릭하는 경우;//
* 보너스 포인트} if (instanceof PigLabel) {// 멧돼지를 클릭한 경우
* MainFrame.appScore(11);//추가 포인트}
*/
}
}
/**
* 돼지 캐릭터를 생성하는 스레드
*
*/
PigThread 클래스는 Thread {를 확장합니다.
@보수
공개 무효 실행() {
동안 (참) {
//멧돼지를 나타내는 레이블 컨트롤을 만듭니다.
PigLabel 돼지 = new PigLabel();
pig.setSize(120, 80);//컨트롤의 초기 크기 설정
backgroundPanel.add(pig);//배경 패널에 컨트롤 추가
노력하다 {
//스레드는 일정 시간 동안 무작위로 휴면 상태에 있습니다.
sleep((long) (random() * 3000) + 500);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 새 캐릭터를 생성하는 스레드
*
*/
클래스 BirdThread는 Thread {를 확장합니다.
@보수
공개 무효 실행() {
동안 (참) {
//새를 나타내는 레이블 컨트롤을 만듭니다.
BirdLabel 새 = new BirdLabel();
Bird.setSize(50, 50);//컨트롤의 초기 크기를 설정합니다.
backgroundPanel.add(bird);//배경 패널에 컨트롤 추가
노력하다 {
//스레드는 일정 시간 동안 무작위로 휴면 상태에 있습니다.
sleep((long) (Math.random() * 3000) + 500);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.