Skip to content

Commit

Permalink
Cannon Game 샘플 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
xtra72 committed Feb 13, 2024
1 parent f8bf1dd commit 8e1474b
Show file tree
Hide file tree
Showing 116 changed files with 8,595 additions and 2,370 deletions.
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
7 changes: 6 additions & 1 deletion 00.index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,13 @@
* link:./05.abstract.adoc[05. 간추려 사용하기]
* link:./06.new_object_box.adoc[06. 새로운 물체의 출현]
* link:./07.simple_world.adoc[07. 조금 더 단순하게]
* link:./08.upside_down.adoc[08. 꺼꾸로 세상]
* link:./08.upside_down.adoc#[08. 꺼꾸로 세상]
* link:./09.external_effect.adoc[09. 외부 효과]
* link:./10.self_moving_world.adoc[10. 스스로 움직이는 세상]
* link:./11.cannon_game.adoc[11. 대포 게임]
* link:./12.break_bricks.adoc[12. 벽돌 깨기]

---

* link:./r1.graphics.adoc[R1. Graphics]
* link:./r2.event_driven_programming.adoc[R2. Event Driven Programming]
2 changes: 1 addition & 1 deletion 08.upside_down.adoc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
:stem: latexmath

= 8. 거꾸로 세상
= 8. 거꾸로 세상[[top]]

**Keyword**

Expand Down
134 changes: 59 additions & 75 deletions 11.cannon_game.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2,100 +2,84 @@

= 11. 게임 만들기

**Keyword**
== 11.1. 요구 사항

* GUI
* 포탄을 발사하여 목표물을 맞추는 게임
+
image::./image/cannongame.jpeg["Cannon Game"]
* 게임장
** 보이지 않는 벽으로 둘러쌓여 있어, 포탄이 외부로 벗어나지 못하도록 함
** 포탄이 벽에 맞을 경우
*** 속도 감소
*** 파괴
*** 멈춤 등 다양한 형태로 구성 가능
* 포 제어
** 포탄 발사 각도/속도 조절 가능
** 각도에 따라 포가 상하로 움직을 수 있음(추가 기능)
** 속도에 따라 포의 길이가 달라질 수 있음(추가 기능)
* 외부 환경
** 날아가는 포탄에는 외부 환경의 영향 작용
** 중력(아래로 끌어 내리는 힘)
** 바람(외쪽에서 오른쪽이나 오른쪽에서 왼쪽으로 가해지는 힘)
* 장애물
** 그림에서의 회색과 같은 장애물 구성 가능
* 목표물
** 특정 위치 또는 일정 범위내에서 자유롭게 생성
** 포탄을 맞으면 파괴됨
** 목표물이 파괴대면 새로운 위치에 새로운 목표물 생성(추가 기능)
* 반사 계수 적용
** 공간을 차지하는 모든 구성 요소들은 반사 계수를 가짐
** 두종류의 물체가 충돌할 경우, 물체들의 반사 계수 곱으로 처리

== 11-1. 게임 구성 요소 만들기
== 11.2. 구성요소 만들기

게임 화면에는 다양한 물체들에 존재할 수 있다.
=== 11.2.1. 영역을 갖는 요소

포탄을 발사하는 포, 포탄이 튕겨져 나오는 벽이나 물체, 포탄이 박혀 버리는 늪지대 그리고 포탄으로 맞추면 점수를 얻을 수 있는 대상 물체 등이 있다.
* 요소들은 일정 영역을 차지함
* 중심 위치를 갖고, 폭과 높이의 크기를 가짐
* 어떠한 힘에 의해 이동 가능
* 요소들간 충돌이 가능하며,
* 충돌시 반사를 위한 일정한 상수를 가짐

{empty} +
=== 11.2.2. 그려지는 요소

=== 포 만들기
* 요소중 일부는 그려짐
* 그려짐은 Graphics context가 주어질 때만 가능

* 포탄을 발사하는 물체로서 포탄의 각도, 세기를 조정할 수 있다.
* 포신의 끝에서 포탄이 발사된다.
* 포신은 한쪽이 고정되어 있고, 다른 한쪽은 원을 그리며 회전할 수 있다.
=== 11.2.3. 움직이는 요소

{empty} +
* 요소 중 일부는 움직임
* 움직임을 위한 방향이 있는 힘을 가지고,
* 단위 시간마다 움직일 수 있으며,
* 방향이나 힘의 변경도 가능

=== 포탄 만들기
=== 11.2.4. 튕겨지는 요소

* 포탄은 물체에 부딪힐 경우 터지거나 튕길 수 있다.
* 요소 중 일부는 다른 요소와 충돌 후 반사됨

{empty} +
== 11.3. 공간 만들기

=== 늪지대 만들기
=== 11.3.1. 기본 공간

