2012/03/01 00:23


#0. 제작 경위

어제 UCC 게시판에 Mika 님께서 올리신 '1서버 은하 랭커 위치 지도 1-16위' 에 본인 이름이 없는 걸 보고 조금 아쉬워했음.

한번 만들어볼까? 딱 내 등수(25등)까지 끊어서??

이러면서 시작.


#1. 연구

게임 내 은하 지도는 http://andromedans.conquerx2.com/worldmap/worldmap_20120229.png 에서 주기적으로 업데이트 된다는 건 알고있었음. (대략 1시간 간격?)

사이즈는 1000*1000. (단, 게임 에서는 800*600으로 축소해서 보여짐) 보고 조금 생각함.

여기다 각 유저들 행성을 점으로 찍으면 할 수 있을 거 같았음.


본격 만들기 전에 좌표 시스템을 확인해 봄.

지도상에서 잘 보이는 행성들 (ex. 해적행성, 홀로 떨어진 행성 등등..) 좌표와 그림상 좌표 비교해봄.

약간의 노가다 끝에, 그림이 약간 확대된 형태라는 결론을 내림.

예를 들면, 558-653 행성은 그림 상에서 (576,702) 행성에 찍히는걸로.

식으로 만들어보니 대충 (x - 500) * 1.318+ 500 이렇게 하면 그림의 좌표로 옮길 수 있을 거 같단 결론을 내림.


#2. 데이터 수집 & 프로그래밍

1위(운명님)~25위(본인)까지의 행성 정보를 복사. (간단히 드래그 -> ctrl+c -> ctrl+v -> 저장)

1.txt 부터 25.txt 로 작성.

점을 찍기 위해 간단한 프로그램을 작성.

간단히 설명하자면 1.txt부터 25.txt까지 읽어서 각 유저의 행성을 1000*1000 png 파일로(1.png ~ 25.png) 저장함.

색깔을 어떻게 할까 고민하다가 랜덤으로 찍기로 함. (최대한 안 비슷하길 바라며... 완전 검정이나 완전 흰색은 나오지 말라고 hsv color space에서 saturation과 value는 1로 고정.)

출력파일을 합쳐서 하나로 만들까 하다가, 각각의 파일로 만드는게 #3에서 쉬울 거 같다고 생각함.

프로그래밍 아시는 분은 돌려보셔도... (python 2.7.2, PIL 라이브러리 필요. 퀄리티는 개판임.)


=============================================


# -*- coding: utf-8 -*-

'''

Created on 2012. 2. 29.


@author: azerous

'''


import re

import codecs

import random

import colorsys


import Image, ImageDraw



RATIO = 1.31


def convertnum(n):

    return int((n - 500) * RATIO + 500)


def drawpoints(d, cor, color):

    x_new = convertnum(cor[0])

    y_new = convertnum(cor[1])

    d.point([(i, j) for i in range(x_new, x_new + 3) for j in range(y_new, y_new + 3)], fill=(color[0], color[1], color[2]))


def readfiles(filename, encoding='mbcs'):

    lists = []

    fhandler = codecs.open(filename, 'r', encoding)

    for line in fhandler:

        line = re.split(' ', line)

        coordinates = re.split('-', line[0])

        lists.append((int(coordinates[0]), int(coordinates[1])))

    return lists


if __name__ == '__main__':

    for n in range (1, 26):

        plist = readfiles(str(n) + ".txt")  #eg. '1.txt'

        

        im = Image.new('RGBA', (1000, 1000), (255, 255, 255, 0))    #note. Alpha is 0

        draw = ImageDraw.Draw(im)


        # in order to make image be fixed size(otherwise, when using the photoshop, we get trouble), add border.

        draw.line((0, 0) + (999, 0), fill='black')

        draw.line((0, 0) + (0, 999), fill='black')

        draw.line((999, 0) + (999, 999), fill='black')

        draw.line((0, 999) + (999, 999), fill='black')


        r = random.random()


        color = map(lambda x: int(x * 255) , colorsys.hsv_to_rgb(r, 1 , 1))


        for i in plist:

            drawpoints(draw, i, color)


        im.save(str(n) + '.png', "PNG")

=============================================


#3. 포토샵

여기서부턴 그냥 단순 노가다.

포토샵에 레이어 25+1개 붙여넣고 (별로 어렵지도, 오래걸리지도 않음.)

랭킹, 이름, 점수, 제국 쓰고

이름하고 행성들 최대한 안 겹치게 이리저리 옮기고 (은근 시간걸림)

글씨 잘 보이라고 약간 이펙트 넣고

끝.


#4. 에필로그

게임 제작사에서 행성 정보도 공개하고, 주기적으로 업데이트 한다면,

웹에서 이런 그림 만들어 주는 프로그램 짤텐데......

http://www.conquerx2.com/gamecommunity_bugs/410928