簡體   English   中英

大富翁 python 游戲使用 canvas 玩家移動錯誤

[英]Monopoly python game using canvas player movement error

我正在使用 canvas 和 tkinter 創建一個在線壟斷游戲,並且在嘗試制作“player1.png”時遇到了麻煩。即我的角色全面移動。 請幫忙!

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.master.title("Monopoly Physics Edition")
        self.pack(fill=BOTH, expand=1)

        canvas = Canvas(self)
        global player1
        
        load= Image.open("player1.png")
        player1 = ImageTk.PhotoImage(load)
        img = Label(image=player1)
        img.place(x=834, y=60)

def main():
        canvas = Tk()
        ex = Example()
        canvas.geometry("1150x820+800+700")

if __name__ == '__main__':
        main()

好的,所以我在這里編寫了基礎知識:

import tkinter as tk
from PIL import Image, ImageTk


class Player:
    def __init__(self, canvas, sprite, pos):
        self.posx, self.posy = pos
        self.canvas = canvas
        self.sprite = sprite

        self.tk_image = None
        self.canvas_id = None

    def display(self):
        # This will display the train card on the board
        self.load_sprite()
        # If we already displayed the object hide it first
        if self.canvas_id is not None:
            self.hide_from_canvas()
        # We need to create a new canvas object and get its id
        #   so that later we can move/remove it from the canvas
        self.canvas_id = self.canvas.create_image(self.posx, self.posy, image=self.tk_image)

    def hide_from_canvas(self):
        # This will remove the sprite from the canvas
        self.canvas.delete(self.canvas_id)

    def load_sprite(self):
        # If we already loaded the sprite just don't do anything
        if self.tk_image is not None:
            return None

        # Later you can determine the filename from `self.name`
        filename = "img_small.png"
        pillow_image = Image.open(filename)
        # You must keep a reference to this `tk_image`
        # Otherwise the image would show up on the board
        self.tk_image = ImageTk.PhotoImage(pillow_image)

    def move(self, change_x, change_y):
        # Move the object by change_x, change_y
        self.canvas.move(self.canvas_id, change_x, change_y)


class Property:
    def __init__(self, canvas, name, cost, pos):
        self.posx, self.posy = pos
        self.canvas = canvas
        self.name = name
        self.cost = cost

        self.tk_image = None
        self.canvas_id = None

    def display(self):
        # This will display the train card on the board
        self.load_sprite()
        # If we already displayed the object hide it first
        if self.canvas_id is not None:
            self.hide_from_canvas()
        # We need to create a new canvas object and get its id
        #   so that later we can move/remove it from the canvas
        self.canvas_id = self.canvas.create_image(self.posx, self.posy, image=self.tk_image)

    def hide_from_canvas(self):
        # This will remove the sprite from the canvas
        self.canvas.delete(self.canvas_id)

    def load_sprite(self):
        # If we already loaded the sprite just don't do anything
        if self.tk_image is not None:
            return None

        # Later you can determine the filename from `self.name`
        filename = "img_small.png"
        pillow_image = Image.open(filename)
        # You must keep a reference to this `tk_image`
        # Otherwise the image would show up on the board
        self.tk_image = ImageTk.PhotoImage(pillow_image)

    def move(self, change_x, change_y):
        # Move the object by change_x, change_y
        self.canvas.move(self.canvas_id, change_x, change_y)


class App(tk.Canvas):
    def __init__(self, master, **kwargs):
        # Create the canvas
        super().__init__(master, **kwargs)
        # lets show all of the monopoly properties on the screen
        self.init()

        # I will also bind to key presses (You might want to use them later)
        master.bind("<Key>", self.on_key_press)
        # I will also bind to mouse presses
        super().bind("<Button-1>", self.on_mouse_press)

    def on_key_press(self, event):
        print("You pressed this character:", repr(event.char))
        print("For non character keys (like Escape):", repr(event.keysym))
        # For now I will move the player sprite by 10 pixels to the right
        #   when "d" or the right key is pressed
        if (event.char == "d") or (event.keysym == "Right"):
            # Move the first player of list
            self.players[0].move(10, 0)

    def on_mouse_press(self, event):
        print("You clicked with the mouse at this position:", (event.x, event.y))

    def init(self):
        # A list that will hold all of the properties:
        self.properties = []
        # A list that will hold all of the players playing
        self.players = []
        # I will only create 1 property (You can add the rest)
        # I will create 1 of the trains where the cost is 200 and
        #   its position is (50, 50). Note (0, 0) is the top left
        #   corner of the canvas
        train1 = Property(self, "Train", 200, (50, 50))
        train1.display()
        self.properties.append(train1)
        # I will also create a player at position (100, 100)
        player1 = Player(self, "player_sprite1", (100, 100))
        player1.display()
        self.players.append(player1)



# Create the window
root = tk.Tk()
# Make it so that the user can't resize the window
# Otherwise you will have a lot of problems with your images not being in
#   the correct places
root.resizable(False, False)
# Create the App, I also passed in `width=200, height=200` those are in pixels
main_app = App(root, width=200, height=200)
# Show the App on the screen:
main_app.pack()
# Enter tkinter's mainloop
root.mainloop()

它允許我們移動/隱藏/顯示我們創建的任何精靈。 我還添加了一種用於檢測鍵/鼠標按下的方法(以后可能會派上用場)。 使用它創建完整的程序應該不難。 請注意, PlayerProperty class 中的大多數方法都是相同的,所以如果您知道如何使用 inheritance,您應該能夠大大簡化我的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM