pygame學習筆記-打磚塊遊戲開發日誌(二)

接着昨天的程序繼續寫下去,昨天我們已經繪製了好了擋板並且實現了擋板對鍵盤的響應使之能夠根據按鍵進行移動。今天我們開始繪製磚塊。那麼大概的思路是將所有磚塊定義爲精靈,然後全部添加進一個精靈組裏面。這樣方便後面去做磚塊和球的衝突判斷。

這裏我使用了surface.subsurface(rect)這個方法,給磚塊進行貼圖。我們先繪製一個磚塊,來看看代碼功能是否正常。其實代碼非常簡單。

class Block(Sprite):
    def __init__(self,screen):
        super().__init__()
        self.screen = screen
        self.image = pygame.image.load('Block.png')
        self.rect = self.image.get_rect()
        self.frame_rect = self.rect.copy()
        self.frame_rect.width = self.frame_rect.width / 4
        self.frame_rect.height = self.frame_rect.height / 2
        self.rect = self.frame_rect
        self.frame = 0 
        self.last_frame = 7

    def update(self):
        self.block_image = self.image.subsurface(self.frame_rect)

    def blitme(self):
        self.screen.blit(self.block_image,self.rect)

好了讓我們來看看效果怎麼樣?


看起來效果還不錯。

那麼接下來要做的就是將磚塊放入精靈組中,並且將磚塊排列好。

這裏我用的是數組對磚塊進行排列。

其實這裏我用的還是一種比較原始的方法,這個在後面有很大的優化空間。首先我來定義一個數組,這個數組用來規劃磚塊的擺放。其中的數字代表當前磚塊的幀,也就是說數字裏的數字規定磚塊類型。

self.level_01 = (1,3,3,3,1
			,4,1,5,1,4
			,4,1,0,1,4
			,4,1,5,1,4
			,1,3,3,3,1)
for pos in block.level:
	block_wall = Block(screen)
	block_wall.frame = pos
	block_wall.update()
	blocks.add(block_wall)
x = 0
y = 0 

for bx in blocks:
	bx.rect.x += (x+50)
	x += 100
	bx.rect.y += (y+30)
	if bx.rect.x >= 400:
		y += 20
		x = 0

好了,我們來看看效果。

看來效果還可以。 接下來我們就該把球畫上去了。

球的代碼也很簡單,我們來定義一個Ball的類,並且創建實例。確保球能夠以一定的速度運行。同時在觸碰到屏幕邊緣時反彈。

class Ball(Sprite):
	def __init__(self,screen):
		super().__init__()
		self.screen = screen
		self.image = pygame.image.load('ball.png')
		self.rect = self.image.get_rect()
		self.radius = self.rect.width / 2
		self.valx = 4.5
		self.valy = 2

	def update(self):
		self.rect.x += self.valx
		self.rect.y += self.valy
		if self.rect.right >= 600 or self.rect.left <= 0:
			self.valx = -self.valx
		if self.rect.top <= 0 :
			self.valy = -self.valy
		print(self.valx,self.rect.right,self.rect.left)

	def blitme(self):
		self.screen.blit(self.image,self.rect)

效果如下:

OK 現在,這個遊戲裏所有的元素都已經添加完畢了,但是現在,小球、擋板、磚塊之間,並不能產生任何的互動,這是因爲他們目前還都是獨立的精靈,明天我會利用精靈衝突,實現元素之間的互動,從而使這個遊戲更趨於完整。

完整代碼如下:

#!usr/bin/python
#!coding=utf-8

import pygame,sys,random
from pygame.sprite import Sprite,Group

class Paddle(Sprite):
	def __init__(self,screen):
		super().__init__()
		self.screen = screen
		self.image = pygame.image.load('paddle.png')
		self.rect = self.image.get_rect()
		self.rect.bottom = 490
		self.paddle_left = False
		self.paddle_right = False

	def update(self):
		if self.paddle_left and self.rect.left > 0:
			self.rect.centerx -= 8
		if self.paddle_right and self.rect.right < 600:
			self.rect.centerx += 8

	def blitme(self):
		self.screen.blit(self.image,self.rect)

class Ball(Sprite):
	def __init__(self,screen):
		super().__init__()
		self.screen = screen
		self.image = pygame.image.load('ball.png')
		self.rect = self.image.get_rect()
		self.radius = self.rect.width / 2
		self.valx = 4.5
		self.valy = 2

	def update(self):
		self.rect.x += self.valx
		self.rect.y += self.valy
		if self.rect.right >= 600 or self.rect.left <= 0:
			self.valx = -self.valx
		if self.rect.top <= 0 :
			self.valy = -self.valy
		print(self.valx,self.rect.right,self.rect.left)

	def blitme(self):
		self.screen.blit(self.image,self.rect)

class Block(Sprite):
	def __init__(self,screen):
		super().__init__()
		self.screen = screen
		self.mast_image = pygame.image.load('Block.png')
		self.rect = self.mast_image.get_rect()
		self.frame_rect = self.rect.copy()
		self.frame_rect.width = self.frame_rect.width / 4
		self.frame_rect.height = self.frame_rect.height / 2
		self.frame = 0 
		self.last_frame = 7
		self.level_01 = (1,3,3,3,1
						,4,1,5,1,4
						,4,1,0,1,4
						,4,1,5,1,4
						,1,3,3,3,1)
		self.level = self.level_01

	def update(self):
		self.frame_rect.x = self.frame % 4 * self.frame_rect.width
		self.frame_rect.y = self.frame // 4 * self.frame_rect.height
		self.image = self.mast_image.subsurface(self.frame_rect)
		self.rect = self.frame_rect
		self.rect.x = 0
		self.rect.y = 0

	def blitme(self):
		self.screen.blit(self.block_image,self.rect)



pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption('打方塊')
paddle = Paddle(screen)
block = Block(screen)
blocks = Group()
ball = Ball(screen)
for pos in block.level:
	block_wall = Block(screen)
	block_wall.frame = pos
	block_wall.update()
	blocks.add(block_wall)
x = 0
y = 0 

for bx in blocks:
	bx.rect.x += (x+50)
	x += 100
	bx.rect.y += (y+30)
	if bx.rect.x >= 400:
		y += 20
		x = 0
timer = pygame.time.Clock()

while True:
	timer.tick(50)
	ticks = pygame.time.get_ticks()

	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			sys.exit()
		elif event.type == pygame.KEYDOWN:
			if event.key == pygame.K_LEFT:
				paddle.paddle_left = True
			if event.key == pygame.K_RIGHT:
				paddle.paddle_right = True
		elif event.type == pygame.KEYUP:
			if event.key == pygame.K_LEFT:
				paddle.paddle_left = False
			if event.key == pygame.K_RIGHT:
				paddle.paddle_right = False

	screen.fill((224,255,255))
	paddle.update()
	ball.update()
	ball.blitme()
	paddle.blitme()
	blocks.draw(screen)


	pygame.display.flip()



		

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章