[ONScripter] 나는 이렇게 컨버터를 제작했다. #009 타치에를 스크립트에 넣쟈 강의이야기 | Posted on 2011. 9. 7. 19:25
이 강의는 MPPC (미소녀 & PocketPC)의 Pure Ani에게 저작권이 있습니다.
일단 사담을 살짝 하자면..
제가 만든 컨버터로 컨버팅을 해보신분이 계실지 모르겠지만..
개인적으로 저는 효과를 마구 넣는거 싫어합니다.
게임의 속도 저하 및 팅김의 원인이 되는 주요 문제라..;;
그렇기 때문에 화면을 흔드는 명령어인 위의 명령어는 생략합니다.
배경에도 타치에 명령어가 있어서 사용한적이 있으니 이번은 편하게 가능합니다.
그냥 복사해서 붙여넣기 하면 되는 문제니까요.
소스가 길기 때문에, 한파트만 올립니다.
elsif ($line =~ /^\[m_p(\d*)(l|r|)\]$/)
# 만일 라인에 [m_p숫자(l 혹은 r 혹은 빈칸)] 일경우.
# ^의 경우는 맨앞, $의 경우는 맨 뒤를 지칭합니다.
# ^$의 경우 맨앞바로 뒤에 맨뒤가 있으니 빈라인을 말합니다.
{
my $number = $1;
# number 변수에 $1의 값을 넣습니다.
if ($2 =~ /l/)
# 만일 $2에 l이 존재할경우.
{
print OUT "ld l,\"image\\miu".$number."\.png\"\nprint 1\n";
# ld l,"image\miu숫자.png" 줄바꿈 print 1을 작성합니다.
}
elsif ($2 =~ /r/)
# 만일 $2에 r이 존재할 경우.
{
print OUT "ld r,\"image\\miu".$number."\.png\"\nprint 1\n";
# ld r,"image\miu숫자.png" 줄바꿈 print 1을 작성합니다.
}
else
# $2에 l도 r도 없는 경우.
{
print OUT "ld c,\"image\\miu".$number."\.png\"\nprint 1\n";
# ld c,"image\miu숫자.png" 줄바꿈 print 1을 작성합니다.
}
}
한 화면에 다 보이지 않지만 저렇게 됩니다.
(참고로 현재 제가 작성한 컨버터 라인은 총 380라인.)
하지만 스크립트를 계속 훝다보면 지우는 명령어도 저렇게 존재를 하게 되는데..
오른쪽에 표시된 타치에를 지우는 명령어군요.
근데 저 한줄만으로는 어디를 지우는지 잘 모르겠네요.
그래서 지금까지 코딩한 타치에 코드를 수정을 하겠습니다.
전 강의에서 if ($bg[$i] =~ /m_hide|z_hide|s_hide/)로 작성했던것을 모두 지우고 이렇게 바꿉니다.
if ($bg[$i] =~ /(\S)_hide/)
# 만일 변수bg[$i]에 hide가 존재한다면 앞의 문자 하나를 변수 $1에 넣는다.
{
print OUT "cl ";
# cl 를 작성한다.
# 일단 지우는 구문으로 들어오게 되니 먼저 cl 을 작성합니다.
# 나중에 코드 전체를 작성해도 좋습니다.
if ($1 =~ /m/)
# 만일 변수 $1에 m이 존재한다면..
{
if ($tm == 1)
# 만일 변수 $tm에 1이 들어가있다면..
# 타치에의 약자 t를 줘서 각 캐릭터가 어디에 출력되어있는지 저장할 변수입니다.
# 1은 왼쪽, 2는 오른쪽, 3은 중앙, 0은 미출력 입니다.
{
print OUT "l\nprint 1\n";
# l 줄바꿈 print 1을 작성합니다.
}
elsif ($tm == 2)
# 만일 변수 $tm에 2가 들어가 있다면..
{
print OUT "r\nprint 1\n";
# r 줄바꿈 print 1을 작성합니다.
}
else
# $tm의 변수에 1과 2 모두 안들어가있을때.
# 일단 지우는 명령어는 화면에 출력된것을 지운다는것을 가정, 바꿔말해 $tm에는 1, 2, 3중 하나의 값이 꼭 들어가있다고 가정하였으니, 1과 2가 없다면 자동적으로 3이 됩니다.
{
print OUT "c\nprint 1\n"
# c 줄바꿈 print 1을 작성합니다.
}
$tm = 0;
# 화면의 출력된 이미지를 지웠으니 변수 $tm에 0을 넣습니다.
}
elsif ($1 =~ /z/)
{
if ($tz == 1)
{
print OUT "l\nprint 1\n";
}
elsif ($tz == 2)
{
print OUT "r\nprint 1\n";
}
else
{
print OUT "c\nprint 1\n"
}
$tz = 0;
}
elsif ($1 =~ /s/)
{
if ($ts == 1)
{
print OUT "l\nprint 1\n";
}
elsif ($ts == 2)
{
print OUT "r\nprint 1\n";
}
else
{
print OUT "c\nprint 1\n"
}
$ts = 0;
}
}
중간 중복적인 사항은 주석 패스합니다.
(전부다 일일이 달다가는 끝이 안날듯하니;;)
그런다음 타치에 출력명령어에는 아래의 라인처럼 추가를 했습니다.
elsif ($line =~ /^\[s_k(\d*)(l|r|)\]$/)
{
my $number = $1;
if ($2 =~ /l/)
{
print OUT "ld l,\"image\\mis_k".$number."\.png\"\nprint 1\n";
$ts = 1;
# 타치에 변수중 하나인 $ts에 1을 넣습니다.
}
elsif ($2 =~ /r/)
{
print OUT "ld r,\"image\\mis_k".$number."\.png\"\nprint 1\n";
$ts = 2;
# 타치에 변수중 하나인 $ts에 2을 넣습니다.
}
else
{
print OUT "ld c,\"image\\mis_k".$number."\.png\"\nprint 1\n";
$ts = 3;
# 타치에 변수중 하나인 $ts에 3을 넣습니다.
}
}
대충 이러한 느낌으로..
스크립트를 살펴보면 타치에 명령어가 한가지 더 있는데 그건 이러한 방식입니다.
이것을 작성해보겠습니다.
참고로 출력과 삭제 둘다 저 방식으로 존재를 하더군요.
elsif ($line =~ /^\[autochar (.*)\]$/)
# 만일 라인에 [autochar 문자들]이 존재할경우
{
my @ta = split(/ /,$1);
# 배열변수 ta에 문자들을 스페이스바 기준으로 나눠서 저장한다.
for (my $i=0; $i < @ta; $i++)
# 변수 $i가 0에서부터 배열변수 @ta가 끝날때까지 돈다.
{
if ($ta[$i] =~ /(\S)_hide/)
{
이 이후는 elsif ($line =~ /\[cross storage=(.*)\]/) 파트를 그대로 작성합니다.
작성자 Pure Ani
출 처 MPPC (미소녀 & PocketPC)
일단 사담을 살짝 하자면..
제가 만든 컨버터로 컨버팅을 해보신분이 계실지 모르겠지만..
개인적으로 저는 효과를 마구 넣는거 싫어합니다.
게임의 속도 저하 및 팅김의 원인이 되는 주요 문제라..;;
그렇기 때문에 화면을 흔드는 명령어인 위의 명령어는 생략합니다.
배경에도 타치에 명령어가 있어서 사용한적이 있으니 이번은 편하게 가능합니다.
그냥 복사해서 붙여넣기 하면 되는 문제니까요.
소스가 길기 때문에, 한파트만 올립니다.
elsif ($line =~ /^\[m_p(\d*)(l|r|)\]$/)
# 만일 라인에 [m_p숫자(l 혹은 r 혹은 빈칸)] 일경우.
# ^의 경우는 맨앞, $의 경우는 맨 뒤를 지칭합니다.
# ^$의 경우 맨앞바로 뒤에 맨뒤가 있으니 빈라인을 말합니다.
{
my $number = $1;
# number 변수에 $1의 값을 넣습니다.
if ($2 =~ /l/)
# 만일 $2에 l이 존재할경우.
{
print OUT "ld l,\"image\\miu".$number."\.png\"\nprint 1\n";
# ld l,"image\miu숫자.png" 줄바꿈 print 1을 작성합니다.
}
elsif ($2 =~ /r/)
# 만일 $2에 r이 존재할 경우.
{
print OUT "ld r,\"image\\miu".$number."\.png\"\nprint 1\n";
# ld r,"image\miu숫자.png" 줄바꿈 print 1을 작성합니다.
}
else
# $2에 l도 r도 없는 경우.
{
print OUT "ld c,\"image\\miu".$number."\.png\"\nprint 1\n";
# ld c,"image\miu숫자.png" 줄바꿈 print 1을 작성합니다.
}
}
한 화면에 다 보이지 않지만 저렇게 됩니다.
(참고로 현재 제가 작성한 컨버터 라인은 총 380라인.)
하지만 스크립트를 계속 훝다보면 지우는 명령어도 저렇게 존재를 하게 되는데..
오른쪽에 표시된 타치에를 지우는 명령어군요.
근데 저 한줄만으로는 어디를 지우는지 잘 모르겠네요.
그래서 지금까지 코딩한 타치에 코드를 수정을 하겠습니다.
전 강의에서 if ($bg[$i] =~ /m_hide|z_hide|s_hide/)로 작성했던것을 모두 지우고 이렇게 바꿉니다.
if ($bg[$i] =~ /(\S)_hide/)
# 만일 변수bg[$i]에 hide가 존재한다면 앞의 문자 하나를 변수 $1에 넣는다.
{
print OUT "cl ";
# cl 를 작성한다.
# 일단 지우는 구문으로 들어오게 되니 먼저 cl 을 작성합니다.
# 나중에 코드 전체를 작성해도 좋습니다.
if ($1 =~ /m/)
# 만일 변수 $1에 m이 존재한다면..
{
if ($tm == 1)
# 만일 변수 $tm에 1이 들어가있다면..
# 타치에의 약자 t를 줘서 각 캐릭터가 어디에 출력되어있는지 저장할 변수입니다.
# 1은 왼쪽, 2는 오른쪽, 3은 중앙, 0은 미출력 입니다.
{
print OUT "l\nprint 1\n";
# l 줄바꿈 print 1을 작성합니다.
}
elsif ($tm == 2)
# 만일 변수 $tm에 2가 들어가 있다면..
{
print OUT "r\nprint 1\n";
# r 줄바꿈 print 1을 작성합니다.
}
else
# $tm의 변수에 1과 2 모두 안들어가있을때.
# 일단 지우는 명령어는 화면에 출력된것을 지운다는것을 가정, 바꿔말해 $tm에는 1, 2, 3중 하나의 값이 꼭 들어가있다고 가정하였으니, 1과 2가 없다면 자동적으로 3이 됩니다.
{
print OUT "c\nprint 1\n"
# c 줄바꿈 print 1을 작성합니다.
}
$tm = 0;
# 화면의 출력된 이미지를 지웠으니 변수 $tm에 0을 넣습니다.
}
elsif ($1 =~ /z/)
{
if ($tz == 1)
{
print OUT "l\nprint 1\n";
}
elsif ($tz == 2)
{
print OUT "r\nprint 1\n";
}
else
{
print OUT "c\nprint 1\n"
}
$tz = 0;
}
elsif ($1 =~ /s/)
{
if ($ts == 1)
{
print OUT "l\nprint 1\n";
}
elsif ($ts == 2)
{
print OUT "r\nprint 1\n";
}
else
{
print OUT "c\nprint 1\n"
}
$ts = 0;
}
}
중간 중복적인 사항은 주석 패스합니다.
(전부다 일일이 달다가는 끝이 안날듯하니;;)
그런다음 타치에 출력명령어에는 아래의 라인처럼 추가를 했습니다.
elsif ($line =~ /^\[s_k(\d*)(l|r|)\]$/)
{
my $number = $1;
if ($2 =~ /l/)
{
print OUT "ld l,\"image\\mis_k".$number."\.png\"\nprint 1\n";
$ts = 1;
# 타치에 변수중 하나인 $ts에 1을 넣습니다.
}
elsif ($2 =~ /r/)
{
print OUT "ld r,\"image\\mis_k".$number."\.png\"\nprint 1\n";
$ts = 2;
# 타치에 변수중 하나인 $ts에 2을 넣습니다.
}
else
{
print OUT "ld c,\"image\\mis_k".$number."\.png\"\nprint 1\n";
$ts = 3;
# 타치에 변수중 하나인 $ts에 3을 넣습니다.
}
}
대충 이러한 느낌으로..
스크립트를 살펴보면 타치에 명령어가 한가지 더 있는데 그건 이러한 방식입니다.
이것을 작성해보겠습니다.
참고로 출력과 삭제 둘다 저 방식으로 존재를 하더군요.
elsif ($line =~ /^\[autochar (.*)\]$/)
# 만일 라인에 [autochar 문자들]이 존재할경우
{
my @ta = split(/ /,$1);
# 배열변수 ta에 문자들을 스페이스바 기준으로 나눠서 저장한다.
for (my $i=0; $i < @ta; $i++)
# 변수 $i가 0에서부터 배열변수 @ta가 끝날때까지 돈다.
{
if ($ta[$i] =~ /(\S)_hide/)
{
이 이후는 elsif ($line =~ /\[cross storage=(.*)\]/) 파트를 그대로 작성합니다.
작성자 Pure Ani
출 처 MPPC (미소녀 & PocketPC)