2013-04-24 56 views
0

我有一個艱難的時間試圖獲得與GAE和後端循環設置。我的目標:追蹤定時器的主要遊戲循環(敵人在3秒內移動,在5秒內冷卻準備等等)。我認爲擁有線程的常駐後端是一種可行的方式。到目前爲止,我只能在appcfg.py後端更新後才能在儀表板中顯示後端。現在我只是努力想出下一步。以下是一些具體問題:GAE python後端遊戲循環

  1. 如果在開發服務器中不支持後端線程,我該如何開發後端線程?
  2. 確實使用後端和線程聲音,就像遊戲循環的合理方法?

最有用的東西將是一個基本的例子,包括backends.yaml,主要應用程序.py文件和後端.py代碼。這是我想象的一個例子:

  • 一個請求從瀏覽器發送到應用程序。
  • 該應用程序與後端實例進行通信,並在線程中設置計時器
  • 一旦計時器完成...接下來會發生什麼?迴應瀏覽器,還是回到應用程序?

我已經閱讀了文檔多次,它不再沉沒了。我試圖弄清楚,但進展非常緩慢。我在網上找不到有用的,面向新手的例子。任何幫助將非常感激!謝謝,

+0

直了蝙蝠,我會說有你的遊戲循環客戶端,是多人? – Awalias 2013-04-24 10:33:10

+0

即使你正在編寫多人遊戲,遊戲循環仍應該在客戶端,它應該定期從服務器獲取世界更新,而不是相反。 – Linuxios 2013-04-24 13:04:16

+0

是的,它是倍增。所以我在客戶端運行定時器並在服務器上驗證它?我的想法是使用「頻道」服務將更新推回瀏覽器。由於定時器是服務器端,我可以確定它沒有被篡改。它看起來比瀏覽器中的AI更有組織性,並與其他瀏覽器同步。誰的瀏覽器應該做計算?如果所有瀏覽器都在計算單個敵人,那會不會變得混亂? – dannySO 2013-04-24 14:24:55

回答

0
  1. google.appengine.api.background_thread做開發服務器上工作
  2. 我不知道這是否是多人遊戲合理的做法

例如:

前端:

<script> 
onMessage = function(msg){ 
    console.log(msg.data) 
} 
channel = new goog.appengine.Channel('{{ token }}'); 
socket = channel.open(); 
socket.onmessage = onMessage; 
</script> 

testbackend.py

import logging, webapp2, time 
from google.appengine.api import background_thread, channel 

class Thread(webapp2.RequestHandler): 
    def post(self): 
     token = self.request.get("token") 
     t = background_thread.BackgroundThread(target=timed_message, args=[token]) 
     t.start() 

def timed_message(token, *kwargs): 
    logging.info(token) 
    time.sleep(2) 
    channel.send_message(token, "channel works") 

pages = [ 
     ("/testbackend/start_thread", Thread), 
    ] 

app = webapp2.WSGIApplication(pages, debug=True) 

main.py

import webapp2, jinja2, os, logging 
from google.appengine.api import backends, urlfetch, users, channel 

JINJA_ENVIRONMENT = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__))) 

class IndexPage(webapp2.RequestHandler): 
    def get(self): 
     user = users.get_current_user() 
     if not user: 
      self.redirect(users.create_login_url(self.request.uri)) 
     token = channel.create_channel(user.user_id()) 
     template_values = {"token":token} 
     template = JINJA_ENVIRONMENT.get_template('templates/index.html') 
     self.response.write(template.render(template_values)) 

class TestAReq(webapp2.RequestHandler): 
    def post(self): 
     user = users.get_current_user() 
     url = backends.get_url("testbackend")+"/testbackend/start_thread" 
     result = urlfetch.fetch(url, method="POST", payload="token="+user.user_id()) 
     self.response.write("abc") 

pages = [ 
      ('/', IndexPage), 
      ("/ajaxtest", TestAReq), 
     ] 
app = webapp2.WSGIApplication(pages, debug=True) 

的app.yaml處理程序:

handlers: 
- url: /static 
    static_dir: static 

- url: /testbackend/.* 
    script: testbackend.app 

- url: /.* 
    script: main.app