使用 graphics.py 和键盘,如何根据键盘输入使角色移动?
Using graphics.py and the keyboard, how can I make a character move based upon keyboard input?
我是一个非常新手 python 编码员,刚开始修补 graphics.py,所以请原谅我可能很糟糕的代码。我只想知道如何使用有效的 keyboard/graphics 函数。现在如果我 运行 这个,它不会按照我想要的方式移动角色。我希望能够按下 WASD 键,让屏幕上的方块移动。
from graphics import *
import keyboard
point1 = Point(680, 420)
point2 = Point(720, 380)
class Player:
def __init__(self, char, window):
self.p1 = char
self.win = window
def create_Player(self):
self.p1.setFill(color_rgb(0, 255, 0))
self.p1.draw(self.win)
self.win.getMouse()
self.win.close()
def movement(self):
global point1, point2
if keyboard.is_pressed("d"):
self.p1.move(10, 0)
if keyboard.is_pressed("a"):
self.p1.move(-10, 0)
if keyboard.is_pressed("s"):
self.p1.move(0, 10)
if keyboard.is_pressed("w"):
self.p1.move(0, -10)
p1 = Player(Rectangle(point1, point2), GraphWin("mini graphic game", 1400, 800))
p1.create_Player()
while True:
p1.movement()
所有 GUI 运行 的事件循环一直有效,直到您关闭 window 并且它会阻止其他元素,您必须学习如何使用此循环。
在您的代码中,此循环在 self.win.getMouse()
中,因此您的循环在关闭 window 后 运行 秒。
使用 self.win.getMouse()
中的代码,我创建了自己的循环,其中 运行 具有相同的元素,p1.movement()
使用 self.win.lastKey
获取最后单击的键。目前的问题是,即使您释放该值,该值也会保留最后一个键,因此即使您不按键,对象也会移动。它使用隐藏的 _onKey()
,这意味着 onKeyPress
,但代码也需要 _onKeyRelease()
。也许后来我做到了。
顺便说一句:graphics.py source code 我检查了这些信息。
from graphics import *
import time
# --- classes ---
class Player:
def __init__(self, window, char):
self.p1 = char
self.win = window
def create(self):
self.p1.setFill(color_rgb(0, 255, 0))
self.p1.draw(self.win)
def movement(self):
if self.win.lastKey == "d":
self.p1.move(10, 0)
if self.win.lastKey == "a":
self.p1.move(-10, 0)
if self.win.lastKey == "s":
self.p1.move(0, 10)
if self.win.lastKey == "w":
self.p1.move(0, -10)
# --- main ---
point1 = Point(680, 420)
point2 = Point(720, 380)
win = GraphWin("mini graphic game", 1400, 800)
p1 = Player(win, Rectangle(point1, point2))
p1.create()
while not win.isClosed():
p1.movement()
win.update()
time.sleep(.1)
win.close()
编辑: 不按键时停止播放器的版本。我添加了 onKeyPress
和 onKeyRelease
来设置 self.keys["d"] = True/False
中的值,可用于 运行 和停止播放器。
我还添加了随机移动的敌人。
from graphics import *
import time
import random
# --- classes ---
class Window(GraphWin):
def __init__(self, title="Graphics Window",
width=200, height=200, autoflush=True):
super().__init__(title, width, height, autoflush)
self.bind_all("<KeyPress>", self._onKeyPress)
self.bind_all("<KeyRelease>", self._onKeyRelease)
self.keys = dict() # dictionary for `keys[event.keysym] = True/False`
def _onKeyPress(self, event):
self.keys[event.keysym] = True
def _onKeyRelease(self, event):
self.keys[event.keysym] = False
class Player:
def __init__(self, window, char, color):
self.win = window
self.rect = char
self.color = color
self.rect.setFill(self.color)
self.rect.draw(self.win)
def movement(self):
# use `keys.get("d")` instead of `keys["d"]` because `"d"` may not exists in dictionary `key`
if self.win.keys.get("d"):
self.rect.move(10, 0)
if self.win.keys.get("a"):
self.rect.move(-10, 0)
if self.win.keys.get("s"):
self.rect.move(0, 10)
if self.win.keys.get("w"):
self.rect.move(0, -10)
class Enemy:
def __init__(self, window, rect, color):
self.win = window
self.rect = rect
self.color = color
self.rect.setFill(self.color)
self.rect.draw(self.win)
def movement(self):
dx = random.randint(-30, 30)
dy = random.randint(-30, 30)
self.rect.move(dx, dy)
# --- main ---
point1 = Point(680, 420)
point2 = Point(720, 380)
point3 = Point(180, 420)
point4 = Point(220, 380)
win = Window("mini graphic game", 1400, 800)
player = Player(win, Rectangle(point1, point2), color_rgb(0, 255, 0))
enemies = [Enemy(win, Rectangle(point3, point4), color_rgb(255, 0, 0)) for _ in range(10)]
while not win.isClosed():
player.movement()
for e in enemies:
e.movement()
win.update()
time.sleep(.1)
win.close()
我是一个非常新手 python 编码员,刚开始修补 graphics.py,所以请原谅我可能很糟糕的代码。我只想知道如何使用有效的 keyboard/graphics 函数。现在如果我 运行 这个,它不会按照我想要的方式移动角色。我希望能够按下 WASD 键,让屏幕上的方块移动。
from graphics import *
import keyboard
point1 = Point(680, 420)
point2 = Point(720, 380)
class Player:
def __init__(self, char, window):
self.p1 = char
self.win = window
def create_Player(self):
self.p1.setFill(color_rgb(0, 255, 0))
self.p1.draw(self.win)
self.win.getMouse()
self.win.close()
def movement(self):
global point1, point2
if keyboard.is_pressed("d"):
self.p1.move(10, 0)
if keyboard.is_pressed("a"):
self.p1.move(-10, 0)
if keyboard.is_pressed("s"):
self.p1.move(0, 10)
if keyboard.is_pressed("w"):
self.p1.move(0, -10)
p1 = Player(Rectangle(point1, point2), GraphWin("mini graphic game", 1400, 800))
p1.create_Player()
while True:
p1.movement()
所有 GUI 运行 的事件循环一直有效,直到您关闭 window 并且它会阻止其他元素,您必须学习如何使用此循环。
在您的代码中,此循环在 self.win.getMouse()
中,因此您的循环在关闭 window 后 运行 秒。
使用 self.win.getMouse()
中的代码,我创建了自己的循环,其中 运行 具有相同的元素,p1.movement()
使用 self.win.lastKey
获取最后单击的键。目前的问题是,即使您释放该值,该值也会保留最后一个键,因此即使您不按键,对象也会移动。它使用隐藏的 _onKey()
,这意味着 onKeyPress
,但代码也需要 _onKeyRelease()
。也许后来我做到了。
顺便说一句:graphics.py source code 我检查了这些信息。
from graphics import *
import time
# --- classes ---
class Player:
def __init__(self, window, char):
self.p1 = char
self.win = window
def create(self):
self.p1.setFill(color_rgb(0, 255, 0))
self.p1.draw(self.win)
def movement(self):
if self.win.lastKey == "d":
self.p1.move(10, 0)
if self.win.lastKey == "a":
self.p1.move(-10, 0)
if self.win.lastKey == "s":
self.p1.move(0, 10)
if self.win.lastKey == "w":
self.p1.move(0, -10)
# --- main ---
point1 = Point(680, 420)
point2 = Point(720, 380)
win = GraphWin("mini graphic game", 1400, 800)
p1 = Player(win, Rectangle(point1, point2))
p1.create()
while not win.isClosed():
p1.movement()
win.update()
time.sleep(.1)
win.close()
编辑: 不按键时停止播放器的版本。我添加了 onKeyPress
和 onKeyRelease
来设置 self.keys["d"] = True/False
中的值,可用于 运行 和停止播放器。
我还添加了随机移动的敌人。
from graphics import *
import time
import random
# --- classes ---
class Window(GraphWin):
def __init__(self, title="Graphics Window",
width=200, height=200, autoflush=True):
super().__init__(title, width, height, autoflush)
self.bind_all("<KeyPress>", self._onKeyPress)
self.bind_all("<KeyRelease>", self._onKeyRelease)
self.keys = dict() # dictionary for `keys[event.keysym] = True/False`
def _onKeyPress(self, event):
self.keys[event.keysym] = True
def _onKeyRelease(self, event):
self.keys[event.keysym] = False
class Player:
def __init__(self, window, char, color):
self.win = window
self.rect = char
self.color = color
self.rect.setFill(self.color)
self.rect.draw(self.win)
def movement(self):
# use `keys.get("d")` instead of `keys["d"]` because `"d"` may not exists in dictionary `key`
if self.win.keys.get("d"):
self.rect.move(10, 0)
if self.win.keys.get("a"):
self.rect.move(-10, 0)
if self.win.keys.get("s"):
self.rect.move(0, 10)
if self.win.keys.get("w"):
self.rect.move(0, -10)
class Enemy:
def __init__(self, window, rect, color):
self.win = window
self.rect = rect
self.color = color
self.rect.setFill(self.color)
self.rect.draw(self.win)
def movement(self):
dx = random.randint(-30, 30)
dy = random.randint(-30, 30)
self.rect.move(dx, dy)
# --- main ---
point1 = Point(680, 420)
point2 = Point(720, 380)
point3 = Point(180, 420)
point4 = Point(220, 380)
win = Window("mini graphic game", 1400, 800)
player = Player(win, Rectangle(point1, point2), color_rgb(0, 255, 0))
enemies = [Enemy(win, Rectangle(point3, point4), color_rgb(255, 0, 0)) for _ in range(10)]
while not win.isClosed():
player.movement()
for e in enemies:
e.movement()
win.update()
time.sleep(.1)
win.close()