* 늪지대에서는 어떠한 포탄도 튕기지 않는다.
* 포탄이 늪지대에 빠지면 해당 게임은 목표물을 맞히지 못한 것이다.
* 늪지대가 반드시 바닥에 위치할 필요는 없다.
* 요소들을 가지며,
* Graphics context가 주어지면, 요소들이 그려질 수 있도록 지원함

{empty} +
=== 11.3.2. 움지이는 공간

=== 목표물 만들기
* 공간에 존재하는 요소를 단위시간마다 이동 시킴
* 이동 가능한 요소만 이동
* 단위 시간의 변경이 가능하고,
* 바람, 중력등 외부 영향 힘이 존재함

* 포탄을 맞으면 게임이 승리로 끝난다.
=== 11.3.3. 충돌하는 공간

== 11-2. GameWorld class
* 구성 요소들간 충돌할 수 있는 공간
* 요소를 이동시키고 다른 요소와 충돌시 요소마다 정해진 규칙에 따라 추가 기능을 수행 시킴

=== 정의
=== 11.3.4. 게임 공간

* 게임이 실행되는 공간으로 다용한 구성 요소가 포함된다.
** 대포
** 장애물
** 목표물

* 게임 운영에 필요한 제어가 추가된다.
** 포탄 발사
** 초기화

* 게임 내에서 발생하는 사건(?)을 외부로 알리기 위한 방법 제공
** 포탄 발사 이벤트
*** 목표물 맞히기가 끝나기 전까지 다음 포탄 발사와 같이 UI를 제어할 수 있다.
** 목표물 맞히기 성공
*** 점수를 증가시키고, 다음 장면을 준비한다.
** 목표물 맞히기 실패
*** 실패 횟수를 증가시키고, 동일한 환경에서 다시 실행할 수 있도록 준비한다.

==== Variable

* 구성 요소 목록
* 발사 횟수
* 성공 횟수
* 게임 상태

==== Method

* 포탄 발사 (fire)
* 초기화 (init)
* 포탄 발사 준비 확인(isReady)
* 포탄 발사 횟수(getNumberOfFire)
* 성공 횟수(getNumberOfHit)

== 11-3. Game class

* 게임을 구성할 Frame
* 다양한 component를 이용하여 게임 인터페이스 구성
* 인터페이스와 게임 화면이 연결될 수 있도록 지원한다.

=== 화면 구성하기

* 게임 화면을 구성한다.

=== Exam-11-3-1. JFrame을 확장하여 Game Frame을 정의하고, 다음에 나열된 기능 지원을 위한 component를 추가하여 배치한다

* 게임 화면을 추가한다.
* 포탄 발사 버튼을 추가한다.
* 외부 효과인 바람 세기를 위한 슬라이드를 추가한다.
* 점수판을 추가한다.

=== 제어 연결

* 구성된 화면에서 component가 동작할 수 있도록 동작을 추가해 보자.
* 내부 요소가 벗어날 수 없는 닫힌 공간
* 이동하지 않는 요소들의 벽으로 둘러 쌓인 공간

---

Expand Down
72 changes: 72 additions & 0 deletions example/chapter-r1/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.nhnacademy</groupId>
<artifactId>chapter-r1</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>

<url>http://maven.apache.org</url>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-console-standalone -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-console-standalone</artifactId>
<version>1.10.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.22.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.22.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<classpathPrefix>lib/</classpathPrefix>
<addClasspath>true</addClasspath>
<mainClass>com.nhnacademy.exam090201.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<locale>ko_kr</locale>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.nhnacademy.exam01;

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ExamAbsoluteLayout {
public static void main(String[] args) {
JFrame frame = new JFrame();

frame.setSize(400, 300);
frame.setLayout(null);

JPanel world = new JPanel();
world.setBounds(10, 10, 340, 230);
world.setBackground(Color.WHITE);
frame.add(world);

JButton fireButton = new JButton("Fire");
fireButton.setBounds(20, 250, 50, 30);

frame.add(fireButton);

frame.setEnabled(true);
frame.setVisible(true);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.nhnacademy.exam01;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class ExamBorderLayout {
public static void main(String[] args) {
JFrame frame = new JFrame();

frame.setSize(400, 300);

frame.setLayout(new BorderLayout());

JButton[] buttons = new JButton[5];
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton("버튼" + (i + 1));
}

frame.add(buttons[0], BorderLayout.EAST);
frame.add(buttons[1], BorderLayout.WEST);
frame.add(buttons[2], BorderLayout.SOUTH);
frame.add(buttons[3], BorderLayout.NORTH);
frame.add(buttons[4], BorderLayout.CENTER);

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);

frame.setEnabled(true);
frame.setVisible(true);
}
}
Loading

0 comments on commit 8e1474b

Please sign in to comment.