웹마스터 팁

http://funmuhan.com/avatar/avatar_exam.php아바타를 그려주는 소스입니다.
서버에서 GD를 지원해야 하며 GD를 지원하지 않으면 사용하실 수 없습니다.
개인 서버라면 리눅스에서는 PHP 컴파일시 GD옵션을 주시고 윈도우즈에서는
보통 기본적으로 GD가 지원됩니다. (그렇죠?.. 아니면.. GD깔아주세요 -0-..)

아래 보여지는 소스는 제가 운영에 참가하고 있는 게임에서 사용자들이 입은 장비를
홈페이지에서 아바타로 적용시키기 위해 만든 소스 입니다.
그래서 바로 가져다 쓰실수는 없겠지만 조금만 수정하신다면 사용하실 수 있습니다.

또한 이 소스는 사용자 의상데이타가 파일로 저장된것을 사용합니다.
DB로 저장하시려면 아래 '사용자의상정보가 담긴 화일 로드' 부분을 손보시면 됩니다.

의상 이미지 화일은 66*150으로 셋팅되어 있습니다. 크기 변경시 해당 부분 수정하시면 됩니다.

의상 이미지는 투명이미지를 지원하는 png를 사용했습니다. gif은 GD에서 기본적으로는 지원하지
않기 때문입니다.gif을 사용하시려면 gif을 지원하는 GD를 까시면 됩니다.

아바타가 그려지는 기본원리에 대한 설명

GD함수는 이미지관련함수입니다.
우리가 아바타에서 사용하려는 GD함수는 imagecreatefromPNG,imagePNG,imagecopy,imagedestroy
입니다.
간단히 설명하자면
ImageCreateFromPNG함수는 해당 PNG화일을 불러오는 기능을 합니다.
ImagePNG함수는 GD처리된 이미지를 화일로 저장할때 사용합니다.
ImageCopy(arg1,arg2,,,,,width,height)함수는
이미지 처리 함수중 하나로서 arg1이미지에 arg2이미지를 width,height크기에 덮어씌우는 기능을 합니다.
ImageDestroy함수는 사용된 이미지를 제거하는데 사용합니다.(화일을 지우는 의미는 아닙니다.)
자세한 함수설명은 해당 서적이나 사이트를 참고하시기 바랍니다.

imageCreateFromPNG로 불려온 이미지는 ImageCopy함수에 의해 합쳐집니다.
합쳐진 이미지의 상태는 쉽게 설명하자면 본이미지가 아래층 layer에 있고
그 다음 합쳐지는  이미지가 그 위층 layer에 합쳐집니다.
그렇게 되면 아바타의 기본몸통에 의상이 그 위에 겹쳐져서 그려지게 됩니다.
GD함수는 이렇게 이미지처리만 해줍니다.그럼 처리된 이미지를 화일로 저장해야 하는데
그때 사용하는 함수가 ImagePNG입니다. GIF화일이라면 ImageGIF과 같이 사용합니다.
화면에 뿌려줄때는 html태그인 img태그를 쓰셔야 합니다.

<?
/*
소스파일  :draw_avatar.php
작성자     :zzony
작성일     :4월 26일
수정일     :4월 29일
용      도  :Drawing Avatar
*/


/************************************************************/
/*  기본세팅 로드                                          */
/***********************************************************/
include "db_config.inc";
$home_id=$loginuserid;
$avatar_path="avatar/images/";


/**********************************************************************/
/*게임아이디와 홈페이지아이디 매치 (홈에서만 사용할경우 구현필요없음 )*/
/**********************************************************************/
$quex = "select mudid from avatar_mud_id where homeid="" . $home_id . """;
$reselt = mysql_query($quex,$db_connectx);
$mud_id = mysql_fetch_array($reselt);

/*********************************************************
                사용자의상정보가 담긴 화일 로드
            ex)사용자의상정보가 담긴 화일. zzony.ava        
                        {하미스릴} {흰갑옷}
                        (null)
                        {하벌쳐} {빨러쉬}
                        {파예랑}의 {빨빨간 몸빼바지}
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        (null)
                        {파쌍안경}
                        (null)  
위 구성에서 입지 않은 몸 부분.. 은 null처리하며 구조 변경시 별도의 수정필요.
****************************************************************************/
$file_name="avatar/mud_link/" . $mud_id[0];
$file=fopen($file_name,"r");
$wear=fread($file,filesize($file_name));
fclose;
$datax=split("n",$wear);

