简体   繁体   中英

Monopoly python game using canvas player movement error

I am creating an online monopoly game using canvas and tkinter and having trouble trying to make the "player1.png".ie my character to move across the board. Please help!

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()

Ok so I programmed in the basics here:

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()

It allows us to move/hide/display any of the sprites we create. I also added a way for use to detect key/mouse presses (might come in handy later). Using this it shouldn't be hard to create the full program. Note that most of the methods in the Player and Property class are the same so if you know how to use inheritance, you should be able to simplify my code by a lot.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM