2012-06-07 3 views
1

2D 오브젝트 편집기를 작성하여 기본 프로그램의 UI를 더 빨리 만들 수 있습니다. 나는 비트 맵을 전혀 사용하지 않고있다. 대신 게임 루프에서 함수 호출로 프리미티브를 그리는 것입니다. 지금까지는 문제가 없었지만 런타임 중에 오브젝트의 색상을 변경하는 방법을 알고 싶습니다.Allegro 5에서 런타임 동안의 프리미티브 색상 변경

기본 개념은 색상에 변수를 사용하고 사용자가 해당 변수의 값을 변경하는 함수를 호출하면 색상이 변경된다는 것입니다. 단순한. 예 :

void runColor(){ 
    ALLEGRO_COLOR color = NULL; 

    if(event.mouse.button&1) 
     color = al_map_rgb(255, 0, 0); 
    else 
     color = al_map_rgb(0, 255, 0); 

    al_draw_filled_rectangle(firstXval, firstYval, secondXval, secondYval, color); 
} 

불행히도 이것은 작동하지 않습니다. 비슷한 코드를 사용하면 오브젝트가 그려지지 않습니다. 컴파일 오류가없고 런타임 오류가없고 아무것도 없습니다. 대신, 객체는 색상이 없으므로 보이지 않습니다. 사실은 객체가 실제로 만들어 졌음을 확인했습니다. Sooo 나는 색 변수가 어떻게 든 올바른 타입이라는 것을 의미하지만, 그 함수가 반환하는 값과 같게 설정되었을 때 al_map_rgb()의 값을 유지하지 않는다고 생각합니다. 그렇지 않다면 al_draw 함수의 인수가 될 수 없기 때문에 반환해야한다는 것을 알고 있습니다.

다른 draw 함수를 사용하는 else if 문이 있다면 간단하게 작성할 수 있지만, 단순해야하는 무언가를 해결하는 많은 여분의 구성 요소보다 위의 코드와 같은 간단한 간단한 번들을 사용하고 싶습니다. 나는 덕트 테이프에 해당하는 코드를 사용하지 않기를 선호합니다.

그래서 문제는 아마도 al_map_rgb()ALLEGRO_COLOR의 값을 반환한다는 가정과 관련이 있다고 생각되지만 확신 할 수 없습니다. 너희들이 기꺼이 제안을 할 의향이 있니?

답변

0

우선, 아무런 가정 할 필요가 없습니다. the manual에서 볼 수 있듯이 al_map_rgb()은 실제로 ALLEGRO_COLOR 개체를 반환합니다.

해당 코드는 아무 문제가 없습니다. x,y 값이 잘못되었거나 대상 비트 맵이 예상 한 값이 아니거나 al_flip_display()을 호출하지 않았습니다. 모든 프레임 (즉, 각 al_flip_display())에서 전체 장면을 다시 그려야합니다.

또한 드로잉 프리미티브를 사용할 때 좌표가 어떻게 작동하는지 이해해야합니다. 칠한 직사각형을 그릴 때 바깥 쪽 점 (x1,y1)-(x1+w,y1+h)을 지정하게됩니다.