자바 매일 쿨 러 닝 게임 전체 코드 실현(소스 코드 첨부)
1.프로젝트 명칭:(RunDay)
2.기능 소개:
관문 돌파 게임,유저 로그 인 후 게임 입장 을 선택,키 보드 를 통 해 유저 의 상하 좌우 이동 을 제어,회피
장애물 과 금 화 를 먹 으 면 게이머 들 이 피 하 는 장애물 이 많 을 수록 쿨 링 거리 가 멀 어 지고 게이머 들 이 먹 는 금화 가 많 을 수록 득점 이 높다.
3.기능 모듈:
1,로그 인 인터페이스
사용자 이름(입력 상자,명문)비밀번호(입력 상자,비밀문서)로그 인,취소 단추
2,메뉴 선택 인터페이스
게임 시작 단추(그림 단추)도움말 단추 종료 단추
3.버퍼 로드 인터페이스
진 도 를 자동 으로 불 러 옵 니 다.불 러 온 후 다음 화면 으로 이동 합 니 다.
4.게임 메 인 화면
이동 하 는 배경 사진,동태 적 인 게이머,다섯 가지 장애물 이 지속 적 으로 나타 나 고 게이머 와 장애물 의 충돌,
일시 정지,계속 기능,유저 의 이동 기능
5,종료 인터페이스
플레이어 의 득점,쿨 링 거 리 를 획득 합 니 다.게임 을 계속 하고 메 인 메뉴 로 돌아 가 는 기능.
개발 자:Huey
버 전 번호:1.0
6.개발 시간:2020.11.16
개발 모드:MVC 모드
M:Model(데이터 층)은 실체 류 를 저장 합 니 다.
V:View(디 스 플레이 층)는 인터페이스 에 관 한 클래스 를 저장 합 니 다.
C:Controller(제어 층)는 관련 논리 층 코드 를 저장 합 니 다.
기업 급 프로젝트 명명 규범:
cn.sqc.runday.view
1.로그 인 인터페이스
인터페이스 기능 수요 도 는 다음 과 같다.
다음 에 우 리 는 관련 사진 소 재 를 가 져 오 는 준 비 를 좀 더 한다.
매일 쿨 하 게 달 리 는 그림(Image)자원 을 데스크 톱 에 압축 해제 한 후(Image 파일 은 다음 그림 과 같 습 니 다:)
Eclipse 에 복사 하려 면 src 를 누 르 고 Ctrl+V 를 누 르 십시오.
본 고 는 cn.sqc.runday.view 라 는 인터페이스 내용 을 실현 할 것 이다.
관련 코드 는 다음 과 같 습 니 다.
package cn.sqc.runday.view;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
/**
*
* @author Huey
* @date 2020-11-16
* :
*
*/
public class LoginFrame extends JFrame{
// ( )
JLabel userLabel;
// ( )
JTextField userField;
// ( )
JLabel userLabel2;
// ( )
JPasswordField userField2;
// 、 ( )
JButton Login,Cancel;
public LoginFrame() {// alt / ( )
userLabel = new JLabel(" ");
//
userLabel.setFont(new Font(" ",Font.BOLD,18));
userLabel2 = new JLabel(" ");
userLabel2.setFont(new Font(" ",Font.BOLD,18));
// :
userLabel.setBounds(20, 220, 100, 30);//x ,y ,
this.add(userLabel);// ,
userLabel2.setBounds(20, 280, 100, 30);
this.add(userLabel2);
//
userField = new JTextField();
userField.setBounds(80, 220, 100, 30);
//
userField.setBorder(BorderFactory.createLoweredBevelBorder());
//
userField.setOpaque(false);
this.add(userField);
userField2 = new JPasswordField();
userField2.setBounds(80, 280, 100, 30);
userField2.setBorder(BorderFactory.createLoweredBevelBorder());
userField2.setOpaque(false);
this.add(userField2);
//
Login = new JButton(" ");
Login.setBounds(45,350,60,36);
//Login.setBackground(new Color(44,22,44));//
//Login.setForeground(Color.BLUE);//
//
Login.addActionListener(new ActionListener() {//ActionListener alt /
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println(" ");
//
String userName = userField.getText();
String passWord = userField2.getText();// : ,
if("Huey".equals(userName) && "123".equals(passWord)){
//
JOptionPane.showMessageDialog(null, " "+userName+" ");
//
//
dispose();
}else if("".equals(userName) || "".equals(passWord)){
//
JOptionPane.showMessageDialog(null, " / , !");
}else{
JOptionPane.showMessageDialog(null, " / , !");
}
}
});
this.add(Login);
//
Cancel = new JButton(" ");
Cancel.setBounds(135,350,60,36);
this.add(Cancel);
Cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
dispose();
}
});
// ,
LoginPanel panel = new LoginPanel();
this.add(panel);
//
this.setSize(900,530);
this.setLocationRelativeTo(null);//
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setUndecorated(true);
// Logo
this.setIconImage(new ImageIcon("Image/115.png").getImage());//
this.setVisible(true);
}
// main main + Alt /
public static void main(String[] args) {
new LoginFrame();
}
class LoginPanel extends JPanel{//
//
Image background;//------ctr shift + o
public LoginPanel() {//-----alt / { ,
// , background
try {//----- ,
background = ImageIO.read(new File("Image/login.jpg"));//----read File
} catch (IOException e) {//-------
//
e.printStackTrace();
}
}
//
@Override
public void paint(Graphics g) {
super.paint(g);
//
g.drawImage(background, 0, 0,900,530, null);//900,530
}
}
}
//throws ...... , , :
코드 구 조 를 더욱 명확 하 게 보기 위해 서 일부 코드 의 역할 도 메 인 을 드 립 니 다.LoginFrame 역할 영역 마지막 까지}
LoginPanel 코드 블록:
실행 결과 캡 처:
1.인터페이스
2.로그 인
2.1 사용자 이름과 비밀번호 가 비어 있 는 경우:
2.2 사용자 이름 이나 비밀번호 입력 이 잘못된 경우:
2.3.사용자 이름과 비밀번호 입력 이 정확 한 경우:
팝 업 창 에 있 는"확인"을 누 르 면 바로 종료 합 니 다.
3.탈퇴
"취소"를 누 르 면 됩 니 다.
2.게임 시작 화면
앞에서 우 리 는 로그 인 인터페이스의 구축 을 완성 했다.그 다음 에 게임 인터페이스의 구축 을 완성 하고 로그 인 인터페이스 와 게임 인터페이스 를 시작 하 는 다 리 를 구축 할 것 이다.
사용자 이름과 비밀 번 호 를 입력 하면 게임 시작 인터페이스 에 들 어 갈 수 있 는 기능 을 실현 합 니 다.
인터페이스 기능 요구 도:
구체 적 인 요구:
마우스 가 게임 시작 단 추 를 옮 기 면 단 추 는 어둠 에서 밝 아 지고 마 우 스 를 옮 기 면 단 추 는 밝 음 에서 어 두 워 집 니 다.
도움말,떠 나 기 버튼 이 같 습 니 다.
또한,클릭 하여 떠 날 때 현재 화면 을 닫 는 효 과 를 실현 해 야 합 니 다.
상위 코드:
package cn.sqc.runday.view;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import cn.sqc.runday.controller.WindowFrame;
public class MainFrame extends JFrame implements MouseListener {
//
/**
* 1.1、 logo
1.2、 MainPanel,
2.
*/
//2.1
JLabel start,help,exit;
JPanel MainPanel;
public MainFrame() {// , 。 main
//2.2
start = new JLabel(new ImageIcon("Image/hh1.png"));//ImageIcon:
start.setBounds(350,320,150,40);
start.setEnabled(false);//false
start.addMouseListener(this);
this.add(start);
help = new JLabel(new ImageIcon("Image/hh2.png"));
help.setBounds(350,420,150,40);
help.setEnabled(false);
help.addMouseListener(this);
this.add(help);
exit = new JLabel(new ImageIcon("Image/hh3.png"));
exit.setBounds(350, 520, 150, 40);
exit.setEnabled(false);
exit.addMouseListener(this);
this.add(exit);
/**1. */
MainPanel panel = new MainPanel();
this.add(panel);
// logo
this.setSize(1200,730);//
this.setLocationRelativeTo(null);//
this.setUndecorated(true);//
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//
this.setIconImage(new ImageIcon("Image/115.png").getImage());//logo
this.setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
//2、 MainPanel,
class MainPanel extends JPanel{// MainPanel , MainFrame
Image background;
public MainPanel() {
try {
background = ImageIO.read(new File("Image/main.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(background, 0, 0,1200,730, null);
}
}
// implements MouseListener ,
@Override
public void mouseClicked(MouseEvent e) {
//
if(e.getSource().equals(start)){
//
new WindowFrame().Start();
//
//dispose();
}else if(e.getSource().equals(exit)){
dispose();
}else if(e.getSource().equals(help)){
JOptionPane.showMessageDialog(null, " :Huey");
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
//
if(e.getSource().equals(start)){//e 。e.getSource()
// (start) ( )
start.setEnabled(true);
}else if(e.getSource().equals(help)){
help.setEnabled(true);
}else if(e.getSource().equals(exit)){
exit.setEnabled(true);
}
}
@Override
public void mouseExited(MouseEvent e) {
//
if(e.getSource().equals(start)){
start.setEnabled(false);
}else if(e.getSource().equals(help)){
help.setEnabled(false);
}else if(e.getSource().equals(exit)){
exit.setEnabled(false);
}
}
}
테스트:위의 아 쉬 움 을 먼저 메 우 고 new MainFrame()을 더 합 니 다.어구우리 가 방금 쓴 시작 게임 화면 을 호출 합 니 다.
로그 인 화면:
확인 을 누 르 십시오
우리 가 작성 한 로그 인 게임 인터페이스 에 완벽 하 게 들 어 갑 니 다:
지금 보기 시작 버튼:
도움말 단추:
도움말 버튼 클릭:
종료 단추:
클릭:
큰 성 과 를 거두다.
3.버퍼 로 딩 게임 인터페이스
앞에서 우 리 는 게임 인터페이스의 구축 을 완성 했다.다음은 버퍼 로드 인터페이스 구축 을 실현 할 것 입 니 다.그리고 앞의 두 인터페이스 와 의 다 리 를 구축한다.
정확 한 사용자 이름 비밀 번 호 를 입력 한 후 게임 시작 인터페이스 에 들 어가 게임 시작 단 추 를 클릭 한 후 버퍼 로 딩 인터페이스 에 들 어 가 는 기능 을 실현 합 니 다.
인터페이스 설명도:
구체 적 인 요구:
캐 시 로드 인터페이스:배경 그림,진도 바
우 리 는 동적 버퍼 로드 과정 을 실현 하고 진 도 를 움 직 이려 면 스 레 드 의 개념 을 도입 해 야 한다.스 레 드:
Thread 클래스 에서 이렇게 정의 합 니 다:
스 레 드 는 프로그램 에서 실행 되 는 스 레 드 입 니 다.자바 가상 컴퓨터 는 프로그램 이 여러 개의 실행 스 레 드 를 동시에 실행 할 수 있 도록 합 니 다.
예 를 들 어 바 이 두 네트워크 로 영화 한 편 을 다운로드 하 는 것 이 스 레 드 입 니 다.만약 당신 이 여러 편의 영 화 를 동시에 다운로드 한다 면,이것 은 다 중 스 레 드 입 니 다.
1.스 레 드 는 6 가지 상태 가 있 습 니 다.새로 만 들 기,실행,차단,대기,시간 측정 대기 와 종료.
새 스 레 드:new 연산 자 를 사용 하여 새 스 레 드 를 만 들 때 스 레 드 는'새 스 레 드'상태 에 있 습 니 다.
실행 가능(실행 가능):start()방법 을 호출 합 니 다.
차단:스 레 드 가 대상 의 내 장 된 자 물 쇠 를 가 져 와 야 할 때 이 자 물 쇠 는 다른 스 레 드 에 의 해 가지 고 있 습 니 다.
대기:스 레 드 가 다른 스 레 드 알림 스케줄 러 가 실 행 될 때 까지 기 다 립 니 다.
시간 계산 대기:Thread 와 같은 시간 매개 변 수 를 포함 하 는 sleep().
종료:run()방법 이 실행 되 거나 이상 이 발생 했 을 때.
2.스 레 드 를 만 드 는 두 가지 방법:
1.Runnable 실현
2.Thread 클래스 구현
직접 코드 올 리 기:
package cn.sqc.runday.controller;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
/**
*
* @author Huey
* @date 2020-11-18
* : 、
* 。( )
*
*/
public class WindowFrame extends JFrame implements Runnable{
JLabel background;
//
JProgressBar jdt;
//
public void Start(){
WindowFrame frame = new WindowFrame();
Thread t = new Thread(frame);//t
//
t.start();
dispose();
}
public WindowFrame() {
background = new JLabel(new ImageIcon("Image/hbg.jpg"));
this.add(BorderLayout.NORTH,background);//
jdt = new JProgressBar();
jdt.setStringPainted(true);// 。0%
jdt.setBackground(Color.ORANGE);
this.add(BorderLayout.SOUTH,jdt);
// 568 * 340
this.setSize(568,340);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setUndecorated(true);
this.setIconImage(new ImageIcon("Image/115.png").getImage());
this.setVisible(true);
}
public static void main(String[] args) {
new WindowFrame().Start();
}
@Override
public void run() {
// ,
int [] values = {0,1,3,10,23,32,40,47,55,66,76,86,89,95,99,99,99,100};
for(int i=0; i<values.length; i++){//
jdt.setValue(values[i]);
//
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//200
}
}
}
인터페이스 코드 를 불 러 오고 다 리 를 만 듭 니 다.지금,우 리 는 첫 번 째 로그 인 인터페이스 부터 테스트 를 시작 합 니 다.
클릭 하여 게임 시작:
비 정지 화면...
성공 실현!
4.게임 메 인 화면
다음 에 게임 메 인 화면 을 실현 할 것 입 니 다.기능 은 다음 과 같 습 니 다.
이동 하 는 배경 그림,동적 유저,유저 의 이동 기능,
다섯 가지 장애물 이 지속 적 으로 나타 나 고 게이머 와 장애물 의 충돌,
일시 정지,계속 기능.
우선 전체적인 효 과 를 살 펴 보 자.
움 직 이 는 그림 이 너무 커서 몇 초 에 Gif 가 10 조 원 이에 요.어 쩔 수 없 이 사진 전시 효과.
점프,득점,낙하,장애물:
장애물 에 부 딪 힌 후 유 저 는 밀 려 갔다.
다음은 각 기능 의 논 리 를 설명 한다.
1.디 스 플레이 창 을 만 들 고 게임 을 탑재 하 는 메 인 패 널 류 를 만 듭 니 다.
GameFrame.java
package cn.sqc.runday.view;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import cn.sqc.runday.controller.GamePanel;
/**
* @author Huey
*2020-11-27 12:40:22
* : ,
*/
public class GameFrame extends JFrame {
//
public static final int WIDTH=1500;
public static final int HEIGHT=900;
public GameFrame() {
//2.4 ,
GamePanel panel = new GamePanel();
panel.action();//
this.addKeyListener(panel);//
this.add(panel);
/**1. */
this.setSize(WIDTH,HEIGHT);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setIconImage(new ImageIcon("Image/115.png").getImage());
this.setUndecorated(true);
this.setVisible(true);
}
public static void main(String[] args) {
new GameFrame();
}
}
2.게임 메 인 패 널 클래스(핵심 논리 클래스):배경 그림 스크롤 효과배경 그림 두 장 을 사용 하여 배경 그림 스크롤 효 과 를 실현 하 는 논 리 는 다음 과 같 습 니 다.
다음은 영상 으로 보 여 드 리 겠 습 니 다.
플레이어 동적 효과
중국 초기 에 유명한 애니메이션 인 은 그 당시 에 컴퓨터 가 없 었 기 때문에 한 폭 의 그림 이 필요 했다.그 다음 에 그림 을 신속하게 재생 하여 동태 적 인 화면(진·애니메이션 이 라 고 부 르 고 싶 습 니 다)을 형성 하고 이 를 위해 더빙 을 해 야 했 습 니 다.짧 은 10 분 동안 애니메이션 은 7000 에서 10000 장의 원 화 를 그 려 야 합 니 다!
여기 서 우리 게이머 들 의 달리기 자 세 는 9 장의 그림 으로 구성 된다.
다음 그림 설명:
다음은 유저 의(생 성,이동,그리 기)를 실현 하 는 기본 코드 입 니 다.뒤의 장애물 의 실현 도 모두 이 작성 논 리 를 따 릅 니 다.
코드 를 더욱 편리 하 게 읽 기 위해 최선 을 다 했 습 니 다.아직 잘 모 르 는 부분 이 있다 면 댓 글 교 류 를 환영 합 니 다.
Person.java
package cn.sqc.runday.model;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import cn.sqc.runday.view.GameFrame;
/**
* @author Huey
* @date 2020-11-23
*
*/
public class Person {//1.
private Image image;//1.1
private Image[] images;//1.2
public static final int WIDTH = 120;//1.3
public static final int HEIGHT = 120;
//1.4
private int x,y;
int index;//
//
private int score;
//
private int distance;
public Person() {//2.
// images
init();//2.1 , !
// 2.6
image = images[0];
x = 90;//2.7
y = 580;//
index = 0;
score = 0;
distance = 0;
}
// 5.1
public void drop() {
y += 5;
if(y>=580){// , ,
y = 580;
}
}
//
public void step(){
//
image = images[index ++ /3%images.length];
// ( , )
}
//
public void paintPerson(Graphics g){
g.drawImage(image, x, y, WIDTH, HEIGHT, null);
}
//
public boolean outOfBounds(){
return this.x >= GameFrame.WIDTH || this.x <= -WIDTH;
}
private void init() {//2.2
images = new Image[9];
for(int i = 0; i<images.length; i++){//2.3
try {//2.5
images[i] = ImageIO.read(new File("Image/"+(i+1) + ".png"));//2.4
} catch (IOException e) {//2.5
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//2.8 ,Source,GGAS
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Image[] getImages() {
return images;
}
public void setImages(Image[] images) {
this.images = images;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public static int getWidth() {
return WIDTH;
}
public static int getHeight() {
return HEIGHT;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getDistance() {
return distance;
}
public void setDistance(int distance) {
this.distance = distance;
}
}
3.몇 가지 장애물 의 출현 장애물 1:게
package cn.sqc.runday.model;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Paint;
import java.io.File;
import javax.imageio.ImageIO;
import cn.sqc.runday.view.GameFrame;
public class Barrs_1 {
private Image image;
private Image [] images;
public static final int WIDTH=100;
public static final int HEIGHT=110;
private int x,y;
int index;
private int speed;
public Barrs_1() {// !
images = new Image[2];
try {
images[0]=ImageIO.read(new File("image/a2.png"));
images[1]=ImageIO.read(new File("image/a4.png"));
} catch (Exception e) {
// TODO: handle exception
}
image = images[0];
x=GameFrame.WIDTH+100;
y=580;
speed =30;
index = 0;
}
public void step() {//
image =images[index++/5%images.length];
x-=speed;// ,
}
public void paintBarrs(Graphics g) {
g.drawImage(image, x,y,WIDTH,HEIGHT, null);
}
public boolean outofBounds(){
return this.x <=-WIDTH;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Image[] getImages() {
return images;
}
public void setImages(Image[] images) {
this.images = images;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public static int getWidth() {
return WIDTH;
}
public static int getHeight() {
return HEIGHT;
}
}
주의해 야 할 것 은 생 성 후 set,get 방법 을 추가 하 는 것 을 기억 하 세 요.패 널 류 에서 장애물 을 조작 할 수 있 도록 합 니 다.장애물 2:펫
장애물 이 라 기보 다 는 유 저 를 따 르 는 졸개 라 고 할 수 있다.
package cn.sqc.runday.model;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import cn.sqc.runday.view.GameFrame;
public class Barrs_2{ // !
private Image image;
private Image images [] ;
public static final int WIDTH= 70;
public static final int HEIGHT = 60;
private int x,y;
int index;
public Barrs_2() {
init();
image = images[0];
x=300;
y=460;
}
public void drop() {
y ++;
if(y>=460){
y = 460;
}
}
public void step(){
image = images[index++/2%images.length];
}
public void paintBarrs(Graphics g) {
g.drawImage(image, x,y,WIDTH,HEIGHT, null);
}
public boolean outofBounds() {
return this.x<=-WIDTH;
}
public void init(){
images = new Image[6];
for( int i=0;i<6;i++){
try {
images[i]=ImageIO.read(new File ("Image/"+"d"+(i+1)+".png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Image[] getImages() {
return images;
}
public void setImages(Image[] images) {
this.images = images;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public static int getWidht() {
return WIDTH;
}
public static int getHeight() {
return HEIGHT;
}
}
장애물
package cn.sqc.runday.model;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import javax.imageio.ImageIO;
import cn.sqc.runday.view.GameFrame;
public class Barrs_3 {// !
private Image image;
private int x,y;
public static final int WIDTH = 150;
public static final int HEIGHT=70;
private int speed;
public Barrs_3() {
try {
image = ImageIO.read(new File("image/daodan.png"));
} catch (Exception e) {
// TODO: handle exception
}
x=GameFrame.WIDTH+1000;
y=450;
speed = 25 ;
}
public void step(){
x-=speed;
}
public void paintBarrs(Graphics g) {
g.drawImage(image, x, y, WIDTH, HEIGHT, null);
}
public boolean outofBounds(){
return this.x<=-WIDTH;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public static int getWidth() {
return WIDTH;
}
public static int getHeight() {
return HEIGHT;
}
}
장애물 4:작살 등 장애물
package cn.sqc.runday.model;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.util.Random;
import javax.imageio.ImageIO;
import cn.sqc.runday.view.GameFrame;
public class Barrs_4 {// !
private Image image;
private Image images[];
public static final int WIDTH =150;
public static final int HEIGHT =350;
private int x,y;
public Barrs_4() {//
Random random = new Random();
images = new Image[4] ;
try {
images[0] = ImageIO.read(new File("image/11.png"));
images[1]= ImageIO.read(new File("image/12.png"));
images[2]= ImageIO.read(new File("image/13.png"));
images[3]= ImageIO.read(new File("image/14.png"));
} catch (Exception e) {
// TODO: handle exception
}
image= images[random.nextInt(4)];
x=GameFrame.WIDTH+1500;
y=0;
}
public void step(){
x-=20;
}
public void paintBarrs(Graphics g){
g.drawImage(image, x, y, WIDTH, HEIGHT, null);
}
public boolean outofBounds(){
return this.x<=-WIDTH;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Image[] getImages() {
return images;
}
public void setImages(Image[] images) {
this.images = images;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public static int getWidth() {
return WIDTH;
}
public static int getHeight() {
return HEIGHT;
}
}
장애물 5、금화여기에 금화 의 동적 효 과 는 쓰 지 않 는 다.
package cn.sqc.runday.model;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import cn.sqc.runday.view.GameFrame;
/**
* @author Huey
*2020-11-30 03:44:51
*
*
*/
public class Barrs_5 {
private Image image;//
public static final int WIDTH = 30;
public static final int HEIGHT = 30;
private int x,y;
private int speed;
Random random = new Random();
public Barrs_5() {
try {
image = ImageIO.read(new File("Image/"+(random.nextInt(6) + 21) + ".png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
x = GameFrame.WIDTH + 10;
y = random.nextInt(600);
speed = 20;
}
public void step(){
x -= speed;
}
public void paintBarrs(Graphics g){
g.drawImage(image, x, y, WIDTH, HEIGHT, null);
}
public boolean outofBounds() {
return this.x<=-WIDTH;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public Random getRandom() {
return random;
}
public void setRandom(Random random) {
this.random = random;
}
public static int getWidth() {
return WIDTH;
}
public static int getHeight() {
return HEIGHT;
}
}
4.게이머 와 장애물 의 충돌 논리게이머 와 미사일 의 충돌 예:
for(int i = 0;i<barrs3.length;i++){
if(person.getX() + Person.WIDTH >= barrs3[i].getX() &&
person.getX() <= barrs3[i].getX() + Barrs_3.WIDTH &&
person .getY() +Person.getHeight() >= barrs3[i].getY() &&
person.getY() <= barrs3[i].getY () + Barrs_3.HEIGHT){
if(person.getX() + Person.WIDTH <= barrs3[i].getX() + Barrs_3.WIDTH){// (120px)
//
person.setX(barrs3[i].getX() - Barrs_3.WIDTH);
}else{
//
person.setX(barrs3[i].getX()+ Barrs_3.WIDTH );
}
}
}
아래 동 도 는 게이머 들 이 오른쪽 에서 장애물 b 와 부 딪 히 고 왼쪽 에서 부 딪 히 는 논 리 를 보 여 주 며 상하 가 부 딪 히 는 것 과 같은 이치 이다.상하 좌우 충돌 의 논리 코드 는 움 직 이 는 그림 아래 에 있 습 니 다.
5.일시 정지,계속 논리
키보드 버튼 을 감청 하 는 방법 에서
코드 는 다음 과 같 습 니 다:
이 곳 의 flag 는 위의 프로그램 이 시작 하 는 방법 에서 유래 한 것 입 니 다.스페이스 바 를 누 르 면 생 성,이동,그리 기 방법의 일시 정 지 를 실현 할 수 있 고 화면의 정지,게임 의 일시 정지 에 해당 합 니 다!
6.종료 논리
게임 메 인 인터페이스 코드 는 다음 과 같 습 니 다.
package cn.sqc.runday.controller;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import cn.sqc.runday.model.Barrs_1;
import cn.sqc.runday.model.Barrs_2;
import cn.sqc.runday.model.Barrs_3;
import cn.sqc.runday.model.Barrs_4;
import cn.sqc.runday.model.Barrs_5;
import cn.sqc.runday.model.Person;
import cn.sqc.runday.view.EndFrame;
import cn.sqc.runday.view.GameFrame;
/**
* @author Huey
*2020-11-27 12:28:44
* ,
* 1、
* 2、
* 3、
* 4、
* 5、 、
* 6、
*/
public class GamePanel extends JPanel implements KeyListener{
/**2、 ***/
//2.1
Image background;
Image score;
Image pause;//
Image proceed;// .
/***3. ***/
//3.1 ( )
Person person;
Barrs_2 barrs_2;//
Barrs_4 barrs_4;//
Barrs_5 barrs_5;//
/**4. */
//4.1
Barrs_1[]barrs1 = {};// ( , )
Barrs_3[]barrs3 ={};//
Barrs_4[]barrs4={};//
Barrs_5[]barrs5 = {};//
public GamePanel() {
//3.2
person = new Person();// Person ,
barrs_2 = new Barrs_2();
//2.2
try{
background =ImageIO.read(new File("Image/cc.png"));//
score =ImageIO.read(new File("Image/a12.png"));//
pause = ImageIO.read(new File("Image/b2.png"));
proceed = ImageIO.read(new File("Image/b1.png"));
}catch(IOException e){
e.printStackTrace();
}
}
//2.5
int x=0;//
@Override
public void paint(Graphics g) {
super.paint(g);
//2.7
if(flag){
x-=20;//
}
//2.3 ( )
g.drawImage(background, x, 0, GameFrame.WIDTH, GameFrame.HEIGHT, null);
g.drawImage(background, x+GameFrame.WIDTH, 0, GameFrame.WIDTH, GameFrame.HEIGHT,null);
if(x<=-GameFrame.WIDTH){//
x = 0;
}
//3.3
person.paintPerson(g);
//
for(int i =0;i<barrs1.length;i++){
barrs1[i].paintBarrs(g);
}
//
barrs_2.paintBarrs(g);
//
for(int i =0;i<barrs3.length;i++){
barrs3[i].paintBarrs(g);
}
//
for(int i =0;i<barrs4.length;i++){
barrs4[i].paintBarrs(g);
}
//
for(int i = 0;i<barrs5.length;i++){
barrs5[i].paintBarrs(g);
}
// ,
//
g.drawImage(score, 120, 50,null);
g.setColor(Color.ORANGE);
g.setFont(new Font(" ",Font.BOLD,30 ));
g.drawString(" :"+person.getScore()+" ", 133, 95);
// 、
if(flag){
g.drawImage(proceed, 200, 800, 90,90,null);
}else{
g.drawImage(pause, 200, 800, 90, 90, null);
}
}
//
int index =0;
public void enteredAction(){//
index++;
//
if(index%100==0){
//
Barrs_1 b1 = new Barrs_1();
Barrs_3 b3 = new Barrs_3();
Barrs_4 b4 = new Barrs_4();
barrs1 =Arrays.copyOf(barrs1,barrs1.length+1);//
barrs1[barrs1.length-1]= b1;//
//System.out.println(" "+barrs1.length);
barrs3 =Arrays.copyOf(barrs3,barrs3.length+1);
barrs3[barrs3.length-1]= b3;
barrs4 =Arrays.copyOf(barrs4,barrs4.length+1);
barrs4[barrs4.length-1]= b4;
}
if(index%15==0){
Barrs_5 b5 = new Barrs_5();
barrs5 = Arrays.copyOf(barrs5, barrs5.length +1);
barrs5[barrs5.length-1] = b5;
}
}
//
public void stepAction(){
//3..4
person.step();// ―>
person.drop();//
barrs_2.drop();
//
for(int i =0;i<barrs1.length;i++){
barrs1[i].step();
// ,
if(barrs1[i].outofBounds()){
//
barrs1[i] = barrs1[barrs1.length - 1];// , , , 。
barrs1= Arrays.copyOf(barrs1, barrs1.length - 1);//
}
}
barrs_2.step();
for(int i =0;i<barrs3.length;i++){
barrs3[i].step();
//
if(barrs3[i].outofBounds()){
barrs3[i] = barrs3[barrs3.length - 1];
barrs3 = Arrays.copyOf(barrs3, barrs3.length - 1);
}
}
for(int i =0;i<barrs4.length;i++){
barrs4[i].step();
//
if(barrs4[i].outofBounds()){
barrs4[i] = barrs4[barrs4.length - 1 ];
barrs4 = Arrays.copyOf(barrs4, barrs4.length - 1);
}
}
for(int i = 0;i<barrs5.length;i++){
barrs5[i].step();
if(barrs5[i].outofBounds()){
//
barrs5[i] = barrs5[barrs5.length - 1];
barrs5 = Arrays.copyOf(barrs5, barrs5.length - 1);
}
}
}
//
public void pengAction(){
//
for(int i = 0;i<barrs1.length;i++){// ,
if(person.getX() + Person.WIDTH >= barrs1[i].getX() &&
person.getX() <= barrs1[i].getX() + Barrs_1.WIDTH &&
person .getY() +Person.getHeight() >= barrs1[i].getY() &&
person.getY() <= barrs1[i].getY () + Barrs_1.HEIGHT){
// ( )
if(person.getX() + Person.WIDTH <= barrs1[i].getX() + Barrs_1.WIDTH){// ,
//
person.setX(barrs1[i].getX() - Barrs_1.WIDTH);
}else{
//
person.setX(barrs1[i].getX()+ Barrs_1.WIDTH );
}
}
}
//
for(int i = 0;i<barrs3.length;i++){
if(person.getX() + Person.WIDTH >= barrs3[i].getX() &&
person.getX() <= barrs3[i].getX() + Barrs_3.WIDTH &&
person .getY() +Person.getHeight() >= barrs3[i].getY() &&
person.getY() <= barrs3[i].getY () + Barrs_3.HEIGHT){
if(person.getX() + Person.WIDTH <= barrs3[i].getX() + Barrs_3.WIDTH){// (120px)
//
person.setX(barrs3[i].getX() - Barrs_3.WIDTH);
}else{
//
person.setX(barrs3[i].getX()+ Barrs_3.WIDTH );
}
}
}
//
for(int i = 0;i<=barrs4.length -1;i++){// !
if(person.getX() + Person.WIDTH >= barrs4[i].getX() &&
person.getX() <= barrs4[i].getX() + Barrs_4.WIDTH &&
person.getY() + Person.HEIGHT >= barrs4[i].getY() &&
person.getY() <= barrs4[i].getY() + Barrs_4.HEIGHT ){
if(person.getX() + Person.WIDTH <= barrs4[i].getX() + Barrs_4.WIDTH ){
//
person.setX(barrs4[i].getX() - Barrs_4.WIDTH);
}else{
//
person.setX(barrs4[i].getX()+ Barrs_4.WIDTH );
}
}
}
//
for(int i = 0;i<barrs5.length;i++){
if(person.getX() + Person.WIDTH >= barrs5[i].getX() &&
person.getX() <= barrs5[i].getX() + Barrs_5.WIDTH &&
person .getY() +Person.getHeight() >= barrs5[i].getY() &&
person.getY() <= barrs5[i].getY () + Barrs_5.HEIGHT){//
if(person.getX() + Person.WIDTH <= barrs5[i].getX() + Barrs_5.WIDTH){
//
barrs5[i] = barrs5[barrs5.length - 1];
barrs5 = Arrays.copyOf(barrs5, barrs5.length - 1);
//
int score = person.getScore();
person.setScore(score + 10);
}
}
}
}
//
public void gameOverAction(){
if(person.outOfBounds()){
//
isGameOver = true;
// ( )
new EndFrame(person);//
//
person = new Person();
barrs1 = new Barrs_1[]{};
barrs3 = new Barrs_3[]{};
}
}
public static boolean isGameOver = false;
boolean flag = true;
//2.8
public void action(){
new Thread(){//
// run
public void run() {
while(!isGameOver){
//3.4
if(flag){
enteredAction();// : ,
stepAction();
pengAction();//
gameOverAction();
}
//
repaint();
//
try {
Thread.sleep(60);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
};
}.start();//
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
//
int x = person.getX();
int y = person.getY();
int x1 = barrs_2.getX();
int y1 = barrs_2.getY();
//
if(e.getKeyCode() == KeyEvent.VK_UP && y > 10 && y1 > 10){
person.setY(y-25);
barrs_2.setY(y-25);
}
//
if(e.getKeyCode()== KeyEvent.VK_DOWN && y<=560 && y1<560){
person.setY(y+30);
barrs_2.setY(y-30);
}
//
if(e.getKeyCode()==KeyEvent.VK_LEFT && x>=0 ){
person.setX(x-30);
barrs_2.setX(x1-30);
}
//
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
person.setX(x+22);
barrs_2.setX(x1+22);
if(x>=GameFrame.WIDTH-Person.WIDTH){//
person.setX(GameFrame.WIDTH-Person.WIDTH);
}
if(x1>=GameFrame.WIDTH-barrs_2.WIDTH){//
barrs_2.setX(GameFrame.WIDTH - barrs_2.WIDTH);
}
}
//
if(e.getKeyCode() == KeyEvent.VK_SPACE){
flag = !flag;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
5.종료 인터페이스다음 에 매일 쿨 달리기 게임 의 끝 화면 을 실현 할 것 입 니 다.기능 은 다음 과 같 습 니 다.
쿨 거 리 를 뛰 어 다 니 며 플레이어 의 점 수 를 얻는다.
다시 한 번,메 인 메뉴 로 돌아 가 바로 종료 합 니 다.
구체 적 으로 어떤 모습 인지 먼저 보 는 것 이 즐겁다!
다시 한 번 단 추 를 누 르 면 로 딩 상태 에 들 어가 로 딩 이 끝나 고 바로 게임 에 들 어 갑 니 다.
메 인 메뉴 단 추 를 누 르 면 메 인 메뉴 인터페이스 에 들 어 갑 니 다:
1.파 쿠 거리
저 는 Person 류 의 게이머 이동 방법 에 증가 하 는 diatance 를 추 가 했 습 니 다.게이머 의 사진 이 아직도 전환 되 고 있 으 면 게임 이 아직 끝나 지 않 았 습 니 다.이 distance 는 모두 증가 하고 있 습 니 다.이것 은 간접 적 으로 파 쿠 거 리 를 계산 하 는 방법 이 라 고 할 수 있 습 니 다.
Person 클래스 에 get,set 방법 을 추가 하여 데 이 터 를 가 져 옵 니 다.
2、유저 의 득점 획득
플레이어 와 금화 가 충돌 하 는 점 수 는 그림 의 표현 점수 로 GamePanel 에서 획득 합 니 다.
그리고 총 점,나 는 Person 류 에서 간단 한 점수 규칙 을 설정 했다.
3.다시 한 번
마우스 클릭 이벤트 에서 new 의 새로운 로 딩 인터페이스,로 딩 완료 후 자동 으로 게임 에 들 어 갑 니 다.
4、메 인 화면 으로 돌아 가기
같은 이치.
5、바로 퇴장
같은 이치.
상위 코드
EndFrame.java
package cn.sqc.runday.view;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import cn.sqc.runday.controller.GamePanel;
import cn.sqc.runday.model.Person;
public class EndFrame extends JFrame implements MouseListener {
// 、 、
JLabel again,back,exit;
public EndFrame(Person person) {
again = new JLabel(new ImageIcon("Image/hh5.png"));
again.setBounds(520, 622, 60, 25);
again.addMouseListener(this);
this.add(again);
back = new JLabel(new ImageIcon("Image/hh6.png"));
back.setBounds(520, 722, 60, 25);
back.addMouseListener(this);
this.add(back);
exit = new JLabel(new ImageIcon("Image/hh3.png"));
exit.setBounds(520, 822, 60, 25);
exit.addMouseListener(this);
this.add(exit);
EndPanel end = new EndPanel(person);
this.add(end);//
this.setSize(1500, 900);
this.setLocationRelativeTo(null);
this.setUndecorated(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setIconImage(new ImageIcon("Image/115.png").getImage());
this.setVisible(true);
}
public static void main(String[] args) {
//new EndFrame();
}
class EndPanel extends JPanel{
Image background;
Person p;
public EndPanel(Person person) {// int a
this.p = person;// 、
try {
background = ImageIO.read(new File("Image/chou.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.drawImage(background, 0, 0,1500,900 ,null);
g.setColor(Color.CYAN);
g.setFont(new Font(" ",Font.BOLD,30));
g.drawString(p.getScore()+"",1110,705);// + ” “
g.drawString(p.getDistance() + " ", 1110, 622);
g.setFont(new Font(" ",Font.BOLD,50));
g.setColor(Color.ORANGE);
g.drawString(p.getTotalScore() + "", 1075, 500);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource().equals(again)){
//
new WindowFrame().Start();
//
dispose();
} else if(e.getSource().equals(back)){
new MainFrame();
dispose();
}else if(e.getSource().equals(exit)){
System.exit(0);
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
자바 로 매일 쿨 링(소스 코드 첨부)을 실현 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 실현 매일 쿨 링 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.