728x90

안녕하세요. 직접 플레이해보고 작성하는 세번째 모바일 게임 리뷰. 이번엔 "나선영웅전"에 대해 간단히 작성합니다.

해당 게임은 루나라게임즈(LUNARA Games) 개발, 웹젠(WEBZEN) 서비스인 게임입니다.

 

개발사는 중국 개발사이지만, 일본의 유명 일러스트레이터와 유명 성우가 대거 참여하였습니다.

따라서 중국적인 색채보다는 일본색채가 더 강한 게임입니다. 메인캐릭터들 중 닌자가 있구요.

또한 웹젠에서 서비스를 하면서 일본색채를 줄이고 한국 캐릭터를 추가(+한국 성우 기용)했다고 합니다.

 

한국캐릭터 중 하나인 '춘향'은 누적로그인 2일만 채우면 아래처럼 쉽게 얻을 수 있는데, 일러스트가 참 수려하네요 :)

 

 

 

장르를 자세히 표현하자면 캐릭터 수집형 턴제 전략육성 SRPG(시뮬레이션 RPG)입니다.

1) 다양한 영웅 캐릭터를 수집하는 영웅수집 RPG

2) 맵 지형 및 진영을 고려해 전략적인 전투를 즐기는 턴제 SRPG

 

 

<공식 홍보 티저>

 

 

 

 

1. 왜 제목이 '나선영웅전'인가? - 게임배경 스토리

만물이 아직 구분되지 않던 세상, 신비한 나선의 힘은 만물을 깨우고, 광활한 더스티스타 대륙을 만들었습니다. 아래가 더스티스타 대륙의 지도인데요.

더스티 스타 대륙에 있는 국가 중 모든 종족이 함께 어울려 살아가는 중립국 판젤이 주인공들의 무대입니다.

판젤은 성녀의 지혜로운 통치 아래 수백년간 평화를 유지하고 있었습니다. 그러나 어느 순간, 사람들의 악한 욕망을 표출하는 검은 가루가 판젤에서부터 대륙 사방으로 널리 퍼지게 됩니다.

라이온하트 공국 안에선 궁정 싸움이 끊임 없이 지속 되었고, 하늘의 여신을 따르는 신자도 점점 감소하게 됩니다.

남방의 레이요크 공화국은 과학적 발전을 이루며 탄양과 화약을 라이온하트에 겨누게 됩니다. 북방에서 싸움을 지속하던 마계 세력의 절반은 사룡에게 잠식 되어 있었구요.

이런 배경 속에서 우연히 판젤 경비대의 임시 대원이 된 주인공 일행은 검은 가루의 비밀을 파헤치기 위한 모험을 시작하게 됩니다.

 

즉, 나선의 힘으로 탄생된 대륙의 혼란을 해결하는 영웅들의 이야기를 뜻하는 것이, 나선영웅전의 의미이겠네요.

 

 

 

 

2. 턴제 전략형 SPRG? 파랜드 택틱스가 생각나는 추억의 느낌

- 각 스토리마다 최대 5명의 영웅을 배치하여 턴마다 전략적으로 영웅을 사용해 싸워야합니다.

 

- 공격방법은 각 턴마다 칸에 맞춰서 영웅을 원하는 위치에 드래그 하여 이동, 공격대상을 선택합니다.

 

- 영웅과 적은 각각 속성을 지니고 있는데, 아래처럼 상극속성이 존재하고, 이에 따라 데미지가 달리 적용되니 숙지하시는게 좋습니다.

 

- 오의 및 협공 조건은 다음과 같습니다.

 

- 이동력을 억제 시키는 풀숲 조건도 있으며, 지원군 등 영웅 이외의 조건들로 전략을 세울 수 있습니다.

 

그러나 이런 전략 자체를 활용하려면 고레벨로 갈 수록 필요할 것 같습니다. 초반에는 카드 버프나 속성으로 쉽게 깰 수 있는 듯 하구요. 이 게임 또한 이런 턴제 전략을 내세운다는 점에서 자동전투가 없으므로, 사용자가 직접 연계를 구성하면서 전투하는 맛을 느끼게끔 하려는 듯 합니다.

그러나 사실 스토리가 너무 가볍고, 초반 캐릭터들의 대화가 진중한 맛이 없이 가볍기만 했습니다. 라이트한 맛을 원하신다면 재밌을지도 모르겠지만... 사실 대다수의 분들이 캐릭터 대사는 스킵하고 카드 수집하고 턴게임만 할 듯하네요.(즉 스토리는 그저 거들뿐)

 

