先回答几个问题:为什么不使用C++呢?C++是不可能使用C++的,这辈子都不可能使用C++的。裸指针满天飞,新标准又不会用,用Python调调库岂不是美滋滋。既然这么懒还写个P文章啊?用的库名字叫pyglet,中文资料很少,英文资料也只有官方文档而已。出于好心做好事,决定写一下我是如何一步一步,在完全没有学过图形学的情况下,一步一步撸出一个能动起来的东西的。
一、开始正题安装
最简单的方式
pip install pyglet
GitHub下载,安装
sudo python setup.py installHelloWorld
import pyglet
window = pyglet.window.Window()
label = pyglet.text.Label('Hello, world',
font_name='Times New Roman',
font_size=36,
x=window.width // 2, y=window.height // 2,
anchor_x='center', anchor_y='center')
@window.event
def on_draw():
window.clear()
label.draw()
pyglet.app.run()
效果如下,解释略
如果要画点什么的话,用下面的参数方程画个曲线
from math import sin, cos, sqrt
import pyglet
from pyglet.gl import *
def vec(*args):
return (GLfloat * len(args))(*args)
class GameEventHandler(object): # 这里用GameEventHandler把事件包装了一下
rx, ry = 0, 0
track = []
def on_draw(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# glLoadIdentity()
position = (sin(integral_drift[0] / 2) / sqrt(integral_drift[0]),
cos(integral_drift[1] / 2) / sqrt(integral_drift[1]))
self.track.append(position)
glColor3f(1, 1, 1)
glBegin(GL_LINE_STRIP)
for v in self.track:
glVertex3f(v[0], v[1], 0)
glEnd()
@staticmethod
def on_resize(width, height):
return pyglet.event.EVENT_HANDLED
def scene_init():
# One-time GL setup
glClearColor(0, 0, 0, 1)
glEnable(GL_DEPTH_TEST)
glEnable(GL_CULL_FACE)
glEnable(GL_BLEND) # 启用混合功能,将图形颜色同周围颜色相混合
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glEnable(GL_POLYGON_SMOOTH) # 多边形抗锯齿
# glHint(GL_POLYGON_SMOOTH, GL_NICEST)
glEnable(GL_LINE_SMOOTH) # 线抗锯齿
# glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)
glEnable(GL_POINT_SMOOTH) # 点抗锯齿
# glHint(GL_POINT_SMOOTH, GL_NICEST)
pass
def update(dt):
delta_x = 5 * dt
delta_y = 5 * dt
delta_z = 5 * dt
integral_drift[0] += delta_x
integral_drift[1] += delta_y
integral_drift[2] += delta_z
pass
window = pyglet.window.Window(resizable=True)
scene_init()
integral_drift = [0.1, 0.1, 0.1] # 位移的总和
window.push_handlers(GameEventHandler())
pyglet.app.event_loop.clock.schedule(update) # 单位时间触发update
pyglet.app.run()感觉没什么好解释的,它是会动起来的