/************************************************************
          의상이름과 매치되는 이미지화일탐색  저장                              
// BODY           0
// ARMS           1
// LEGS            2
// NECK            3
// HANDS          5
// HEAD            6
// FEET             7
// FINGER         8
// FINGER1       8
// FINGER2       9
// HELD            16
// SHIELD         17
// FACE            18
// WIELD           19  

DB구조

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| uid   | int(11)      |      | PRI | NULL    | auto_increment |
| name  | varchar(128) |      |     |         |                |
| image | varchar(128) |      |     |         |                |
+-------+--------------+------+-----+---------+----------------+      

******************************************************************/
for ($i=0;$i<20;$i++) {
    $sqlx = "select image from avatar_mud_table where name="" . $datax[$i] . """;
        $resultx=mysql_query($sqlx,$db_connectx);
        $db_image[$i]=mysql_fetch_array($resultx);
}

/***********************************************************/
/*   아바타 이미지 처리 부분                               */
/***********************************************************/

/*기본세팅*/
$img_mom=ImageCreateFromPng("avatar/images/base_mom.png");
$img_head=ImageCreateFromPng("avatar/images/base_head.png");
imagecopy($img_mom,$img_head,0,0,0,0,66,150);
$image_id="avatar/character/".$home_id . ".png";
imagePng($img_mom,$image_id);
$vir_img=imagecreatefrompng($image_id);
imagedestroy($img_mom);
imagedestroy($img_head);

/*얼굴변경*/
if ($db_image[18][image]){
        $faces=imagecreatefrompng($avatar_path.$db_image[18][image]);
        imagecopy($vir_img,$faces,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($faces);
}
else {
        $faces=imagecreatefrompng("avatar/images/base_head.png");
        imagecopy($vir_img,$faces,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($faces);
}
/*머리변경*/
if  ($db_image[6][image]){
        $heads=imagecreatefrompng($avatar_path.$db_image[6][image]);
        imagecopy($vir_img,$heads,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($heads);
}
else {
        $heads=imagecreatefrompng("avatar/images/base_hair.png");
        imagecopy($vir_img,$heads,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($heads);
}
/*하의변경*/
if ($db_image[2][image]){
        $pants=imagecreatefrompng($avatar_path.$db_image[2][image]);
        imagecopy($vir_img,$pants,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($pants);
}
else {
        $pants=imagecreatefrompng("avatar/images/base_pants.png");
        imagecopy($vir_img,$pants,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($pants);
}

/*상의변경*/
if ($db_image[0][image]){
        $shirts=imagecreatefrompng($avatar_path.$db_image[0][image]);
        imagecopy($vir_img,$shirts,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($shirts);
}
else {
        $shirts=imagecreatefrompng("avatar/images/base_shirts.png");
        imagecopy($vir_img,$shirts,0,0,0,0,66,150);
        imagePng($vir_img,$image_id);
        imagedestroy($shirts);
        imagedestroy($vir_img);
}
/*아바타 이미지 표현 */
echo "      <img src='avatar/character/" .$home_id . ".png' border=0 >";
mysql_close($db_connectx);
?>

여기까지가 소스입니다.
이 소스는 사용자가 아바타를 보게 될때마다 그려줍니다.속도면에서 안좋습니다만
이렇게 구성한 이유는 게임상에서 장비가 수시로 변하기 때문입니다.
여러분들이 홈페이지에서 사용하실때는 그럴 필요가 없으니 사용자가 의상선택후 저장할때만 처리해주면 되겠군요.
그리고 뿌려주실때는 ID.png화일만 불러주시면 되겠습니다.
그런 수정은 각자의 홈페이지 상황에 맞게 수정하시기 바랍니다.

그리고 제로보드에 적용하시려면 다음처럼 해주시면 됩니다.
예를 들어 코멘트작성한 사용자 아바타를 코멘트아이디옆에 표현할때 제가 사용한 방법입니다.
제로보드의 view.php에서

// 코멘트 출력;;
이란 곳이 있는데 이부분에다가 다음을 추가해주시면 됩니다.

        if($c_data[ismember]>0){//회원이라면
        if(!$connect) $connect=dbConn(); // DB 연결
        $avatar_temp=mysql_fetch_row(mysql_query("select user_id from zetyx_member_table where no={$c_data[ismember]}"));
        $avatar_id=$avatar_temp[0];
                if(file_exists("../avatar/character/" . $avatar_id . ".png")){
                        $avatar_confirm_temp=mysql_fetch_row(mysql_query("select homeid from avatar_mud_id where homeid="".$avatar_id ."""));
                        $avatar_confirm=$avatar_confirm_temp[0];
                        if($avatar_id==$avatar_confirm){
                        $comment_name="<img src='../avatar/character/" . $avatar_id . ".png' width='33' height='75' border=0 align='absmiddle'>".$comment_name;
                        }
                }
        }

기타 아바타를 표현해주고 싶은곳이 있다면 위와같은 식으로 view파일에 추가해주시면 됩니다.


좀 더 쉽게 설명하려고 글을 썻다가 .. 너무 난잡해지는 경향이 있어서 간단히 설명을 붙였습니다.
궁금하신게 있으시거나 사용상에 문제가 있다면 코멘트 달아주세요.최대한 자세히 설명해드리겠습니다.