Mar 5, 2021 - Java 16일차
*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를 그려서 그것으로 비교함~ 실제 이미지 크기가 네모이기에, 실제 충돌과 차이 있음
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);
}