如何在python 3.7中设置画布相机位置

书呆子

我正在写一个类似马里奥的游戏(非商业,我只是想复习编码),我需要关注两个玩家之一。弄乱 canvas.move 对我的需求不起作用,我想知道是否有某种方法可以实际控制它从哪个位置渲染(例如一个玩家在屏幕外并且相机移动以使他在屏幕上)。我的代码:

from tkinter import *
import math,time

## Declare your many GAME CLASSES here
class Camera:
    def __init__(self,game):
        self.cnv=game.canvas
        self.tracker=None
    def track(self,player):
        self.tracker=player
    def run(self):
        cords=self.cnv.coords(self.tracker.id)
        self.cnv.move(ALL,250-cords[0],250-cords[1])
class Human:
    def __init__(self,game):
        game.tk.bind_all("<KeyPress>",self.press)
        game.tk.bind_all("<KeyRelease>",self.release)
        self.left=False
        self.right=False
        self.jump=False
    def run(self,player):
        if self.left:
            player.left()
        if self.right:
            player.right()
        if self.jump:
            player.jump()
            self.jump=False
    def press(self,event):
        if event.keysym=="Left":
            self.left=True
        if event.keysym=="Right":
            self.right=True
        if event.keysym=="Up":
            self.jump=True
    def release(self,event):
        if event.keysym=="Left":
            self.left=False
        if event.keysym=="Right":
            self.right=False
    def hitx(self):
        pass
    def hity(self):
        pass
class Computer:
    def __init__(self):
        self.direction=1
    def run(self,player):
        if player.onground:
            if self.direction==1:
                player.right()
            if self.direction==-1:
                player.left()
    def hitx(self):
        self.direction*=-1
    def hity(self):
        pass
class Player:
    def __init__(self,startx,starty,game,controller):
        self.id=game.canvas.create_image(250+startx,250+starty,anchor=CENTER,image=game.player_images[0])
        self.game=game
        self.xv=0
        self.yv=0
        self.controller=controller
        self.speed=4
        self.face=0
        self.side=0
        self.onground=False
    def left(self):
        self.xv-=self.speed
        self.side=1
        self.face=tick%2
    def right(self):
        self.xv+=self.speed
        self.side=0
        self.face=tick%2
    def jump(self):
        if self.onground:
            self.yv=math.sqrt(self.speed)*-10
    def look(self):
        bricks=[]
        for x in self.game.tileset:
            coords=self.game.canvas.coords(x[0])
            playercoords=self.game.canvas.coords(self.id)
            xdifference=abs(coords[0]-playercoords[0])
            ydifference=abs(coords[1]-playercoords[1])
            if xdifference<250 and ydifference<250:
                bricks.append(coords)
    def run_slf(self):
        if not self.onground:
            self.face=2
        self.set_face()
        self.face=0
        self.onground=False
        self.game.canvas.move(self.id,self.xv,0)

        ## Work in progress: Do the X COLLISIONS FOR THE PLAYER
        bounds=self.getbounds()
        if len(self.game.canvas.find_overlapping(*bounds))>1:
            while len(self.game.canvas.find_overlapping(*bounds))>1:
                self.game.canvas.move(self.id,abs(self.xv)/self.xv*-1,0)
                bounds=self.getbounds()
            self.xv=0
            self.controller.hitx()

        self.game.canvas.move(self.id,0,self.yv)
        ## Work in progress: Do the Y COLLISIONS FOR THE PLAYER
        bounds=self.getbounds()
        if len(self.game.canvas.find_overlapping(*bounds))>1:
            while len(self.game.canvas.find_overlapping(*bounds))>1:
                self.game.canvas.move(self.id,0,abs(self.yv)/self.yv*-1)
                bounds=self.getbounds()
            self.yv=0
            self.onground=True
            self.controller.hity()
        self.controller.run(self)
        self.xv*=0.8
        self.yv+=1
    def set_face(self):
        self.game.canvas.itemconfig(self.id,image=game.player_images[self.face+(self.side*3)])
    def getbounds(self):
        width=25
        height=45
        cords=self.game.canvas.coords(self.id)
        return [cords[0]-width,cords[1]-height,cords[0]+width,cords[1]+height]
class Game:
    def __init__(self,width,height):
        self.tileset=[]
        self.players=[]
        self.tk=Tk()
        self.brick_types={"regular":[False,PhotoImage(file="blocks/brick_basic.png")]}
        self.tk.resizable(0,0)
        self.canvas=Canvas(self.tk,width=width,height=height,background="white")
        self.canvas.pack()
        self.player_images=[PhotoImage(file="marioAnim/face.png"),PhotoImage(file="marioAnim/walk.png"),PhotoImage(file="marioAnim/jump.png"),PhotoImage(file="marioAnim/face-2.png"),PhotoImage(file="marioAnim/walk-2.png"),PhotoImage(file="marioAnim/jump-2.png")]
    def run(self):
        self.tk.update_idletasks()
        self.tk.update()
        for x in self.players:
            x.run_slf()
    def addbrick(self,x,y,tp):
        self.tileset.append([self.canvas.create_image(x*50+250,y*50+250,anchor="nw",image=self.brick_types[tp][1]),self.brick_types[tp][0]])
    def addline(self,x,y,xd,yd,length,tp):
        for i in range(0,length):
            self.addbrick(x+xd*i,y+yd*i,tp)
    def addplayer(self,player):
        self.players.append(player)

## Declare your GLOBAL VARIABLES here.
game=Game(500,500)
human=Human(game)
computer=Computer()
cplayer=Player(-50,0,game,computer)
hplayer=Player(50,0,game,human)
tick=0
camera=Camera(game)
camera.track(cplayer)

## BUILD TILESET
game.addline(-8,4,1,0,16,'regular')
game.addbrick(-5,3,'regular')
game.addbrick(4,3,'regular')

## ADD PLAYERS
game.addplayer(cplayer)
game.addplayer(hplayer)
while 1:
    tick+=1
    camera.run()
    game.run()
    time.sleep(0.02)

我在 Tkinter 中使用 python 3.7。

布莱恩奥克利

您问的是如何以编程方式滚动画布。画布控制什么的全部绘制区域的部分是在当前时间可见的了XView和yview方法:xviewxview_movetoxview_scrollyviewyview_moveto,和yview_scroll

xview_scrollyview_scroll方法接受一个整数金额,然后字符串“单位”或“网页”。“单位”是指由xscrollincrementyscrollincrement属性定义的距离“pages”使窗口以窗口宽度或高度的 9/10 为增量滚动。

例如,如果您希望能够按单个像素滚动,您可以设置xscrollincrement1,并使用xview_scroll向左或向右移动。

canvas.configure(xscrollincrement=1)
...
canvas.xview_scroll(1, "units")

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

d3.js x3dom:如何冻结相机位置并获取轴?

来自分类Dev

如何在 Google Maps iOS SDK 中获取当前相机位置的标记数据?

来自分类Dev

如何在我的当前位置设置标记并更改百度地图中的相机位置(目标c)

来自分类Dev

如何在python 3中打开文件

来自分类Dev

如何在Python 3中简化IF语句

来自分类Dev

从可绘制的3D图形中获取相机位置

来自分类Dev

Python GTK + 3:如何在TreeView中设置行

来自分类Dev

您如何在Python3中设置Cookie策略?

来自分类Dev

如何在Doctrine(Symfony 3)实体中设置列位置

来自分类Dev

如何在python中理解`3 <range(3)`

来自分类Dev

如何在python中打印3x3数组?

来自分类Dev

如何在Spyder 3中使用Python 3?

来自分类Dev

如何在D3.js中的画布对象中设置边距或填充

来自分类Dev

如何在OSX上为python3设置别名

来自分类Dev

如何在Python 3中将Turtle画布另存为图像(.png或.jpg)

来自分类Dev

如何在Centos 7上正确安装python3

来自分类Dev

如何使用Python在Maya中为多边形对象设置随机位置?

来自分类Dev

如何在python 3中从Excel文档中解析文本?

来自分类Dev

如何在Python 3中使用urllib中的basejoin

来自分类Dev

如何在Python 3中从元组中反转并选择元素?

来自分类Dev

如何在Python3中的类中调用函数

来自分类Dev

如何在Python 3中的字符串中查找'\'

来自分类Dev

如何在 Python 3 中更改 csv 中的日期格式

来自分类Dev

如何在Python 3中使用wxPython?

来自分类Dev

如何在python3中跳过枚举编码异常?

来自分类Dev

如何在python 3中的函数内替换变量的值

来自分类Dev

如何在python 3中从resource_stream加载json

来自分类Dev

如何在Python 3中输出实时JSON提要?

来自分类Dev

如何在Python3中组合哈希码?

Related 相关文章

  1. 1

    d3.js x3dom:如何冻结相机位置并获取轴?

  2. 2

    如何在 Google Maps iOS SDK 中获取当前相机位置的标记数据?

  3. 3

    如何在我的当前位置设置标记并更改百度地图中的相机位置(目标c)

  4. 4

    如何在python 3中打开文件

  5. 5

    如何在Python 3中简化IF语句

  6. 6

    从可绘制的3D图形中获取相机位置

  7. 7

    Python GTK + 3:如何在TreeView中设置行

  8. 8

    您如何在Python3中设置Cookie策略?

  9. 9

    如何在Doctrine(Symfony 3)实体中设置列位置

  10. 10

    如何在python中理解`3 <range(3)`

  11. 11

    如何在python中打印3x3数组?

  12. 12

    如何在Spyder 3中使用Python 3?

  13. 13

    如何在D3.js中的画布对象中设置边距或填充

  14. 14

    如何在OSX上为python3设置别名

  15. 15

    如何在Python 3中将Turtle画布另存为图像(.png或.jpg)

  16. 16

    如何在Centos 7上正确安装python3

  17. 17

    如何使用Python在Maya中为多边形对象设置随机位置?

  18. 18

    如何在python 3中从Excel文档中解析文本?

  19. 19

    如何在Python 3中使用urllib中的basejoin

  20. 20

    如何在Python 3中从元组中反转并选择元素?

  21. 21

    如何在Python3中的类中调用函数

  22. 22

    如何在Python 3中的字符串中查找'\'

  23. 23

    如何在 Python 3 中更改 csv 中的日期格式

  24. 24

    如何在Python 3中使用wxPython?

  25. 25

    如何在python3中跳过枚举编码异常?

  26. 26

    如何在python 3中的函数内替换变量的值

  27. 27

    如何在python 3中从resource_stream加载json

  28. 28

    如何在Python 3中输出实时JSON提要?

  29. 29

    如何在Python3中组合哈希码?

热门标签

归档