2011-03-07 2 views
0

저는 Flash/ActioScript 3에서 주사위 게임을 만들려고합니다. 모든 필수 요소를 다 했으므로 원활하게 작동합니다. 이제 사용자 환경을 개선하고 싶습니다. 예를 들어, 그것이 컴퓨터의 차례 일 때 (주사위 값에 따라 물건을 구르거나 돌릴 때) 나는 주사위를 움직이기 원합니다. 다이는 6 개의 키 프레임을 가지고 있습니다. 예를 들어 다이가 2 초 동안 6 프레임을 반복 할 경우 무작위 제너레이터에 따라 값이 멈 춥니 다. 어떻게 든 나는 그것을 할 수 없다. 어떻게 함수 (들)을 쓸 수 있습니다, 내가 말할 때 너무ActionScript 3의 이해가 어려움 타이머 클래스

animateDice()

은 아무것도하지 않고 있지만, 단지 지정된 간격 주사위를 애니메이션 것인가?

업데이트 : 위의 코드가 제대로 작동하지 않는 이유

var timer:Timer = new Timer(10, 50); 
myButton.addEventListener(MouseEvent.CLICK, onClick); 
timer.addEventListener(TimerEvent.TIMER, animateDice); 

function onClick(event: Event):void { 
    timer.start(); 
} 

function animateDice(event: Event):void { 
    dice.play(); 
} 

는 예를 들어, 내가 이해가 안 돼요. 첫 번째 클릭에는 제대로 작동하지만 이후에는 제대로 작동하지 않습니다.

업데이트 2 : 아직 문제가있는 것 같습니다. 타이머가 멈출 때까지 실행중인 코드를 어떻게 중지합니까? (예 작업은 쉬운 방법이 있나요 등 다른 타이머 내부 타이머 핸들러를 넣어 --- 주위가

어쩌면,이 도움이 될 것입니다 :

먼저 우리는 다이 압연 (및 메시지 상자가 표시 사용자에게 게임이 시작될지를 결정할 것임을 알리는 메시지) 인간 또는 컴퓨터의 차례입니다. 컴퓨터가 돌아 왔을 때, 먼저 1 초 동안 롤링 다이를 다시 본 다음 멈추고 결과를 봅니다. 초보자인데 뭔가 빠뜨릴 수는 없겠지만,이 모든 간단한 단계 (그냥 잠깐 동안 굴러 다니는 모습 만 보임)가 많은 선을 의미하는 것 같습니다.

간단한 타이머를 사용하면 다이 애니메이션, 스크립트 콘 그리고 쇼 전체가 사라집니다.

답변

2

타이머 객체는 세 가지 속성이 있습니다

  • delay, 또는 이벤트가
  • repeatCount, 또는 이벤트가 발생하는 방법을 여러 번 발생 빈도를
  • currentCount, 또는 얼마나 많은 시간 타이머의 지금까지 이벤트가 발생했습니다

new Timer(10, 50)으로 타이머를 만들고 있는데 delay ~ 10 및 repeatCount ~ 50입니다. 즉, timer.start()을 호출하면 타이머가 10 밀리 초마다 실행됩니다. 해고 될 때마다 currentCount에 1을 더합니다. currentCountrepeatCount (50)보다 크거나 같으면 타이머 반복이 중지됩니다.

타이머가 중지되면 timer.start()에 다시 전화하면 currentCount이 0으로 재설정되지 않았기 때문에 이벤트가 한 번만 발생하고, 여전히 >= repeatCount입니다.

timer.reset()을 호출하기 전에 timer.start()을 호출하면이 값이 0으로 설정되고 모든 것이 예상대로 동작해야합니다.

+0

네, 저의 실수였습니다. 그 점을 지적 해 주셔서 감사합니다. – blackened

0

당신은 좀 더 이런 식으로 뭔가를 시도 할 수 :

var t:Timer = new Timer(10, 50); 
t.addEventListener(TimerEvent.TIMER, timerHandler); 
t.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler); 
t.start(); 

function timerHandler(e:TimerEvent):void { 
    gotoRandomFrame(); 
} 

private function timerCompleteHandler(e:TimerEvent):void { 
    var finalNum:int = gotoRandomFrame(); 
    // Using finalNum 
} 

private function gotoRandomFrame():int { 
    var num:int = Math.floor(Math.random() * 6) +1; 
    dice.gotoAndStop(num); 
    return num; 
} 

그래서 2000, 타이머는 한 번만 실행되도록 설정되어 플레이

+0

흠. 그건 내 관심사가 아니야. 어쨌든 고마워. – blackened

1
var timer:Timer = new Timer(2000, 1); 
myButton.addEventListener(MouseEvent.CLICK, onClick); 
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 

function onClick(event: Event):void { 
    timer.reset(); 
    timer.start(); 
    dice.play(); 
} 

function onTimerComplete(event:TimerEvent):void { 
    var roll:int = int(Math.floor(Math.rand()*6))+1; 
    dice.gotoAndStop(roll); 
} 

를 사용하는 것보다 당신의 프레임을 설정하는 사항 gotoAndStop을 대신 사용 밀리 초 (2 초)입니다. 클릭이 발생하면 타이머가 재설정됩니다 (처음 클릭하지 않은 경우 처음 실행되는 것처럼 실행 됨). 그러면 애니메이션이 시작됩니다. 2 초 후 TIMER_COMPLETE가 타이머에 의해 발사되고 다이를 잡은 다음 다이의 마지막 번호를 결정한 다음 해당 프레임으로 이동하고 정지합니다.

코드를 컴파일하려고하지는 않았지만 코드의 핵심은 효과가 있습니다.

P.S., 주사위는 'die'의 복수형입니다. :) 우리 모두가 사용하고 싶어하지만 사용할 수없는 변수 이름 유형에 대한 좋은 기회를 건너 뛰고 있습니다!

+0

나는 주사위가 복수형이라는 것을 알고있다. 어떻게 든 나는 "die"라는 단어를 변수 이름으로 쓰는 것을 좋아하지 않습니다. – blackened

+0

실제로는 뺨 주석의 혀 였으므로 "주사위"도 사용했을 것입니다. – Roy

관련 문제