簡體   English   中英

你如何在 Pyglet 中繪制簡單的形狀?

[英]How do you draw simple shapes in Pyglet?

我正在嘗試使用 Pyglet 制作河內塔程序,但在繪制矩形時遇到問題。 這是我的代碼:

import pyglet

width, height = 500, 500
window = pyglet.window.Window(width, height)

rectR = pyglet.image.SolidColorImagePattern(color=(255, 0, 0, 1))
rectG = pyglet.image.SolidColorImagePattern(color=(0, 255, 0, 1))
rectB = pyglet.image.SolidColorImagePattern(color=(0, 0, 255, 1))
rectW = pyglet.image.SolidColorImagePattern(color=(255, 255, 255, 1))

column_img = rectW.create_image(20, 40)
disk7_img = rectR.create_image(140, 20)
disk5_img = rectG.create_image(100, 20)
disk3_img = rectB.create_image(60, 20)

def center_images(images):
    for image in images:
        image.anchor_x = image.width/2
        image.anchor_y = image.height/2
center_images([column_img, disk7_img, disk5_img, disk3_img])

class Sprite:
    def __init__(self, img, x=0, y=0):
        self.img, self.x, self.y = img, x, y

class Column(Sprite):
    def __init__(self, x, y, disk_codes):
        super(Column, self).__init__(column_img, x=x, y=y)
        disks = []
        for disk_code in disk_codes:
            disks.append(Disk(disk_code))
        self.disks = sorted(disks, key= lambda disk: disk.img.width)
        top = 0
        for i, disk in enumerate(self.disks):
            self.disks[i].x = self.x
            self.disks[i].y = self.y - self.img.height/2 + top + disk.img.height/2
            top += disk.img.height

    def draw(self):
        self.img.blit(self.x, self.y)
        for disk in self.disks:
            disk.img.blit(disk.x, disk.y)

class Disk(Sprite):
    def __init__(self, code):
        if code == 'R':
            super(Disk, self).__init__(disk7_img)
        elif code == 'G':
            super(Disk, self).__init__(disk5_img)
        elif code == 'B':
            super(Disk, self).__init__(disk3_img)
        else:
            raise ValueError('Invalid disk code')

column = Column(100, 100, ['R', 'G', 'B'])

@window.event
def on_draw():
    window.clear()
    column.draw()   

pyglet.app.run()

這不是完整的程序,只是為列和磁盤繪制精靈的部分。 目前,它是完全靜態的。 但是,每當我嘗試運行它時,我都會在應該繪制矩形的 'blit' 函數中遇到錯誤。 這是錯誤:

Traceback (most recent call last):
  File "hanoi.py", line 63, in <module>
    pyglet.app.run()
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/app/__init__.py", line 107, in run
    event_loop.run()
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/app/base.py", line 170, in run
    self._run()
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/app/base.py", line 182, in _run
    timeout = self.idle()
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/app/base.py", line 309, in idle
    window.dispatch_event('on_draw')
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/window/__init__.py", line 1320, in dispatch_event
    if EventDispatcher.dispatch_event(self, *args) != False:
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/event.py", line 408, in dispatch_event
    if handler(*args):
  File "hanoi.py", line 61, in on_draw
    column.draw()   
  File "hanoi.py", line 41, in draw
    self.img.blit(self.x, self.y)
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/image/__init__.py", line 901, in blit
    self.get_texture().blit(x, y, z, width, height)
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/image/__init__.py", line 832, in get_texture
    self._current_texture = self.create_texture(Texture, rectangle, force_rectangle)
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/image/__init__.py", line 825, in create_texture
    self.anchor_x, self.anchor_y, 0, None)
  File "/Users/thomasfaulhaber/miniconda3/envs/hanoi/lib/python3.6/site-packages/pyglet/image/__init__.py", line 996, in blit_to_texture
    data)
ctypes.ArgumentError: argument 3: <class 'TypeError'>: wrong type

我不知道該嘗試什么。 我昨天開始使用 Pyglet,所以我很新。 如果答案很明顯,請原諒我。 謝謝!

圖像的錨點必須是完整的。 當您分別計算anchor_xanchor_y時,您必須使用樓層除法運算符 ( // ) 而不是除法運算符 ( / ) :
(見二進制算術運算

def center_images(images):
    for image in images:
        image.anchor_x = image.width // 2
        image.anchor_y = image.height // 2
center_images([column_img, disk7_img, disk5_img, disk3_img])

我知道這個問題並沒有那么老,但是 pyglet 自從發布了這個問題以來,就添加了一個叫做pyglet.shapes東西,它可以很容易地創建Rectangle(x, y, w, h, color) 一個完整的例子是:

import pyglet
from pyglet import shapes

window = pyglet.window.Window(500, 500)
batch = pyglet.graphics.Batch()

red_sequare = shapes.Rectangle(150, 240, 200, 20, color=(255, 55, 55), batch=batch)
green_sequare = shapes.Rectangle(175, 220, 150, 20, color=(55, 255, 55), batch=batch)
blue_sequare = shapes.Rectangle(200, 200, 100, 20, color=(55, 55, 255), batch=batch)

@window.event
def on_draw():
    window.clear()
    batch.draw()

pyglet.app.run()

這將產生:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM