2014-04-08 2 views
-1

Action Script3 Flash pro cc를 사용하고 있습니다. 나는 내 게임에 코드를 써서 시간이 지남에 따라 플레이어의 생명을 보충하려고 노력했다. 그러나 나는 성공하지 못했습니다. 예를 들어, Candy Crush에서는 '생명'이라고 불립니다. 최대 5 명의 생명을 가질 수 있습니다. 일단 레벨을 시작하면 5 인생에서 1 삶이 사라집니다. 그리고 나서 생명 라벨 옆에있는 타이머가 20 분에서 0 초로 카운트를 시작합니다. 0에 도달하면 생명력이 다시 생겨 레벨을 다시 시작할 수 있습니다. 나는 이렇게하려고했습니다 : 생명수가 5 개 이하가 될 때마다 20 분에서 0으로 카운트 다운하는 Frame EventListener. 5에 도달하면 숫자 카운트를 중지합니다. 그것은 간단하게 들리며 간단합니다. 그러나 타이머가 카운트 다운되는 동안 플레이어가 게임을 종료하면 어떻게됩니까? 플레이어가 3시 10 분 오후 3시에 게임을 떠났다고 가정 해 보겠습니다. 10 분이 남았습니다. 그리고 플레이어는 오후 3시 30 분에 다시 게임을 시작합니다. 그러고 나면 플레이어는 생명력이 4와 10 분이 남았습니다. 나는 이것을 날짜 클래스를 사용하여 시도했다. 하지만 게임을 종료하고 게임을 다시 시작할 때마다 남은 시간이 엉망이됩니다.시간이 지남에 따라 게임을 어떻게 보충합니까?

+0

Date 클래스를 사용하면 어딘가에 시간을 저장하지 않으면 좋지 않습니다. 장치에서, 예를 들어 XML로. 그러나이 접근법은 큰 문제가 있습니다. 플레이어는 자신의 장치의 시스템 시간을 적절한 시간으로 설정하고 즉시 생명을 얻을 수 있습니다. 나는 당신이 그것을 원하지 않는다고 가정하고있다. 그렇다면 인터넷에서 시간을 얻고 XML로 저장하는 것이 유일한 방법이다. – DodgerThud

+0

답장을 보내 주셔서 감사합니다. 어떻게 인터넷에서 시간을 얻을 수 있습니까? – SpiderWeb

+0

미안하지만, 나는 이런 자신을 한 번도하지 않았다. 그러나 divillysausages는 이미 당신의 질문에 대답 한 것 같습니다. – DodgerThud

답변

2

기본적으로 무료 생활을 한 마지막 시간을 기록한 다음 현재 시간과 마지막 시간을 비교하여 몇 명의 생명을 부여해야하는지 확인해야합니다.

당신은 2 가지 옵션이 있습니다, 그래서 당신은 어딘가에 lastFreeLifeTS 타임 스탬프를 저장해야합니다 :

  • 로컬 - 중 하나 SharedObject 또는 XML 파일을, 당신이 말에 인 경우에 따라 웹 또는 모바일 응용 프로그램 용 AIR 사용 @DodgerThud가 지적했듯이, 이것은 파일을 찾고 값을 수정하거나 시스템 시간을 변경하여 속일만큼 쉽습니다. 캔디 크러시가이 문제를 해결하기 때문에이 문제가 중요한지 여부를 결정해야합니다.
  • 온라인 - 이상적으로 서버에이 타임 스탬프를 저장하면이 로직을 서버로 옮기는 것이 가장 좋습니다. 글쎄, 무료 라이브를 얻는 시점을 결정하는 서버 (클라이언트에게 알려주거나 클라이언트가 서버를 가질 수 있다고 생각할 때 서버를 폴링 할 수 있습니다)

타임 스탬프 받기는 다음과 같이 간단합니다.

this.lastFreeLifeTS = (new Date()).time; 

다음 중 하나를 사용할 때 이것을 불러주십시오. r b) 최대로있을 때 인생을 사용하십시오. (그 다음 자유로운 삶이 그 시점부터 최대 시간에 오기를 원합니다.)

그런 다음 당신은이 문제를 처리해야합니다

  • 플레이어가 시간의 X 금액 후 다시 올 때 플레이어는 게임
  • 의 삶을 받아야하는 경우

첫 번째에게 하나는 간단합니다. 타이머는 카운트 다운됩니다. (참고 : 매 프레임마다 한 번씩 이동할 필요가 없습니다. 필요한 것보다 높은 충실도가 있습니다. 매초마다 한 번만 필요합니다.) 당신의 시간이 다되면, 수명주기 : 당신은 당신이 새로운 삶을주기 위하여려고 할 때 알고 보면

var currTime:Number = (new Date()).time; 
var diff:Number = (currTime - this.lastFreeLifeTime); 
var lifeTime:Number = 1000 * 60 * 20; // give a life every 20 minutes 
if(diff > lifeTime) 
{ 
    giveFreeLife(); 
    this.lastFreeLifeTime += lifeTime; 
} 

을, 당신은 거의 당신이 필요하지 않은 것을 의미하는하는 getTimer()로 교체 할 수 항상 새로운 Date 개체를 생성하십시오.당신이 당신의 게임을 시작하고, 필요한 모든 자유로운 삶을 줄 때 두 번째의 경우

