学习Pygame和巩固Python——画颜色~
這次學習的地址是http://eyehere.net/2011/python-pygame-novice-professional-5/#comment-354
英語水平急劇降低,我還是把學習中碰到的英語單詞記下來吧,,,
1.set the color value for a single pixel:為單個像素設置顏色值
2.Set the?RGBA?or mapped integer color value for a single pixel. If the Surface does not have per pixel alphas, the alpha value is ignored. Setting pixels outside the Surface area or outside the Surface clipping will have no effect.為每個像素設置RGBA或映射整數值,如果不需要透明度,則透明度這個參數被忽略,如果設置的像素位置不在surface上,則是無效的
Getting and setting pixels one at a time is generally too slow to be used in a game or realtime situation.在游戲中或者現實場景中單個單個地設置像素太慢而一般不會使用
This function will temporarily lock and unlock the Surface as needed.這個函數將根據需要臨時鎖定和解鎖surface。
surface.set_at(position,rgba)->examples:
surface.set((200,300),0,0,0,2)或surface.set_at((200,300),0,0,0)
import pygame pygame.init()screen = pygame.display.set_mode((640, 480))all_colors = pygame.Surface((4096,4096), depth=24)for r in xrange(256):print r+1, "out of 256"x = (r&15)*256y = (r>>4)*256for g in xrange(256):for b in xrange(256):all_colors.set_at((x+g, y+b), (r, g, b))pygame.image.save(all_colors, "allcolors.bmp")
我認為這個代碼不能生成所有顏色,下一次的顏色設置有些必然會覆蓋之前設置的顏色。
用一個Python腳本生成三原色:
#!/usr/bin/env python import pygame from pygame.locals import * from sys import exitpygame.init()screen = pygame.display.set_mode((640, 480), 0, 32) #1 def create_scales(height):red_scale_surface = pygame.surface.Surface((640, height))green_scale_surface = pygame.surface.Surface((640, height))blue_scale_surface = pygame.surface.Surface((640, height))for x in range(640):c = int((x/640.)*255.)red = (c, 0, 0)green = (0, c, 0)blue = (0, 0, c)line_rect = Rect(x, 0, 1, height)pygame.draw.rect(red_scale_surface, red, line_rect)#將漸變顏色填充在矩形rect里pygame.draw.rect(green_scale_surface, green, line_rect)pygame.draw.rect(blue_scale_surface, blue, line_rect)return red_scale_surface, green_scale_surface, blue_scale_surfacered_scale, green_scale, blue_scale = create_scales(80)color = [127, 127, 127] #2 while True: #2.1for event in pygame.event.get():if event.type == QUIT:exit()screen.fill((0, 0, 0))screen.blit(red_scale, (0, 00))screen.blit(green_scale, (0, 80))screen.blit(blue_scale, (0, 160)) #2.2x, y = pygame.mouse.get_pos()if pygame.mouse.get_pressed()[0]:for component in range(3):if y > component*80 and y < (component+1)*80:color[component] = int((x/639.)*255.)pygame.display.set_caption("PyGame Color Test - "+str(tuple(color))) #2.3for component in range(3):pos = ( int((color[component]/255.)*639), component*80+40 )pygame.draw.circle(screen, (255, 255, 255), pos, 20)pygame.draw.rect(screen, tuple(color), (0, 240, 640, 240))pygame.display.update()
效果圖如下:
這里先講一下鼠標事件和相關函數,然后再解讀這個程序:
第一個參數表示事件,第二個參數表示該事件產生的條件,第三個參數表示描述該事件的參數
附上一張圖來描述一下:
程序思路:
1.先創建三個子surface,然后將漸變顏色填入這三個子surface里面,這也就是create_scalse函數的作用
2.然后就是while循環了,將三個子surface畫進大的screen里面,并接受處理鼠標事件。#2.2是將鼠標位置值轉換為rgb值,#2.3部分是在鼠標的位置畫圓和更新下方矩形框內的顏色(注意:#2.2和#2.3的執行有小小的區別,#2.2部分的執行是有條件的,即發生鼠標點擊這個事件,而#2.3是每一次while都需要執行的)
然后講解一下pygame.mouse.get_pressed()函數就OK了
該函數返回值有三個參數(x,y,z),當鼠標左鍵點擊后,x的值就返回為1,當鼠標右鍵點擊后,z的值就返回為1,當沒有點擊事件發生時,該函數返回(0,0,0)
另外補充一下get_pressed和MOUSEDOWN事件,當你把鼠標一直按下時,get_pressed就會一直感知到,而MOUSEDOWN只處理一次鼠標按下事件。
附帶一下碰到的資源:http://bbs.fishc.com/thread-62164-1-1.html和http://bbs.fishc.com/thread-62190-1-1.html和http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode
補充一下(復習筆記):
隔了一個星期沒有碰pygame(因為忙于實習和其他事情),重新看第二個程序都有點生疏了,記下現在生疏的地方,看以后還會不會
1.創建一個surface對象,傳入長和寬
pygame.surface.Surface 2.創建一個矩形對象,前面兩個參數是矩形左上角定點的坐標,后面兩個參數分別是寬和高
Rect(x, 0, 1, height) 3.在surface上畫某個矩形框,第一個參數是母surface,第二個參數是顏色,第三個參數是矩形框對象或者四個值
pygame.draw.rect(red_scale_surface, red, line_rect) 4.將一個surface繪制到另外一個surface上,第一個參數是一個surface對象,第二個參數是所需要繪制矩形區域的左頂點的坐標
screen.blit(red_scale, (0, 00)) 5.在surface上畫某個圓,第一個參數為surface對象,第二個參數為顏色,第三個參數為圓心的坐標,第四個參數為半徑
pygame.draw.circle(screen, (255, 255, 255), pos, 20)
總結
以上是生活随笔為你收集整理的学习Pygame和巩固Python——画颜色~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pygame学习和python巩固——字
- 下一篇: 跟着书本重学CSS(1)