2014-04-24 6 views
-1

나는 게임 주마 같은 J2ME 뭔가을위한 게임을 만들려고 노력하고있어, 당신이 알아야 할 클래스의 구조는 다음과 같다 점의 벡터 (내가 만든 점은 점, 공이 따라갈 경로), 공의 벡터 (나는 공이라는 클래스를 만들었습니다)가 다른 공의 대상, 속도 (특정 수준의 공의 속도)를 유지합니다. (더 많은 필드가 있지만 걱정할 필요는 없습니다)J2ME 게임 스레드

-Frog 클래스 - 게임 클래스가 익숙하지 않은 경우 제어 클래스가 가능한 터렛이 될 수 있습니다. 공을 쏜다.). (해당 클래스의 필드에 대해 걱정할 필요가 없습니다.)

-MyGameCanvas는 분명히 GameCanvas를 확장하고 실행 가능 요소를 구현하며 개구리와 레벨 (현재 재생되는 레벨)의 인스턴스를 보유합니다. 당신은 걱정할 필요가 있습니다). run 메소드는 사용자가 마우스 왼쪽 버튼을 누르면 X 값만큼 개구리 (본질적으로 스프라이트)를 누를 때 사용자 입력에 대한 청취자의 역할을합니다. -X만큼 회전하고 OK를 누르면 공을 쏠 수 있습니다. 스레드는 입력을 처리하는 것 외에 화면에서 진행되는 것을 렌더링하는 render 메서드를 호출하고 점의 벡터를 사용하여 (현재 레벨 인스턴스를 사용하여) 공 벡터에서 볼 위치를 업데이트합니다 (레벨 인스턴스에서도 마찬가지 임). 문제는 각 레벨마다 속도가 다르기를 원한다는 것입니다. 속도는 볼이 화면에서 느리게 움직이는 ("이동") 것을 의미하므로 Thread.sleep 메서드의 속도 값을 사용하여이를 수행 할 수 있습니다. 실행 방법은 개구리 움직임과 입력 반응을 만드는 사용자로부터 입력을 받아들이고 있기 때문에 수면 시간도 느려질 수 있습니다. 나는 각 공마다 별도의 스레드를 수행하는 것이 좋겠다고 생각하지만 스레드가 많이 있기 때문에 실제로는별로 좋지 않습니다. + 화면의 각 볼 위치를 업데이트 할 때 나는 볼과 그 뒤에있는 틈 사이에 갭이 있거나 볼을 렌더링 할 때 볼이 뒤로 거꾸로 움직일 필요가있는 것처럼 레벨 인스턴스의 전체 볼 벡터를 실제로 사용합니다 공에 따라 다르다. 그 사람이 이미 렌더링 된 후에 "트랙"(포인트 벡터)에, 그래서 내가 어떻게해야하는지 잘 모르겠다. 어떤 어드바이스 지침은 고도로 설명 될 것이다! 사전에 감사 드리며 잘하면 내가 쓴 것을 이해할 수 있었으면 좋겠다. 또한 코드 예제를 제공 할 필요가 없다고 생각한다. 내가 쓴 것을 변경하고 싶지 않기 때문에 실제로 코드 예제를 제공하지 않을 것이다. run/render 메서드를 사용하면 내가 준 클래스의 구조와 내가 들었던 필드 만 알면된다.

+0

실례지만, 다시 질문이 무엇입니까? –

+0

내가 설명한 것을 구현하는 또 다른 방법을 찾으려고합니다. 입력 리스너와 화면 업데이트를 동일한 스레드에서 수행하여 동일한 스레드에서 문제를 일으키는 이유는 (원래 게시물에 설명 된) 공 각 레벨마다 속도가 다르기 때문에 처음에는 Thread의 sleep 메서드로 속도를 사용하는 것이 좋겠다고 생각했습니다. 그렇다면 리스너가 영향을 받고 속도가 느려져서 원하지 않으므로 다른 스레드를 찾으려고합니다. 그걸 할 수있는 방법을 생각할 수 없어 좋은 길을 생각할 수 없었습니다. 어쩌면 누군가가 저에게 어떻게 할 수 있을지 생각할 수 있도록 도울 수 있습니다. – user3497284

+0

속도를 유지하는 '속도'라는 변수를 추가하는 것은 어떻습니까? –

답변

0

다양한 개발자가 스프라이트 이동 속도를 제어하는 ​​다양한 방법을 사용합니다. JavaME는 다양한 해상도와 CPU 속도를 고려해야하는 많은 플랫폼 중 하나입니다. 따라서 메인 게임 루프의 각 사이클에서 x 값을 1 픽셀 씩 증가시키는 것만 큼 간단하지 않습니다.

화면 해상도가 다른 두 개의 장치가 있다고 가정하지만 동일한 속도로 실행되는 장치. 게임 루프의 사이클에서 x 값을 1 씩 증가 시키면 분명히 작은 해상도에서 스프라이트가 화면 끝에 다다르게됩니다. 2 개의 장치가 동일한 화면 해상도이지만 다른 CPU를 사용한다고 가정합니다. 게임 루프 사이클에서 x 값을 1 씩 증가 시키면 분명히 가장 빠른 CPU를 가진 장치에서 스프라이트가 화면 끝까지 더 빨리 도달하게됩니다.

가 호출, 변수를 만들기 itemWait ("항목이"당신의 속도를 제어 할 개체의 이름입니다) :

여기에 그 주위에 작업 방법 중 하나입니다. itemWait 변수는 게임 루프가 다음 이동 전에 얼마나 오래 경과해야하는지 알려주는 값을 보유합니다. 예를 들어, 스프라이트가 이동하는 픽셀 당 40 밀리 초를 기다려야한다고 가정 해보십시오.코드는 다음과 같이 표시됩니다.

// Variables defined outside the game loop 
long lastTime, thisTime; 
int cyclems; 
int itemTime; // Replace "item" with the name of the object, like e.g. ballTime. 
int itemWait = 40; // Wait 40 ms for each movement 
int itemPixelsToMove = 1; 

while (running == true) { // Game loop 
lastTime = thisTime; // Set lastTime to the time-stamp of the previous cycle 
thisTime = System.currentTimeMillis(); // Get the current time-stamp 
cyclems = (int) (thisTime - lastTime); // How long did it take to execute previous loop 

itemTime += cyclems; // How long has passed since last move 
while (itemTime > itemWait) { // If it's time to move 
    itemTime -= itemWait; 
    moveItem(itemPixelsToMove); 
} 

// Do other game logic 

// Draw everything 

// Handle input, unless you handle it with keyPressed() 
} 

이 방법을 사용하면 코드가 장치의 속도에 신경을 쓰지 않습니다. 게임을 다른 화면 해상도로 이식하려는 경우 itemPixelsToMove 또는 itemWait 중 하나만 변경하면됩니다. 예를 들어 240x320 해상도의 경우 itemWait = 40;으로 설정한다고 가정 해 보겠습니다. 그런 다음 480x640 해상도의 경우 40/240 * 480 = 80으로 설정합니다. (물론 그래픽을 확장해야합니다.)

호기심이 생길 경우를 대비하여 www.PirateDiamonds.com에서이 접근법을 사용했습니다. 동일한 코드가 원하는 화면 해상도로 실행됩니다.