// starting off 
var lifeTime:Number = 1000 * 60 * 20; // 20 minutes 
var msUntilNextLife:Number = ((new Date()).time - this.lastFreeLifeTime) + lifeTime; 
this.nextFreeLifeTime = getTimer() + msUntilNextLife; 

... 

// check if we need to give a new life 
if(getTimer() > this.nextFreeLifeTime) 
{ 
    giveFreeLife(); 
    this.lastFreeLifeTime += lifeTime; 
    this.nextFreeLifeTime += lifeTime; 
} 

, 당신은 당신이 위에 다시 논리의 첫 번째 유형에있어, 타임 스탬프를 확인해야합니다.

// load our SharedObject/XML and set our lastFreeLifeTime 
... 

// check how much time has passed and give any lives necessary 
var currTime:Number = (new Date()).time; 
var diff:Number = currTime - this.lastFreeLifeTime; 
var lifeTime:Number = 1000 * 60 * 20; // 20 minutes 
var numLives:int = int(diff/lifeTime); 
if(numLives > 5) 
    numLives = 5; // only give a maximum number of lives 
if(numLives > 0) 
{ 
    giveFreeLives(numLives); 

    // update our lastFreeLifeTime only if we didn't give the max number of lives 
    // (as otherwise we don't need it) 
    // NOTE: because we're adding (lifeTime * numLives), it handles the time between 
    // lives nicely. E.g. If we get a life every 20m and we come back after 30m, then 
    // our lastFreeLifeTime will be (20 * i), meaning a 10m difference between the 
    // current time, meaning we only have to wait 10m to get our next one 
    if(numLives < 5) 
     this.lastFreeLifeTime += lifeTime * numLives; 
} 

업데이트 - 인터넷

는 소스를 직접 제어 할 수있는 인터넷에서 타임 스탬프를 얻을 수있는 가장 쉬운 방법에서 시간을 받고; 즉, 타임 스탬프를 요청하는 서버/웹 페이지를 소유하고 있습니다.

간단한 해결책은 어딘가에 파일에 다음과 같은 PHP 코드를 호스팅하는 것입니다 : 모든이가하는

<?php 
    echo round(microtime(true) * 1000); 
?> 

페이지에 현재의 타임 스탬프를 인쇄합니다. 당신은 URLLoader 사용하여 시간을 읽은 후 할 수 있어야한다 : 그것은 느린이 방법

  • // NOTE: add all the other listeners, like IOErrorEvent, and SecurityErrorEvent 
    var urlLoader:URLLoader = new URLLoader(new URLRequest("http://myserver.com/timestamp.php")); 
    urlLoader.addEventListener(Event.COMPLETE, onGetTime); 
    
    function onGetTime(e:Event):void 
    { 
        // remove our event listener so we can clean up 
        var urlLoader:URLLoader = (e.target as URLLoader); 
        urlLoader.removeEventListener(Event.COMPLETE, onGetTime); 
    
        // the data is the timestamp returned by php, as a string, so convert it 
        var timestamp:Number = Number(urlLoader.data); 
        if (isNaN(timestamp)) 
        { 
         trace("Couldn't get the timestamp from the server! Returned details: " + urlLoader.data); 
         timestamp = (new Date()).time; // fallback to client 
        } 
    
        // do something with the time 
    } 
    

    문제; 현재 시간을 알아야 할 때마다 웹 요청을합니다. 대기 시간 때문에 실제 시간이되지 않습니다. 대부분의 경우, 이것은 문제가되지 않지만,

  • 인터넷 연결이 필요합니다. 사용자가 설정을 해제하면 작동하지 않습니다.
  • 보안 문제가 발생하여 crossdomain.xml을 호스트해야합니다 (어쩌면)
  • 많은 번거 로움이 있습니다. 그것은 단순한 것보다 훨씬 더 어색하다. (new Date()).time; 이제이 파일을 어딘가에 호스트해야합니다. 게임이 성공하면 얼마나 많은 플레이어가 있고 얼마나 많은 플레이어를 소유했는지에 따라 서버가 상당히 빨리 공격받을 수 있습니다.

가치가 있는지 여부는 여러분이 결정해야합니다. 게임에 이미 서버 구성 요소가있는 경우 일반적으로 문제가되지 않습니다. 먼저 클라이언트에서 작업하게하고 필요할 경우 다시 방문하십시오 (즉, 많은 플레이어가 속일 수 있습니다)

+0

도움을 주셔서 대단히 감사합니다! 나는 내일 이걸 시도 할거야. SharedObject를 사용하여 종료 시간과 내 자신의 코드 시작 시간을 저장합니다. 하지만 Dodger가 말한 것처럼 속임수를 방지하기 위해 데이트 클래스 대신 인터넷에서 시간을 얻으려면 어떻게해야합니까? – SpiderWeb

+0

그래서 코드의 첫 번째 두 그룹은 첫 번째 그룹은 날짜 클래스 만 사용하고 두 번째 그룹은 getDate() 및 날짜 클래스를 사용한다는 점을 제외하고는 똑같은 코드 그룹입니다. 그래서 그 중 하나만 선택할 수 있습니까? – SpiderWeb

+0

인터넷에서 시간을 가져 오는 예제를 사용하여 답변을 업데이트했습니다. 또한 네, 코드의 처음 두 그룹은 기능적으로 동일합니다 - 다른 하나는 새로운'Date' 객체를 만들고, 다른 하나는'getTimer()'(int를 반환)을 사용합니다. 보트를 뜨는 곳을 선택할 수 있습니다. – divillysausages

관련 문제