[course]08 游戏模块02-1
这部分游戏主要跟图像和滚动相关,是对图像的一个衍生
使用自定义类来创建
和之前的不同,这次使用自定义类来进行创建,通过继承APP来创建。
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
self.counter = 0
def keyPressed(self, event):
self.counter += 1
def redrawAll(self, canvas):
canvas.create_text(self.width/2, self.height/2,
text=f'{self.counter} keypresses', font='Arial 30 bold')
MyApp(width=400, height=400)
使用定义的快捷键
绑定模块中自定义的快捷键来进行操作 在game_graphics中的_keyPressedWrapper定义了相应的内容
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
self.counter = 0
def timerFired(self):
self.counter += 1
def redrawAll(self, canvas):
canvas.create_text(200, 50, text='Keyboard Shortcut Demo')
canvas.create_text(200, 100, text='Press control-p to pause/unpause')
canvas.create_text(200, 150, text='Press control-s to save a snapshot')
canvas.create_text(200, 200, text='Press control-q to quit')
canvas.create_text(200, 250, text='Press control-x to hard exit')
canvas.create_text(200, 300, text=f'{self.counter}')
MyApp(width=400, height=400) # quit still runs next one, exit does not
MyApp(width=600, height=600)
记录数遍跟踪信息
相关键盘和鼠标的事件 keyPressed、keyReleased 键盘的相应操作 mousePressed、mouseReleased 鼠标的点击和释放 mouseMoved 鼠标移动 mouseDragged 鼠标拖动 sizeChanged 窗口大小变换
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
self.messages = ['appStarted']
def appStopped(self):
self.messages.append('appStopped')
print('appStopped!')
def keyPressed(self, event):
self.messages.append('keyPressed: ' + event.key)
def keyReleased(self, event):
self.messages.append('keyReleased: ' + event.key)
def mousePressed(self, event):
self.messages.append(f'mousePressed at {(event.x, event.y)}')
def mouseReleased(self, event):
self.messages.append(f'mouseReleased at {(event.x, event.y)}')
def mouseMoved(self, event):
self.messages.append(f'mouseMoved at {(event.x, event.y)}')
def mouseDragged(self, event):
self.messages.append(f'mouseDragged at {(event.x, event.y)}')
def sizeChanged(self):
self.messages.append(f'sizeChanged to {(self.width, self.height)}')
def redrawAll(self, canvas):
font = 'Arial 20 bold'
canvas.create_text(self.width/2, 30, text='Events Demo', font=font)
n = min(10, len(self.messages))
i0 = len(self.messages)-n
for i in range(i0, len(self.messages)):
canvas.create_text(self.width/2, 100+50*(i-i0),
text=f'#{i}: {self.messages[i]}',
font=font)
MyApp(width=600, height=600)
控制输入事件
控制输入事件,绑定输入内容
# This demos app.getUserInput(prompt) and app.showMessage(message)
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
self.message = 'Click the mouse to enter your name!'
def mousePressed(self, event):
name = self.getUserInput('What is your name?')
if (name == None):
self.message = 'You canceled!'
else:
self.showMessage('You entered: ' + name)
self.message = f'Hi, {name}!'
def redrawAll(self, canvas):
font = 'Arial 24 bold'
canvas.create_text(self.width/2, self.height/2,
text=self.message, font=font)
MyApp(width=500, height=300)
图片控制
输入图片的几种方式
输入图片的几种方式: 1. 直接通过本地图片 2. 通过线上的图片链接 3. 通过跳转图片链接
使用loadImage 来读入图片 使用scaleImage来改变图片的大小
# This demos loadImage and scaleImage from a url
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
#url = '11.jpg'
#url = 'http://hbimg.b0.upaiyun.com/341920a3c7ad84de5c8e8945b35c1957b90f81ae31c3e-uxvEFE_fw658'
url = 'https://www.mtyyw.com/wp-content/uploads/2015/06/Fight-Club.jpg'
self.image1 = self.loadImage(url)
self.image2 = self.scaleImage(self.image1, 2/3)
def redrawAll(self, canvas):
canvas.create_image(200, 300, image=ImageTk.PhotoImage(self.image1))
canvas.create_image(500, 300, image=ImageTk.PhotoImage(self.image2))
MyApp(width=700, height=600)
输出图片的大小
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
url = '11.jpg'
self.image1 = self.loadImage(url)
self.image2 = self.scaleImage(self.image1, 2/3)
def drawImageWithSizeBelowIt(self, canvas, image, cx, cy):
canvas.create_image(cx, cy, image=ImageTk.PhotoImage(image))
imageWidth, imageHeight = image.size
msg = f'Image size: {imageWidth} x {imageHeight}'
canvas.create_text(cx, cy + imageHeight/2 + 20,
text=msg, font='Arial 20 bold')
def redrawAll(self, canvas):
self.drawImageWithSizeBelowIt(canvas, self.image1, 200, 300)
self.drawImageWithSizeBelowIt(canvas, self.image2, 500, 300)
MyApp(width=700, height=600)
图片转换
transpose : Transpose image (flip or rotate in 90 degree steps)
def transpose(self, method):
"""
Transpose image (flip or rotate in 90 degree steps)
:param method: One of :py:attr:`PIL.Image.FLIP_LEFT_RIGHT`,
:py:attr:`PIL.Image.FLIP_TOP_BOTTOM`, :py:attr:`PIL.Image.ROTATE_90`,
:py:attr:`PIL.Image.ROTATE_180`, :py:attr:`PIL.Image.ROTATE_270`,
:py:attr:`PIL.Image.TRANSPOSE` or :py:attr:`PIL.Image.TRANSVERSE`.
:returns: Returns a flipped or rotated copy of this image.
"""
# This demos using transpose to flip an image
from game_graphics import *
from tkinter import *
from PIL import Image # <-- need to do this after tkinter import
class MyApp(App):
def appStarted(self):
url = '11.jpg'
self.image1 = self.loadImage(url)
self.image2 = self.image1.transpose(Image.FLIP_LEFT_RIGHT)
def redrawAll(self, canvas):
canvas.create_image(200, 300, image=ImageTk.PhotoImage(self.image1))
canvas.create_image(500, 300, image=ImageTk.PhotoImage(self.image2))
MyApp(width=700, height=600)
截屏和保存图片
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
self.image = None
def keyPressed(self, event):
if (event.key == 'g'):
snapshotImage = self.getSnapshot()
self.image = self.scaleImage(snapshotImage, 0.4)
elif (event.key == 's'):
self.saveSnapshot()
def redrawAll(self, canvas):
canvas.create_text(350, 20, text='Press g to getSnapshot')
canvas.create_text(350, 40, text='Press s to saveSnapshot')
canvas.create_rectangle(50, 100, 250, 500, fill='cyan')
if (self.image != None):
canvas.create_image(525, 300, image=ImageTk.PhotoImage(self.image))
MyApp(width=700, height=600)
Spritesheets 雪碧图
雪碧图用于游戏中的角色运动。
下载文件 blackbird.jpg
# This demos sprites using Pillow/PIL images
# See here for more details:
# https://pillow.readthedocs.io/en/stable/reference/Image.html
# This uses a spritestrip from this tutorial:
# https://www.codeandweb.com/texturepacker/tutorials/how-to-create-a-sprite-sheet
from game_graphics import *
from tkinter import *
class MyApp(App):
def appStarted(self):
url = 'black_bird.jpg'
spritestrip = self.loadImage(url)
self.sprites = []
first_shift_x = 40
first_shift_y = 100
for i in range(8):
sprite = spritestrip.crop(
(0 + 115 * i + first_shift_x, first_shift_y, 115 + 115 * i + first_shift_x, first_shift_y + 130))
self.sprites.append(sprite)
self.spriteCounter = 0
def timerFired(self):
self.spriteCounter = (1 + self.spriteCounter) % len(self.sprites)
def redrawAll(self, canvas):
sprite = self.sprites[self.spriteCounter]
canvas.create_image(200, 200, image=ImageTk.PhotoImage(sprite))
MyApp(width=400, height=400)
作业: 制作自己的雪碧图人物,可以在网上随便的搜索相应的图片模板
Last updated
Was this helpful?