사용자 도구

사이트 도구


language:gamemaker:1-코딩하면서-남기는-메모

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.


language:gamemaker:1-코딩하면서-남기는-메모 [2024/04/23 22:44] (현재) – 만듦 - 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +여기에 일단 적다가.. 언젠가 원래 있어야할 섹션으로 이동
  
 +====== view를 사용한 화면 전환 방식으로 작성한 것 ======
 +
 +  * 은근히 손이 많이 가고 신경 쓰이는게 많아서
 +  * room을 전환하는 방식으로 바꿔보려고 한다.
 +
 +화면 부분, 부분을 분할해서 출력하는 용도가 아니면 룸이 아니어도 되지 않나 싶다. 아직은 활용을 제대로 못하고 있기 때문인지 좌표 때문에 손이 많이 가네.
 +
 +====== with 를 사용할 때, 원래 인스턴스를 쓰려면 ======
 +
 +게임을 정지시키고 싶을때, 현재 화면에 보이는 것들(이것들만 정지시키도 되는 부분이라)
 +instance_deactivate_object()로 필요한 것만 정지시켰으나...
 +
 +뭔가 잘 안됐다. 여러번 반복하면 다운의 원인이 되었다.
 +
 +어떤걸 잘못 쓴걸까.. 반면,
 +
 +instance_deactivate_all(false)와 instance_activate_all()는 매우 잘 되었다.
 +
 +**주의할 점은 deactivate 하고나면 완전 스톱이기 때문에, (내부 로직상태도 멈춘다) 다시 상태 변경이 원활하게 하고 싶으면 먼저 활성화 하고 해야한다.**
 +
 +====== with 를 사용할 때, 원래 인스턴스를 쓰려면 ======
 +<code gml>
 +with( some_inst )
 +{
 +  x = 1; y =1;
 +  id; // id값도 some_inst의 id 값이다. 당연하지만.
 +}
 +</code>
 +이 경우, with(..) 구문을 사용하는 오브젝트(인스턴스)의 변수나 속성을 사용하고 싶다면, **other** 키워드를 사용한다.
 +<code gml>
 +with( some_inst )
 +{
 +  x = 1; y =1;
 +  id; // id값도 some_inst의 id 값이다. 당연하지만.
 +  other.id; // 이 코드를 실행하는 인스턴스의 id를 가리킨다.
 +}
 +</code>
 +====== 오브젝트에 있는 스프라이트의 크기 ======
 +도움말에 있는 내용이지만,
 +  * **sprite_width**, **sprite_height** 는 인스턴스에 할당된 스프라이트의 크기를 리턴하는데,
 +  * **image_xscale, image_yscale** 만큼 확대/축소된 크기를 갖고 있다.
 +  * 스프라이트의 원래 크기를 얻으려면, **sprite_get_width(), sprite_get_height()**를 사용한다.
 +
 +====== Parent 객체 설정 ======
 +  * 부모 객체를 설정해서, 부모에서 설정된 기능을 그대로 따라 하는 것은 아주 편리한 기능.
 +  * 스프라이트까지 상속되지는 않는 모양.
 +
 +특정 이벤트에서 부모 객체의 이벤트를 먼저 호출하고 싶으면,
 +
 +  * DnD
 +    - 이벤트를 선택하고 액션을 추가한다.
 +    - 액션 : Control >> CALL EVENT 를 액션 리스트에 갖다 놓는다.
 +  * code로 해결하려면, <code gml>event_inherited();</code>
 +
 +======= Drawing 함수 ======
 +  * **draw_rectangle()** 함수 마지막 파라미터가 true 면 테두리를, false 면 fill을.
 +
 +====== DrawGUI 이벤트 ======
 +
 +화면 해상도 또는 뷰를 사용하는 화면이 스크롤 되어도,
 +<color darkorange>**draw gui**</color> 이벤트로 그린 것들은 항상 그 자리에 남아 있다.
 +
 +유용하게 잘 써먹자.
 +
 +====== 마우스 좌표 ======
 +
 +  * display_mouse_get_x / display_mouse_get_y : 현재 디바이스(모니터)의 좌표를 리턴한다. 
 +
 +====== 폰트 사용 ======
 +
 +<code gml>
 +// 외부 전역 오브젝트에서, 프로그램이 첫 실행시 설정
 +draw_set_font( fntMain );
 +
 +// 필요한 오브젝트에서 출력해보기 -- 처음설정한 폰트가 그대로 유지되는가?
 +// ** 한글 출력을 위해서는 ini 설정과 한글 스트링 로딩 작업이 필요.
 +draw_text_color( x, y, 'test string', c_lime, c_lime, c_green, c_reen, 1 );
 +</code>
 +
 +====== 적에게 체력 게이지 추가 ======
 +
 +**health**는 플레이어 캐릭터에만 쓸 수 있는 전역 변수라서, 인스턴스 변수를 선언.
 +
 +  * (Events:Create) 추가할때 (Actions:control->Execute Code) 추가 <code gml>
 +// 인스턴스 변수 추가
 +myHealth = 40;
 +</code>
 +  * 충돌처리 이벤트에 (Events:Collision) <code gml>
 +// 충돌한 상대 인스턴스를 삭제
 +with(other) instance_destroy();
 +// 내 (적) 체력을 깍는다.
 +myHealth -= global.currentBulletPower; // 전역 변수로 총알 파워가 10 이다,라고 설정
 +// 체력이 0 이면 죽는 처리
 +if( myHealth < 0 )
 +{
 +    myHealth = 0;
 +    instance_create( x, y, obj_explosion1 );
 +    instance_create( x, y, obj_dropCoin );
 +    instance_destroy();
 +}
 +</code>
 +  * 적 아래쪽에 체력 게이지 추가 (Events:Draw) 추가
 +  * (Events:Draw) 에 (Actions:draw->Draw Self) 추가, 적의 모습은 그려야 하므로.
 +  * (Events:Draw)에  (Actions:control->Execute Code) 추가해서 체력 게이지 그리기<code gml>
 +var x1, y2, x2, y2;
 +// 적기 인스턴스를 중심으로 아래쪽에 작은 체력 게이지 영역을 구한다.
 +// 인스턴스의 0,0을 사용하는 대신 (sprite_xoffset, sprite_yoffset)값을 활용해서 하단 위치를 구한다.
 +x1 = x - sprite_xoffset;        
 +y1 = y + (sprite_yoffset + 2);
 +x2 = x + sprite_xoffset;
 +y2 = y + sprite_yoffset + 6;
 +// draw_healthbar()로 GM에서 기본으로 제공하는 체력 게이지를 그린다.
 +draw_healthbar( x1, y1, x2, y2, myHealth, c_black, c_red, c_red, 0, true, true );
 +</code>
 +
 +====== 스피드 ======
 +
 +  - pc에서 보는 움직이는 속도와 아이폰에서 느낌은 좀 다르다.
 +  - 기본 속도를 4이상 잡아야 빠르게 움직이는 느낌이 난다.
 +    - 프레임률과 룸의 스피드는 개념이 다르다.
 +  - ip4에서는 4 --> 해상도가 세로로 960이나 되다 보니 프레임당 2,3픽셀 움직이는건 거의 안움직이는 것 처럼 보인다.
 +
 +====== 간단한 파티클 ======
 +
 +  * 오브젝트의 오른쪽의 액션 탭에서 'draw' 탭 -> 'Other' -> 'Create Effect'
 +  * 효과용으로 사전 정의된 파티클을 사용할 수 있다.
 +
 +====== 마우스 ======
 +  * 마우스 이벤트는 오브젝트 영역 내에서만 인식
 +  * 전체 화면에서 클릭된 위치를 보려면, 일반 마우스 클릭이 아니라
 +  * 'Add Event' -> 'Mouse' -> 'Global' , 전역 마우스 클릭 이벤트를 설정해야 인식 된다.
 +  * 스프라이트를 포함하지 않는 컨트롤용 오브젝트 같은 곳에서 사용시 유의
 +
 +====== set gravity ======
 +  * 오브젝트에 중력 값과 중력이 적용 되는 방향 (잡아 당기는 방향)을 설정한다.
 +
 +<code gml>
 +/// 특정 오브젝트에 살짝 튀었다가 떨어지는 것을 설정
 +// 오브젝트 생성시 : 살짝 위로 가도록 생성, 생성하는 CreateObject 이벤트에 코드로 추가
 +direction = random_range( 70, 110 );
 +speed = 3;
 +/// 'Set the gravity' 액션을 추가
 +direction = 270 // 다른 direction 과 방향이 같다. ( 0 : right, 90 : up, 180 : left, 270 : down )
 +gravity = 0.2   // 숫자는 임의 입력이 가능하니 여러 숫자로 테스트. 
 +// 0.01도(아주 작은 수) 입력 가능. 
 +// 숫자가 커지면 더 빨리 떨어진다.
 +// check 'Relative' 중력 방향이 연결된 오브젝트에 영향을 받아 direction 값이 상대적으로 달라진다. 일반적으로 쓰려면 off.
 +</code>
 +
 +====== 룸(room) ======
 +  * 룸은 리소스 트리의 'Rooms' 트리에서 맨 위의 것이 자동 로딩 된다.
 +
 +====== 배경 사이에 스프라이트 그리기 ======
 +
 +  * 배경 사이에 스프라이트를 그리고 싶다면,
 +  * Backgroud[0-9] 를 사용할 때,
 +  * 스프라이트보다 먼저 보여질 배경에는 <color darkorange>**Foreground Image**</color>를 체크해주면 된다.
 +
 +====== 버튼과 같이 스프라이트 이미지 각각을 다른 용도로 쓰고 싶을때 ======
 +우선, 스프라이트 애니메이션이 되지 않도록 설정
 +<code gml>
 +image_speed = 0; // 애니메이션 되지 않도록
 +image_index = 0; // 첫번째 이미지만 그려지도록
 +</code>
 +
 +Step 이벤트에서 **image_index**에 스프라이트 번호 0..N을 할당하면 자동으로 이미지가 변경
 +된다.
 +
 +<code gml>
 +// Step 이벤트에서 액션은.. 뭐 알아서. draw 라든지 draw_gui라든지.
 +image_index = 2; // 2 번 이미지를 그린다.
 +//.. 어쩌구 저쩌구.
 +image_index = 1; // 1번 이미지로 바꾼다.
 +</code>