- [Java] 68. 메모리 상에서의 스레드2024년 05월 01일
- Song hyun
- 작성자
- 2024.05.01.:50
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] 70. Swing: 버블버블 게임 만들기(1) (0) 2024.05.02 [Java] 69. 멀티 스레딩의 개념과 동기화 (0) 2024.05.01 [Java] 67. 쓰레드의 개념과 사용 방법 (0) 2024.05.01 [Java] 66. Swing: 랜덤 숫자 게임 만들기 (0) 2024.04.30 [Java] 65. Swing: 키보드 리스너 응용하기 (0) 2024.04.30 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)