package Test4;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.plaf.basic.BasicTreeUI.TreeCancelEditingAction;
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
public class CookieRun2 {
private JFrame frame;
private JPanel panel; // 패널
private Button escButton; // esc 버튼 (테스트 중)
// 배경 이미지
private ImageIcon backIc = new ImageIcon("testimg/backTest.png"); // 제일 뒷 배경
private ImageIcon secondBackIc = new ImageIcon("배경이미지2"); // 2번째 배경
// 쿠키 이미지 아이콘들
private ImageIcon cookieIc = new ImageIcon("testimg/cookieTest.png"); // 기본모션
private ImageIcon jumpIc = new ImageIcon("testimg/jumpTest.png"); // 점프모션
private ImageIcon doubleJumpIc = new ImageIcon("testimg/doubleJumpTest.png"); // 더블점프모션
private ImageIcon fallIc = new ImageIcon("testimg/fallTest.png"); // 낙하모션(더블 점프 후)
private ImageIcon slideIc = new ImageIcon("testimg/slideTest.png"); // 슬라이드 모션
private ImageIcon hitIc = new ImageIcon("testimg/hitTest.png"); // 부딛히는 모션
// 젤리 이미지 아이콘들
private ImageIcon jelly1Ic = new ImageIcon("testimg/jelly1Test.png");
private ImageIcon jelly2Ic = new ImageIcon("testimg/jelly2Test.png");
private ImageIcon jelly3Ic = new ImageIcon("testimg/jelly3Test.png");
private ImageIcon jellyHPIc = new ImageIcon("testimg/jellyHPTest.png");
private ImageIcon jellyEffectIc = new ImageIcon("testimg/effectTest.png");
// 발판 이미지 아이콘들
private ImageIcon field1Ic = new ImageIcon("testimg/footTest.png"); // 발판
private ImageIcon field2Ic = new ImageIcon("testimg/footTest2.png"); // 공중발판
// 장애물 이미지 아이콘들
private ImageIcon tacle10Ic = new ImageIcon("testimg/tacleTest10.png"); // 1칸 장애물
private ImageIcon tacle20Ic = new ImageIcon("testimg/tacleTest20.png"); // 2칸 장애물
private ImageIcon tacle30Ic = new ImageIcon("testimg/tacleTest30.png"); // 3칸 장애물
private ImageIcon tacle40Ic = new ImageIcon("testimg/tacleTest40.png"); // 3칸 장애물
// 리스트 생성
private List<Jelly> jellyList = new ArrayList<>(); // 젤리 리스트
private List<Field> fieldList = new ArrayList<>(); // 발판 리스트
private List<Tacle> tacleList = new ArrayList<>(); // 장애물 리스트
private int runPage = 0; // 한 화면 이동할때마다 체력을 깎기 위한 변수
private int runStage = 1; // 스테이지를 확인하는 변수이다. (미구현)
private int resultScore = 0; // 결과점수를 수집하는 변수
private int gameSpeed = 3; // 게임 속도
private int nowField = 2000; // 발판의 높이를 저장.
private boolean escKeyOn = false; // 일시정지를 위한 esc키 확인
private boolean downKeyOn = false; // 다운키 눌렀는지 여부
int face; // 쿠키의 정면
int foot; // 쿠키의 발
// 이미지 파일로 된 맵을 가져온다.
private int[] sizeArr; // 이미지의 넓이와 높이를 가져오는 1차원 배열
private int[][] colorArr; // 이미지의 x y 좌표의 픽셀 색값을 저장하는 2차원배열
private Image buffImage; // 더블버퍼 이미지
private Graphics buffg; // 더블버퍼 g
private AlphaComposite alphaComposite; // 투명도 관련 오브젝트
Cookie c1; // 쿠키 오브젝트
Back b11; // 배경1-1 오브젝트
Back b12; // 배경1-2 오브젝트
class MyPanel extends JPanel {
public MyPanel() {
setFocusable(true);
// 쿠키 인스턴스 생성 / 기본 자료는 클래스안에 내장 되어 있기 때문에 이미지만 넣었다.
c1 = new Cookie(cookieIc.getImage());
// 쿠키의 정면 위치 / 쿠키의 x값과 높이를 더한 값
face = c1.getX() + c1.getWidth();
// 쿠키의 발밑 위치 / 쿠키의 y값과 높이를 더한 값
foot = c1.getY() + c1.getHeight();
// 배경1-1 인스턴스 생성
b11 = new Back(backIc.getImage(), 0, 0, // y 값 (조정 필요)
backIc.getImage().getWidth(null), backIc.getImage().getHeight(null));
// 배경1-2 인스턴스 생성
b12 = new Back(backIc.getImage(), backIc.getImage().getWidth(null), 0, // y 값 (조정 필요)
backIc.getImage().getWidth(null), backIc.getImage().getHeight(null));
// 맵 정보 불러오기
try {
sizeArr = Util.getSize("testimg/firstMap1.png"); // 맵 사이즈를 배열에 저장
colorArr = Util.getPic("testimg/firstMap1.png"); // 맵 픽셀값을 배열에 저장
} catch (Exception e1) {
e1.printStackTrace();
}
int maxX = sizeArr[0]; // 맵의 넓이
int maxY = sizeArr[1]; // 맵의 높이
for (int i = 0; i < maxX; i += 1) { // 젤리는 1칸을 차지하기 때문에 1,1사이즈로 반복문을 돌린다.
for (int j = 0; j < maxY; j += 1) {
if (colorArr[i][j] == 16776960) { // 색값이 16776960일 경우 기본젤리 생성
// 좌표에 40을 곱하고, 넓이와 높이는 30으로 한다.
jellyList.add(new Jelly(jelly1Ic.getImage(), i * 40, j * 40, 30, 30, 1234));
} else if (colorArr[i][j] == 13158400) { // 색값이 13158400일 경우 노란젤리 생성
// 좌표에 40을 곱하고, 넓이와 높이는 30으로 한다.
jellyList.add(new Jelly(jelly2Ic.getImage(), i * 40, j * 40, 30, 30, 2345));
} else if (colorArr[i][j] == 9868800) { // 색값이 9868800일 경우 노란젤리 생성
// 좌표에 40을 곱하고, 넓이와 높이는 30으로 한다.
jellyList.add(new Jelly(jelly3Ic.getImage(), i * 40, j * 40, 30, 30, 3456));
} else if (colorArr[i][j] == 16737280) { // 색값이 16737280일 경우 피 물약 생성
// 좌표에 40을 곱하고, 넓이와 높이는 30으로 한다.
jellyList.add(new Jelly(jellyHPIc.getImage(), i * 40, j * 40, 30, 30, 4567));
}
}
}
for (int i = 0; i < maxX; i += 2) { // 발판은 4칸을 차지하는 공간이기 때문에 2,2사이즈로 반복문을 돌린다.
for (int j = 0; j < maxY; j += 2) {
if (colorArr[i][j] == 0) { // 색값이 0 일경우 (검은색)
// 좌표에 40을 곱하고, 넓이와 높이는 80으로 한다.
fieldList.add(new Field(field1Ic.getImage(), i * 40, j * 40, 80, 80));
} else if (colorArr[i][j] == 6579300) { // 색값이 6579300 일경우 (회색)
// 좌표에 40을 곱하고, 넓이는 80으로 높이는 40 한다.
fieldList.add(new Field(field1Ic.getImage(), i * 40, j * 40, 80, 40));
}
}
}
for (int i = 0; i < maxX; i += 2) { // 장애물은 4칸 이상을 차지한다. 추후 수정
for (int j = 0; j < maxY; j += 2) {
if (colorArr[i][j] == 16711680) { // 색값이 16711680일 경우 (빨간색) 1칸
// 좌표에 40을 곱하고, 넓이와 높이는 80으로 한다.
tacleList.add(new Tacle(tacle10Ic.getImage(), i * 40, j * 40, 80, 80, 0));
} else if (colorArr[i][j] == 16711830) { // 색값이 16711830일 경우 (분홍) 2칸
// 좌표에 40을 곱하고, 넓이와 높이는 160으로 한다.
tacleList.add(new Tacle(tacle20Ic.getImage(), i * 40, j * 40, 80, 160, 0));
} else if (colorArr[i][j] == 16711935) { // 색값이 16711830일 경우 (핫핑크) 3칸
// 좌표에 40을 곱하고, 넓이와 높이는 240으로 한다.
tacleList.add(new Tacle(tacle30Ic.getImage(), i * 40, j * 40, 80, 240, 0));
}
}
}
// 리페인트 전용 쓰레드
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
repaint();
if (escKeyOn) { // esc 키를 누를경우 리페인트를 멈춘다
while (escKeyOn) {
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
}
}
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
mapMove(); // 배경 발판 장애물 작동 메서드
fall(); // 낙하 스레드 발동 메서드
addKeyListener(new KeyAdapter() { // 키 리스너 추가
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { // esc키를 눌렀을 때
if (!escKeyOn) {
escKeyOn = true;
add(escButton);
repaint(); // 화면을 어둡게 하기위한 리페인트
} else {
remove(escButton);
escKeyOn = false;
}
}
if (!escKeyOn) {
if (e.getKeyCode() == KeyEvent.VK_SPACE && c1.getCountJump() < 2) { // 스페이스 키를 누르고 더블점프가 2가 아닐때
jump(); // 점프 메서드 가동
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) { // 다운키를 눌렀을 때
downKeyOn = true; // downKeyOn 변수를 true로
if (c1.getImage() != slideIc.getImage() // 쿠키이미지가 슬라이드 이미지가 아니고
&& !c1.isJump() // 점프 중이 아니며
&& !c1.isFall()) { // 낙하 중도 아닐 때
c1.setImage(slideIc.getImage()); // 이미지를 슬라이드이미지로 변경
}
}
}
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DOWN) { // 다운키를 뗐을 때
downKeyOn = false; // downKeyOn 변수를 false로
if (c1.getImage() != cookieIc.getImage() // 쿠키이미지가 기본이미지가 아니고
&& !c1.isJump() // 점프 중이 아니며
&& !c1.isFall()) { // 낙하 중도 아닐 때
c1.setImage(cookieIc.getImage()); // 이미지를 기본이미지로 변경
}
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
}
}
void mapMove() {
}
void hit() {
}
void fall() {
}
void jump() {
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CookieRun2 window = new CookieRun2();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public CookieRun2() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 800, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new MyPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(null);
escButton = new Button("재시작");
escButton.setBounds(350, 240, 50, 30);
escButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
panel.remove(escButton);
escKeyOn = false;
}
});
}
}