2014-12-10 58 views
0

我已經發布了幾次,而且我再次陷入困境,我嘗試使用if語句來計算地圖的邊界在哪裏但它不工作。這裏有兩個文件,我在工作:如何縮小一個水平的尺寸以便玩家不會出界?

gui.py

try: 
    from tkinter import * 

except ImportError as err: 
    print('a', err) 

from player import * 

class SimpleGUI: 
    def __init__(self): 
     self.window = Tk() 
     self.window.title('Final Project') 
     self.window.protocol('WM_DELETE_WINDOW',self.exit) 
     self.canvas = Canvas(self.window, 
          width = 245, 
          height = 550, 
          bg = 'white') 
     self.canvas.pack() 

     self.player = Player() 

     self.canvas.focus_set() 
     self.canvas.bind('w', self.w_key) 
     self.canvas.bind('a', self.a_key) 
     self.canvas.bind('s', self.s_key) 
     self.canvas.bind('d', self.d_key) 


     self.running = True 
     self.menu = Menu 

     self.bt1 = Button(self.window, 
         text = 'Start', 
         command = self.menu) 
     self.bt1.pack() 




     self.mainloop() 
     self.window.mainloop() 

    def mainloop(self): 
     while self.running: 
      self.canvas.delete(ALL) 
      #boss square 
      boss_start = self.canvas.create_rectangle(100,0,150,100, outline = 'black', fill = 'black', width = 2) 
      #player start square 
      ply_start = self.canvas.create_rectangle(100,500,150,550, outline = 'black', fill = 'black', width = 2) 
      #row 9 
      self.canvas.create_rectangle(0,50,50,100, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,50,100,100, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,50,150,100, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,50,200,100, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,50,250,100, outline = 'black', fill = 'black', width = 2) 
      #row 8 
      self.canvas.create_rectangle(0,100,50,150, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,100,100,150, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,100,150,150, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,100,200,150, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,100,250,150, outline = 'black', fill = 'black', width = 2) 
      #row 7 
      self.canvas.create_rectangle(0,150,50,200, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,150,100,200, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,150,150,200, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,150,200,200, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,150,250,200, outline = 'black', fill = 'black', width = 2) 
      #row 6 
      self.canvas.create_rectangle(0,200,50,250, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,200,100,250, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,200,150,250, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,200,200,250, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,200,250,250, outline = 'black', fill = 'black', width = 2) 
      #row 5 
      self.canvas.create_rectangle(0,250,50,300, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,250,100,300, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,250,150,300, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,250,200,300, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,250,250,300, outline = 'black', fill = 'black', width = 2) 
      #row 4 
      self.canvas.create_rectangle(0,300,50,350, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,300,100,350, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,300,150,350, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,300,200,350, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,300,250,350, outline = 'black', fill = 'black', width = 2) 
      #row 3 
      self.canvas.create_rectangle(0,350,50,400, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,350,100,400, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,350,150,400, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,350,200,400, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,350,250,400, outline = 'black', fill = 'black', width = 2) 
      #row 2 
      self.canvas.create_rectangle(0,400,50,450, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,400,100,450, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,400,150,450, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,400,200,450, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,400,250,450, outline = 'black', fill = 'black', width = 2) 
      #row 1 
      self.canvas.create_rectangle(0,450,50,500, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(50,450,100,500, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(100,450,150,500, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(150,450,200,500, outline = 'black', fill = 'black', width = 2) 
      self.canvas.create_rectangle(200,450,250,500, outline = 'black', fill = 'black', width = 2) 
      self.player.draw(self.canvas) 

      self.canvas.after(30) 
      self.canvas.update() 

    def button1(self): 
     print('working') 

    def a_key(self, event): 
     self.player.x -= self.player.speed 

    def w_key(self, event): 
     self.player.y -= self.player.speed 

    def s_key(self, event): 
     self.player.y += self.player.speed 

    def d_key(self, event): 
     self.player.x += self.player.speed 

    def exit(self): 
     self.running = False 
     self.window.destroy() 


if __name__ == '__main__': 
    SimpleGUI() 

player.py

class Player: 
    def __init__(self, hp = 100, defense = 10, strength = 10): 
     self.hp = hp 
     self.defense = defense 
     self.strength = strength 
     self.x = 100 
     self.y = 500 
     self.speed = 50 
     if self.x <= 100: 
      if self.y <= 500: 
       self.x = 100 
       self.y = 500 

    def draw(self, canvas): 
     canvas.create_oval(self.x,self.y,self.x+50,self.y+50, fill='red') 

if __name__ == '__main__': 
    player = Player() 

謝謝您的時間和幫助。

+0

擁有自己的主循環,然後調用正常的主循環不會達到您期望的效果。 – 2014-12-11 00:14:41

回答

1

事情是這樣的:

def a_key(self, event): 
    self.player.x -= self.player.speed 
    if self.player.x < LEFT_EDGE: 
     self.player.x = LEFT_EDGE 

def w_key(self, event): 
    self.player.y -= self.player.speed 
    if self.player.y < TOP_EDGE: 
     self.player.y = TOP_EDGE 

def s_key(self, event): 
    self.player.y += self.player.speed 
    if self.player.y > BOTTOM_EDGE: 
     self.player.y = BOTTOM_EDGE 

def d_key(self, event): 
    self.player.x += self.player.speed 
    if self.player.x > RIGHT_EDGE: 
     self.player.x = RIGHT_EDGE 

凡邊表示地圖的邊緣。

2

你已經寫了一些邊界檢查代碼在你__init__方法:

if self.x <= 100: 
    if self.y <= 500: 
     self.x = 100 
     self.y = 500 

但這只是獲取運行一次,在初始化時。每當您在將來更改xy值時,它都不會運行。

您可以通過移動它變成一個方法解決這個問題:

def fit_in_bounds(self): 
    if self.x <= 100: 
     if self.y <= 500: 
      self.x = 100 
      self.y = 500 

...然後,每次有人來調整值,則要調用該方法:

def a_key(self, event): 
    self.player.x -= self.player.speed 
    self.player.fit_in_bounds() 

但是這可能很乏味且容易出錯,因爲忘記撥打fit_in_bounds很容易。這種東西正是@property的用途:你可以這樣做,使得每一次xy被設置,fit_in_bounds被自動調用。現在

def __init__(self, –): 
    # … 
    self._x = 100 # notice the _ to make it "private" 
    # … 

@property 
def x(self): 
    return self._x 

@x.setter 
def x(self, x): 
    self._x = x 
    self.fit_in_bounds() 

SimpleGUI可以只使用self.player.x和以前一樣,但每次你做self.player.x -= self.player.speed時,它會自動確保玩家仍處於界限。

0

這不完整,但會給你一個開始。你應該把所有事情都放在課堂上的一名球員身上。所以運動,邊界檢查等都應該在Player類中。有一些邊界檢查的硬連線數字必須傳遞給Player類,並且遇到了一些碰到實際邊緣的問題,但這是我所有的時間。另請注意,循環會替換代碼中的所有create_rectangle語句,並且只有一個函數用於按鍵,並將該函數傳遞給該函數。如果陳述也適用,那麼「movement_dict」可能會過於簡單。 HTH

from functools import partial 

class SimpleGUI: 
    def __init__(self): 
     self.window = Tk() 
     self.window.title('Final Project') 
     self.window.protocol('WM_DELETE_WINDOW',self.exit) 
     self.canvas = Canvas(self.window, 
          width = 245, 
          height = 550, 
          bg = 'white') 
     self.canvas.pack() 

     self.current_player=True 
     self.player_list = [] 
     player = Player(canvas=self.canvas, color="red", x=100, y=500) 
     self.player_list.append(player) 
     player = Player(canvas=self.canvas, color="blue", x=150, y=475) 
     self.player_list.append(player) 

     self.canvas.focus_set() 
     for ltr in ["w", "s", "a", "d"]: 
      self.canvas.bind(ltr, partial(self.key_press, ltr)) 


     self.running = False 
##  self.menu = Menu 

     self.bt1 = Button(self.window, 
         text = 'Start', 
         command = self.start_it) 
     self.bt1.pack() 

     self.bt2 = Button(self.window, 
         text = 'Quit', 
         command = self.exit).pack() 



     self.create_rects() 
     self.window.mainloop() 

    def create_rects(self): 
      #boss square 
      boss_start = self.canvas.create_rectangle(100,0,150,100, 
             outline = 'black', width = 2) 
      #player start square 
      ply_start = self.canvas.create_rectangle(100,500,150,550, outline = 'black', width = 2) 

      start_x = 0 
      start_y = 50 
      for ctr in range(9): 
       x = start_x 
       y = start_y + ctr*50 
       for row in range(5): 
        print x,y 
        self.canvas.create_rectangle(x, y, x+50, y+50, 
              outline = 'black', width = 2) 
        x += 50 

    def button1(self): 
     print('working') 

    def key_press(self, ltr, event): 
     """ player #1 --> self.current_player==True 
      player #2 --> self.current_player==Flase 
     """ 
     print "ltr", ltr 
     if self.running: 
      if self.current_player: 
       self.player_list[0].adjust(ltr) 
       print "player #1" 
      else: 
       self.player_list[1].adjust(ltr) 
       print "  player #2" 
      self.window.after(100, self.canvas.update) 
      self.current_player = not self.current_player 

    def start_it(self): 
     self.running=True 

    def exit(self): 
     self.running = False 
     self.window.destroy() 


class Player: 
    def __init__(self, canvas, color, hp = 100, defense = 10, strength = 10, 
       x=100, y=500): 
     print "player" 
     self.canvas=canvas 
     self.hp = hp 
     self.defense = defense 
     self.strength = strength 
     self.x = x 
     self.y = y 
     self.speed = 50 
     self.draw(color) 

    def draw(self, color): 
     self.circle=self.canvas.create_oval(self.x,self.y,self.x+50,self.y+50, 
              fill=color) 
     print "draw" 

    def adjust(self, ltr): 
     print "adjust", ltr 
     movement_dict = {"a": [-1, 0], "d": [1, 0], "w": [0, -1], "s":[0, 1]} 
     if ltr in movement_dict: 
      x_move = self.speed*movement_dict[ltr][0] 
      y_move = self.speed*movement_dict[ltr][1] 

      x_left=0 
      x_right=245 
      y_top=0 
      y_bottom=550-25 
      if self.x+x_move < x_left: 
       x_move=0 
      if self.x+x_move > x_right: 
       x_move=0 
      if (self.y+y_move < y_top) or (self.y+y_move > y_bottom): 
       y_move=0 

      self.canvas.move(self.circle, x_move, y_move) 
      self.x += x_move 
      self.y += y_move 
      print self.x, self.y 

if __name__ == '__main__': 
    SimpleGUI()