제가 이전에는 혹평으로 포스팅했던 퍼스트 서머너쪽이 좀 더 전투를 하는 맛 자체에 집중하기에도, 스토리에 집중하기에도 좀더 좋았던 것 같네요.

 

2019/09/08 - [Game/Mobile] - [모바일 게임 리뷰] First Summoner 퍼스트 서머너 - 자동은 없다길래 손맛은 있나 했더니...

 

 

3. 캐릭터 일러스트

- 스토리 주요 캐릭터

 

 

 

- 획득카드

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
728x90

[현상]

1. 나는 2개의 Calendar 객체를 각기 다르게 셋팅해서, 두 객체를 after 메소드로 비교하려고 했다.

2. A 객체는 SimpleDateFormat을 사용하여 setTime()로 날짜를 설정했고

3. B 객체는 set()만 사용하여 날짜를 설정하려고 했다.

 

한마디로 아래와 같은 상황인데

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

예를 들어 오늘이 2019-09-20일 때,

calendarA는 2019-09-18로 설정하고, calendarB는 2019-09-19로 설정하려고 한다면,

after()메소드로 두 객체를 비교하려는 부분에서

calendarB는 19일이지만, A는 20일로 getInstance했을때의 초기값인 오늘로 설정된다는 것이었다.

 

DatePickerDialog를 쓰려고 하다보니 DateSet에서는 int값3개인데 굳이 그걸 또 setTime()으로 쓰기엔 번거로운 면이 있어서

set() 메소드를 써야하는데 이런 결과를 주니까 ?????인 상태

 

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);
    calendarA.getTime(); // 어째서인지 강제로 업데이트해주는 식으로 getTime()메소드를 해줘 갱신되었다

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

그래서 디버깅 연결하면서 로그를 찍어보려고, 위처럼 한번 getTime()을 했더니, 갱신이 되었다.

원래 이렇게 써야했던건가..? 내가 기초가 부족했던건가??? 싶어서 멘붕이 왔는데,

나와 같은 아래의 질문을 가진 사람과 답변이 있는 stackoverflow QnA를 발견...

직렬화 어쩌고 버그같은데...

 

https://stackoverflow.com/questions/1407007/is-calling-javas-calendar-gettime-necessary-to-update-the-object

 

Is calling Java's Calendar.getTime() necessary to update the object?

I came across a comment in some java code that states that getTime() needs to be called to update the Calendar object. Is this true? I cannot find anything that says that this is necessary. Here's...

stackoverflow.com

728x90

'Dev > Java' 카테고리의 다른 글

RxJava 이해  (0) 2020.02.03
[Java] Java SE, EE, ME, FX의 차이  (0) 2019.10.16
[Java] Singleton Pattern 사용시  (0) 2018.10.02
728x90

*본 글은 아래의 글 중 일부를 발췌, 번역한 글입니다.

https://www.androidly.net/223/android-intent-handling-between-activities-using-kotlin

 

 

1. 전달

- 도착 액티비티 입력시, activity::class.java 형식으로 입력 (subActivity.class가 아님)

 

class MainActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)

	button.setOnClickListener {
         val intent = Intent(this, subdActivity::class.java)
         intent.putExtra("keyString", "Androidkey")
         startActivity(nextIntent)  
      }
   }
}

 

putExtra에는 다음과 같이 다양하게 전달 가능

2. 이동한 subActivity 수신

val bundle: Bundle? = intent.extras
val string: String? = intent.getString("keyString")
val myArray: ArrayList<String>? = intent.getStringArrayList("myArray")

 

 

3. Parcelable 혹은 Serializable Data 전달

1) Parcelable과 Serializable의 차이

 (1)  Parcelable은 Android SDK의 Interface
      Serializable은 Java Interface

 (2)  Parcelable은 Parcel object안에 필요로 하는 데이터의 종류가 다 있으며, writeToParcel()메소드로 override 가능함
      Serializable은 원하는 object를 구현해야함

 (3) Parcelable이 Serializable보다 빠름

 

 

2) Parcelable Data 전송

Kotlin에서는 writeToParcel() 메소드로 override할 때 @Parcelize annotations을 제공함

@Parcelize
data class Student(
        val name: String = "Anupam",
        val age: Int = 24
) : Parcelable

 

@Parcelize annotation를 사용하기 위해서는 build.gradle에  다음과 같이 추가해야함

