Java

Mar 5, 2021 - Java 16일차

jongviet 2021. 3. 8. 21:49

*3월5

-100% 완성도 있게 만들었다고 얻은게 없지는 않음.. 하나하나 쌓는 것이라고 생각하자

-다른 분야에 있다가 오면 당연히 뒤쳐짐… -> 실무 코딩하면서 6개월 자기 개발하면 금방 따라잡는다.(소스 정리 잘해놔서 활용.. 라이브러리화 꼭 하자)

-배운거에 그치지 않고 계속해서 연습해야 .
-
모든 것을 알려고 하지 말고, 목적성에 따라 배운거로 해보면 ! 그러다보면 효율적인 방법이 보일꺼고 점점 개선하면됨 -> 경력2년차를 목표로 잡고 달려가자.. 수업보다 훨씬 빠르게 가야함..

-VCS, version control system,, 요즘은 github 많이씀

 

1)게임실습 - 공날리기

-thread에서 키보드 눌려짐에 따라 움직이게~  (flag 따라~)

-옵져버 패턴: 키를 눌렀을때는 boolean 값만 바뀜 -> 움직이는걸,, thread에 넣고, thread는 변경된거만 감지…  각각의 역할을 따로 수행하면서 공통적인 연결 고리만 이어주는것…

-thread는 boolean값에 따라 움직이기 /  boolean값 변경은 keyboard가 담당,,  boolean값이 연결고리!!

-객체(x,y 좌표값 VO + 생성자) arrayList~ 쓰기 좋음

-마우스 리스너로 프레스 + 드래그로 이동 조정 가능~

 

package main;

 

import java.awt.Canvas;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.util.ArrayList;

import java.util.Random;

 

public class MyCanvas2 extends Canvas {

 

ArrayList<Bul> bulArr = new ArrayList<Bul>();

 

int x;

int y;

boolean left;

boolean right;

boolean up;

boolean down;

boolean bulAttack;

boolean powerUp;

 

public MyCanvas2() {

new GameThread().start();

}

 

//총알 메소드

public void addBall() {

bulArr.add(new Bul(x, y, 3, 3)); //공 위치에서 생성

System.out.println(bulArr.size()); // 총 공의 갯수 확인 다운 방지

}

 

class GameThread extends Thread {

@Override

public void run() {

while(true) {

 

if(up) {

y -= 2;

if(y < 0) {

y = 0;

}

}

if(down) {

y += 2;

if(y > getHeight()-50) {

y = getHeight()-50; //전체 높이에서 공 크기만큼만 빼고 맵 이탈방지

}

}

if(left) {

x-= 5;

if(x < 0) {

x = 0;

}

}

if(right) {

x+= 5;

if(x > getWidth()-50) {

x = getWidth()-50;

}

}

 

//총알

if(bulAttack) {

for (int i = 0; i < bulArr.size(); i++) {

Bul bul = bulArr.get(i);

bul.bulY -= 10; //thread로 특정텀두면서 계속 반복

if(bul.bulY < -10) {

bulArr.remove(i); //overload 방지, 맵 넘어갔을때 총알 삭제

i--;

 

 

bulArr.get(i).bulY -= 2; //기존

}

}

 

repaint();

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

 

}

}

}

 

@Override

public void paint(Graphics g) {

setBackground(Color.gray);

Graphics2D g2 = (Graphics2D)g; //형변환해서 사용

g2.fillOval(x, y, 50, 50);

 

if(powerUp) {

g2.setColor(Color.green);

}

 

for (int i = 0; i < bulArr.size(); i++) {

g2.fillRect(bulArr.get(i).bulX, bulArr.get(i).bulY, 15, 15);

}

 

 

 

    }

}

 

package main;

 

import java.awt.Button;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

 

public class Control {

 

 

//canvas

public void start() {

BaseFrame frame = new BaseFrame("공놀이");

frame.initLayout(frame, 1200, 800);

frame.setVisible(true);

 

MyCanvas2 can = new MyCanvas2();

can.setBounds(50, 200, 1100, 550);

frame.add(can);

can.addKeyListener(new KeyListener() {

 

@Override

public void keyTyped(KeyEvent e) {

 

}

 

@Override

public void keyReleased(KeyEvent e) {

switch (e.getKeyCode()) {

case 37:

can.left = false;

break;

 

case 38:

can.up = false;

break;

 

case 39:

can.right = false;

break;

 

case 40:

can.down = false;

break;

 

case 81:

can.powerUp = false;

break;

 

default:

break;

}

}

 

@Override

public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {

case 37:

can.left = true;

break;

 

case 38:

can.up = true;

break;

 

case 39:

can.right = true;

break;

 

case 40:

can.down = true;

break;

 

//스페이스바 기준

case 32:

can.bulAttack = true;

can.addBall();

break;

 

case 81:

can.powerUp = true;

break;

 

 

default:

break;

}

System.out.println("press: " + e.getKeyCode());

}

});

 

Button btn = new Button("give me more ball!!");

btn.setBounds(50, 50, 150, 100);

frame.add(btn);

 

btn.addActionListener(new ActionListener() {

 

@Override

public void actionPerformed(ActionEvent e) {

 

}

});

}

}

 

 

 

2)더블버퍼링 & 충돌체크

-모니터 출력 더블버퍼링,, (버퍼 : 데이터 저장 임시 공간),  더블버퍼링은 공간 2개로 a공간에서 출력물 그리고, b공간에서 그려진거만 띄워줌.. 그래서 빠른 변화에 대한 잔상이 안남음…

-충돌은 가상의 rec 그려서 그것으로 비교함~ 실제 이미지 크기가 네모이기에, 실제 충돌과 차이 있음

 

비행기게임 충돌 설정

 

overload 방지 위한, 각 영역별 충돌 체크

 

 

Rectangle enemyR = new Rectangle(posXRect, posYRect, widthRect, heightRect); //enemy용 충돌박스

for (int i = 0; i < fireArr.size(); i++) {

Fire fire = fireArr.get(i);

Rectangle tempR = new Rectangle(fire.posXRect, fire.posYRect, fire.widthRect, fire.heightRect); // 총알 충돌박스

if(enemyR.intersects(tempR)) { //만날시, 작동

System.out.println("타격!");

fireArr.remove(i);

i--;

life--;

if(life < 1) {

posXRect = -1000; //맵 밖으로 enemy 날려버리기

 

//적군 어차피 1

 

for (int i = 0; i < bulArr.size(); i++) {

 

Rectangle enemyR = new Rectangle(enemyArr.get(0).enemyX, enemyArr.get(0).enemyY,

100, 100);

 

//총알 각각

Bul bul = bulArr.get(i);

Rectangle tempR = new Rectangle(bul.bulX, bul.bulY, 7, 7);

if(enemyR.intersects(tempR)) {

System.out.println("타격!");

bulArr.remove(i);

i--;

life--;

if(life < 1) {

enemyArr.get(0).enemyX = -1000; //날려버리기

}

}

}

 

//적군 관련 임시생성

int life = 100;

 

      //적군 색 변경

      if(life <= 100) {

              buffg.setColor(Color.black);

      }

     

      if(life <= 50) {

              buffg.setColor(Color.BLUE);

      }

     

      if(life <= 30) {

              buffg.setColor(Color.red);

      }

 

      //적군생성

      for (int i = 0; i < enemyArr.size(); i++) {

         buffg.fillRect(enemyArr.get(i).enemyX, enemyArr.get(i).enemyY, 100, 100);

      }