2013-01-13 32 views
0

我需要使用Tkinter爲我的遊戲創建菜單,主要只是一個播放按鈕。我使用Pygame,如果這有什麼區別的話。使用Tkinter爲我的遊戲創建菜單

from pygame import * 
import random 
from datetime import datetime 

startTime = datetime.now() 

class Sprite: 
    def __init__(self, xpos, ypos, filename): 
     self.x = xpos 
     self.y = ypos 
     self.bitmap = image.load(filename) 
     self.bitmap.set_colorkey((0, 0, 0)) 
    def set_position(self, xpos, ypos): 
     self.x = xpos 
     self.y = ypos 
    def render(self): 
     screen.blit(self.bitmap, (self.x, self.y)) 

def Intersect(s1_x, s1_y, s2_x, s2_y): 
    if (s1_x > s2_x - 32) and (s1_x < s2_x + 32) and (s1_y > s2_y - 32) and (s1_y < s2_y + 32): 
      return 1 
    else: 
     return 0 

init() 
screen = display.set_mode((640, 480)) 
key.set_repeat(1, 1) 
display.set_caption('PyInvaders') 
backdrop = image.load('data/backdrop.bmp') 
enemies = [] 
x = 0 

for count in range(10): 
    enemies.append(Sprite(50 * x + 50, 50, 'data/enemy.bmp')) 
    enemies.append(Sprite(50 * x + 50, 100, 'data/enemy.bmp')) 
    x += 1 

hero = Sprite(304, 400, 'data/hero.bmp') 
ourmissile = Sprite(0, 480, 'data/heromissile.bmp') 
enemymissile = Sprite(0, 480, 'data/enemymissile.bmp') 
sandwich = Sprite(304, 20, 'data/sandwich.bmp') 

quit = 0 
score = 0 
enemyspeed = 4 

while quit == 0: 
    screen.blit(backdrop, (0, 0)) 

    for count in range(len(enemies)): 
     enemies[count].x += + enemyspeed 
     enemies[count].render() 

    if len(enemies) > 0 and enemies[-1].x > 590: 
     enemyspeed = -4 
     for count in range(len(enemies)): 
      enemies[count].y += 5 

    if len(enemies) > 0 and enemies[0].x < 10: 
     enemyspeed = 4 
     for count in range(len(enemies)): 
      enemies[count].y += 5 

    if ourmissile.y < 479 and ourmissile.y > 0: 
     ourmissile.render() 
     ourmissile.y -= 5 

    if enemymissile.y >= 480 and len(enemies) > 0: 
     enemymissile.x = enemies[random.randint(0, len(enemies) - 1)].x 
     enemymissile.y = enemies[0].y 

    if Intersect(hero.x, hero.y, enemymissile.x, enemymissile.y): 
     quit = 1 
     print "...where mah sammich." 

    for count in range(0, len(enemies)): 
     if Intersect(ourmissile.x, ourmissile.y, enemies[count].x, enemies[count].y): 
      score += 1 
      ourmissile.y = 480 
      del enemies[count] 
      break 

    if Intersect(ourmissile.x, ourmissile.y, enemymissile.x, enemymissile.y): 
     ourmissile.y = 480 
     enemymissile.y = 480 

    if len(enemies) == 0: 
     sandwich.y += 2 
     if Intersect(hero.x, hero.y, sandwich.x, sandwich.y): 
      score += 10 
      quit = 1 
      print "YEEEEE GOT ME MAH SAMMICH!" 

    for ourevent in event.get(): 
     if ourevent.type == QUIT: 
      quit = 1 
     if ourevent.type == KEYDOWN: 
      if ourevent.key == K_RIGHT and hero.x < 590: 
       hero.x += 3 
      if ourevent.key == K_LEFT and hero.x > 10: 
       hero.x -= 3 
      if ourevent.key == K_SPACE: 
       ourmissile.x = hero.x 
       ourmissile.y = hero.y 

    enemymissile.render() 
    enemymissile.y += 5 
    hero.render() 
    sandwich.render() 
    display.update() 

print "You scored", score, "/30" 
print "It took you", (datetime.now() - startTime), "to play the game." 

Code on Pastebin

+2

請不要一次詢問兩個問題。另外,當你已經使用pygame進行圖形處理時,爲什麼要使用Tkinter?就像遊戲的「發射器」一樣?這似乎對我來說很直觀。 –

+0

我對Pygame很新,所以我不確定我會怎麼去Pygame。是的,應該是一個啓動器。 – robbiwood

+0

你嘗試過什麼嗎?網上有很多代碼示例 –

回答

2

pygame的和Tkinter的不融合。 您的用戶界面應該由其中一方提供 - 您甚至可以在窗口化(無全屏)pygame應用程序中使用Tkinter來彈出瞬態對話框,但這並不常見。

在運行任何pygame代碼,停止Tkinter主循環並啓動pygame之前,可以提供一個配置/遊戲的estart對話框。否則,爲了獲得一致的體驗,您應該爲您的項目添加一個GUI,該GUI使用Pygame進行遊戲中的使用。 (由於純pygame沒有支持buttos,菜單,文本條目等)。如果適合你,請檢查http://www.pygame.org/wiki/gui