728x90
반응형
[Java] 68. 메모리 상에서의 스레드
1. 메모리 상에서의 스레드의 개념
2. 응용 예제: 공룡 게임 코드 수정하기
1. 메모리 상에서의 스레드의 개념
모든 자바 프로그램은 메인 스레드에서 시작되며, 사용자는 추가 스레드를 만들 수 있다.
각 스레드는 독립적으로 실행되며, 자신만의 호출 스택을 지니게 된다.
(각 쓰레드의 스택 영역은 서로 나뉘어져 있다.)
프로세스 내의 모든 스레드는 같은 Heap 메모리 공간과 다른 자원을 공유할 수 있다.
2. 응용 예제: 공룡 게임 코드 수정하기
-적 캐릭터와 만났을 때 캐릭터가 사라진다.
-스페이스바를 눌렀을 때 적 캐릭터가 멈춘다.
쓰레드의 개념을 이용해 해당 예제를 만들어보자.
package ch08;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameFrame extends JFrame {
BufferedImage backgroundImage;
BufferedImage player1;
BufferedImage enemy1;
ImagePanel imagePanel;
int playerX=150;
int playerY=300;
int enemyX=250;
int enemyY=420;
boolean flag=true;
boolean flag1=true;
public GameFrame() {
initData();
setInitLayout();
addEventListener();
}
private class ImagePanel extends JPanel implements Runnable {
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
g.drawImage(backgroundImage, 0, 0, 600, 600, null);
g.drawImage(enemy1, enemyX, enemyY, 50, 50, null);
if(flag1==true) {
g.drawImage(player1, playerX, playerY, 50, 50, null);
}
//Todo 플레이어, 적군 그림 그려야 함
//쓰레드를 활용할 예정
}
@Override
public void run() {
boolean direction=true;
//true: 왼쪽
//false: 오른쪽
// TODO Auto-generated method stub
while(flag){
System.out.println("진행중");
if(direction==true) {
enemyX -= 5;
if(enemyX==50) {
direction=false;
}
} else {
enemyX += 5;
if(enemyX==530) {
direction=true;
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repaint();
}
}}
private void initData() {
setTitle("Thread 활용한 미니 예제");
setSize(600,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
// 예외가 발생할 수 있는 코드를 작성하는 영역
backgroundImage = ImageIO.read(new File("img/backgroundMap.png"));
player1 = ImageIO.read(new File("img/playerL.png"));
enemy1 = ImageIO.read(new File("img/enemyL.png"));
} catch(IOException e) {
e.printStackTrace();
} imagePanel=new ImagePanel();
// 다른 작업자에게 일을 위임시킨다.
Thread thread = new Thread(imagePanel);
thread.start();
}
private void setInitLayout() {
//setLayout(null); // 배치 관리자를 좌표 기반
//setResizable(false); // 프레임 크기 조절 불가 설정
setVisible(true);
add(imagePanel);
}
private void addEventListener() {
// 이벤트 리스너 등록 방법 2가지 중
this.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("여기가 동작 합니다.");
int code=e.getKeyCode();
if(code==KeyEvent.VK_UP) {
playerY-=10;
} else if (code==KeyEvent.VK_DOWN) {
playerY+=10;
} else if (code==KeyEvent.VK_LEFT) {
playerX-=10;
} else if (code==KeyEvent.VK_RIGHT) {
playerX+=10;
} else if (code==KeyEvent.VK_SPACE) {
// 1. 스페이스를 눌렀을 때, 적군을 멈출 수 있게 코드 수정
flag=false;
}
// 2. player가 적군과 만났다면, player 그림을 없애주세요.
if((Math.abs(playerX-enemyX)<=50)&&(Math.abs(playerY-enemyY)<=50)) {
flag1=false;
}
repaint();
} // end of keyPressed
});
}
}
728x90
반응형
'Java > 기본 개념 및 클래스' 카테고리의 다른 글
[Java] 74. Swing: 버블버블 게임 만들기(5) (0) | 2024.05.03 |
---|---|
[Java] 69. 멀티 스레딩의 개념과 동기화 (0) | 2024.05.01 |
[Java] 67. 쓰레드의 개념과 사용 방법 (0) | 2024.05.01 |
[Java] 58. 예외 처리와 프로그램의 오류 (0) | 2024.04.29 |
[Java] 57. 인터페이스 활용: 스타크래프트 소스 코드 수정하기 (0) | 2024.04.26 |