2009-05-04 3 views
1

나는 작은 탁구 게임을 만들기 위해 IUP로 의견을 얻으려고 노력해 왔습니다. 나는 약간의 입력을 시도하고 싶었고 IUPGL 예제와 함께 제공되는 코드 중 일부를 시도했지만 입력이 전혀 작동하지 않는 것 같습니다. 여기가 지금까지의 약자로 코드입니다 :루아에서 IUP로 입력 받기

require "iuplua" 
require "iupluagl" 
require "luagl" 

paddle = {x = -0.9, y = 0.2} 

function drawPaddle(x, y) 
    gl.Begin(gl.QUADS) 
    gl.Color(0.0, 0.5, 0.0) 

    gl.Vertex(x, y) 
    gl.Vertex(x + 0.1, y) 
    gl.Vertex(x + 0.1, y - 0.4) 
    gl.Vertex(x, y - 0.4) 
end 

canvas = iup.glcanvas{buffer = "DOUBLE", rastersize = "300x300"} 

function canvas:action(x, y) 
    iup.GLMakeCurrent(self) 
    gl.ClearColor(0.0, 0.0, 0.0, 0.0) 
    gl.Clear(gl.COLOR_BUFFER_BIT) 
    gl.Clear(gl.DEPTH_BUFFER_BIT) 

    gl.MatrixMode(gl.PROJECTION) 
    gl.Viewport(0, 0, 300, 300) 
    gl.LoadIdentity() 

    drawPaddle(paddle.x, paddle.y) 

    gl.End() 
    iup.GLSwapBuffers(self) 
end 

window = iup.dialog{canvas, title = "Soon to be Pong"} 

function canvas:k_any(c) 
    if c == iup.K_q then 
     return iup.CLOSE 
    elseif c == iup.K_w then 
     paddle.y = paddle.y + 0.02 
     return iup.CONTINUE 
    else 
     return iup.DEFAULT 
    end 
end 

window:show() 

iup.MainLoop() 

그것은 키를 누를 때 canvas:k_any()가 호출되는 것을 나의 이해하지만 그것도 종료 명령에 응답하지 않는 것. 어떤 아이디어?

+1

당신은 아마 http://lists.luaforge.net/cgi-bin/mailman/listinfo/iup-mail 또는 루아 메일 링리스트 HTTP에 IUP 메일 링리스트에이 질문을한다 .conectiva.com.br/mailman/listinfo/lua IUP 작성자는 책을 읽고 있으며 대개 매우 유용하며 반응이 좋습니다. –

+0

여러 프로젝트에서 IUP를 사용하지만 아직 IUPGL을 사용하지 않았습니다.비록 내가 CD 대신 하나의 프로젝트에 구현해야만했던 오디오 레벨 미터 컨트롤을 위해 CD를 사용해야 만했을 것입니다 ... 저는 C 언어에서 직접 IUP를 사용할 때보다 키 콜백이 루아 바인딩에서 더 이상하다고 알고 있습니다 따라서 소스 코드를 살펴볼 수있는 곳이 될 것입니다. 나는 IUP 목록을 시도 할 추천서를 두 번째 것이다. 저자는 일반적으로 빠르게 반응하며, 고급 사용자에게도 많은 도움을 제공 할 것입니다. – RBerteig

답변

2

인용 한 샘플의 문제 중 적어도 일부입니다. IUP 키 이름 상수가 실제로 iup 테이블에 정의되기 전에 함수를 호출해야합니다. 키 이름이 모두 필요하지 않은 경우 메모리 사용량이 적어 많은 응용 프로그램이 완전히 수행 할 수없는 개념입니다. 곧 require "iuplua" 후 어떤 코드에서 이름을 사용하기 전에 언젠가 다음 행을 추가

보십시오 :이 주제 키보드 코드의 상단뿐만 아니라 다양한에 설명되어 있습니다

 
iup.key_open()  -- load key names 

키보드와 관련된 장소. iup.key_open()에 대한 호출없이

, iup.K_q 따라서 자동 및 (다른 키 이름처럼) canvas:k_any()에 전달 된 키 코드와 일치하지 nil로 평가됩니다.

편집 : 방금 ​​샘플을 실행했고 실제로 iup.key_open()을 호출하면 q 및 w 키가 인식됩니다. 외양의 위치를 ​​업데이트하는 것만으로 캔버스가 다시 그리기를 요구하지 않는다는 사실을 알게 될 것입니다. 나는 당신이 앞으로 나아가면서 그것을 운동으로 남겨 둘 것입니다.

Edit2가 : 당신이 패의 상태를 수정 직후 기능 canvas:k_any()에 선 iup.Update(self) 추가는 당신이 원하는 것을 할 것으로 보인다. 수동으로 action() 메서드를 호출하는 것보다 그렇게하는 것이 예상 된 방식으로 IUP의 메시지 루프 처리와 상호 작용하는 이점이 있습니다. 일반적으로 iup.UpdateChildren(window)을 대신 호출하는 것이 좋습니다. 대화 상자에 표시되는 다른 IUP 컨트롤과 캔버스가 업데이트 된 상태로 유지됩니다. 이는 내부적으로 모든 업데이트를 수행하지 않는 컨트롤이있는 경우 유용 할 수 있습니다.

또는 드로잉 루틴을 캔버스의 k_any()action() 메서드에서 호출되는 자체 함수로 이동할 수 있습니다. 여러 뷰포트 또는 관련 컨트롤을 지원하려는 경우 일반적으로 확장되지 않으므로 일반적으로 권장할만한 것은 아닙니다.

k_any() 처리기의 논리를 재정렬하여 새 키의 사례를 추가 할 때 실수로 iup.Update()에 대한 호출을 잊어 버리지 않을 수 있습니다. // bazar2 :

+0

나는 그 열쇠가'nil'이라고 의심했다. 그것을 확인해 주셔서 감사합니다! 나는 현재 행운을 빌리지 않고 강제로 다시 그리기를 강제하는 방법을 찾기 위해 문서를보고 있습니다. 'iup.Update'와'iup.UpdateChildren'을 시도했지만'nil' 값이라고 불평하고 있습니다. –

+0

글쎄, 나는 그것을 작동하게 만들었지 만 그것은 다소 괴로운 것처럼 보인다. 캔버스의 끝에서 : k_any(), 나는 canvas : action()을 직접 호출하고있다. 이렇게하면 작업이 완료되지만 강제로 다시 그리는 더 좋은 방법이 있습니까? –

+0

캔버스에서 iup.Update (self)를 호출하는 위치와 방법에 대한 설명을 편집했습니다. k_any (key) 메소드. – RBerteig