android {
    androidExtensions {
        experimental = true
    }
//..
....
}
val student = Student()
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("studentData", student)
startActivity(intent)

 

3) Serializable Data 전송

data class Blog(
   val name: String = "Androidly", 
   val year: Int = 2018
) : Serializable


val blog = Blog("a", 1)
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("blogData", blog as Serializable)
startActivity(intent)

 

 

 

 

Reference

https://www.androidly.net/223/android-intent-handling-between-activities-using-kotlin

 

Android Intent Handling Between Activities Using Kotlin - Androidly

In this tutorial, we’ll be discussing Android Intents and implement them using Kotlin in our application. What Will You Learn? What are Intents? Types Of Intents? Using Intents Between Activities Sending Data Using Android Intents Using Parcelable and Seri

www.androidly.net

 

 

 

728x90
728x90

안녕하세요. 제가 나중에 기억하려고 작성하는 간단 드라마 리뷰.

오늘은 힐링 요리 드라마, "마카나이소"에 대한 간단 리뷰를 들고 왔습니다.

 

 

'마카나이소', 타이틀

 

"나고야 변두리에 있는 한 하숙집에서
활기찬 하숙인들과 펼치는 아침 저녁식사 이야기

그곳의 이름은 마카나이소(まかない荘)"

 

 

마카나이소의 뜻은


まかない [賄い]   (마카나이)
[명사] 식사를 준비하고 시중을 듦; 또, 이 일을 하는 사람(식모·요리사).(=賄方)


荘  (소) 씩씩할 장/전장 장
13. 별장(別莊)
14. 마을, 부락(部落), 촌락(村落)

요리사 마을 혹은 별장 쯤 되려나요 :)

 

 

간단 정보 & 스토리 & 한줄평

- 해당 드라마는 나고야 TV가 제작한 월요일 심야 드라마입니다. 마카나이소도 나고야에 위치했다는 배경이구요. 2016년 4월부터 6월까지 방송 되었습니다.

 

 

- 사랑하는 사람에게 배신을 당하는 등 다른 사람과의 관계를 피하고 있던 요리사가 하숙집 ‘마카나이소’에서 함께 살아가는 거주자들과 식사를 통해서 관계를 쌓아서 성장해갑니다.

 

- 따라서 각자의 개성적인 인생을 사는 사람들이 한 곳에서 복작거리며 살고, 모두 함께 먹고, 이야기하는 하숙집 스토리입니다. 요리사가 주인공이기 때문에 배경인물들의 스토리와 함께 식사에 대한 이야기가 머부러져 먹방드라마 계열에 합류할 수 있었습니다.

 

- 2017년 10월부터 12월까지 등장인물과 무대를 새롭게 바꾸게 된, 미요시 아야카 주연의 ‘시즌 2’가 방송되었습니다. 시즌2에서는 셰어 하우스 ‘마카나이칸(まかない館)’을 무대로 한다고 하네요.

 

- 대책없이 대책없이 활기차지만 귀여운 하숙집 사람들의 식사

 

 

 

인상깊었던 장면/대사

 

 

에피소드 7. 토치하라의 인생을 발견하는 법

 

"우유에 유산균을 섞으면 치즈나 요구르트가 되고

밀가루에 효모균을 섞으면 빵이 되지.

콩이 누룩곰팡이와 만나면 된장이 되고

낫토균을 만나면 낫토가 된단다."

 

"이거는요?"

 

"삭힌 전갱이 말이지?

전갱이를 쿠사야액젖에 담가 발효시켜 햇볕에 말린거야."

 

"다른 음식과 뭐가 달라요?"

 

"보통 음식이란건 시간이 지나면 썩기 마련이지."

하지만 발효되면 썩지 않고 풍미가 살아난단다.

 

"대단하네요!"

 

"그럼 전 발효되고 싶어요."

 

"무슨말이야?"

 

"전 사람이 나이가 들면서 썩어가는 거라고 생각했는데

지금 얘기를 들어보니까 나이가 들어도 발효되면

새로운 나로 거듭난다는 거잖아요."

 

 

 

...

 

"하지만 많은 일이 있었지.

은퇴후엔 남에게 피해를 주지 않도록

조심하면서 살아온 것 같아.

하지만 이대로 썩어봤자 아무 소용도 없으니까

이제 슬슬 발효되는 게 어떨까

그런 생각이 들어."

 

 

"저도 그럴거에요."

 

728x90

+ Recent posts