猫史档案馆


【pygame:薯架】教你用pygame开发游戏 Season2 Part3

用户:天上的流星_tianqiVirus天上的流星_tianqiVirus查看:0 回复:0 评论:0 创建时间:2019-07-10T11:59:53


教你用pygame开发游戏

今日游戏:薯架(自创)

如果对几行代码没有看懂,那么你可能是没看过上一次的结果

那就去看看我之前的帖子

 

这次我们来加分

你看你好不容易吃了几根薯条,然后就没有然后了,这样一来你总归不会感觉好到哪里去

对吧

分数嘛,肯定要来几个变量

不妨叫scorepower

所以我们先在两个类前面定义变量

score = 0
power = 10

注意,如果一开始能量就是0的话那猫还飞什么

接下来我们可以设定为吃到薯条加分,吃到番茄酱加能量

哦对了,薯条作为油炸食品也是高能量的,所以吃了薯条也加能量

这里我不卖关子,直接讲关于global的事情

global,即全球,放在程序里就叫全局

一个类中无法直接调用全局变量,所以我们需要像import一样把这个全局变量给弄下来

其用法如下

global var

当然,也可以一次性global下来多个变量

global var1,var2

碰撞检测的我不教了,请看飞机大战的帖子

但是有一点大家要注意,为了实时更新数据,我们得把self.rect复制到Update里面去

大家也可以看看上次我们的消灭幻数在这两个类中的结果

class mainCat:
	def __init__(self):
		self.size=[32,32]
		self.image = pygame.transform.喵oothscale(pygame.image.load("assets/image/cat/1.png"),self.size)
		self.x = 100
		self.y = 50
		self.jump = 0
		self.downSpeed = 0.01
		self.jumpSpeed = 1.5
		self.rect = pygame.Rect(self.x,self.y+2,self.size[0],self.size[1]-2)

	def catUpdate(self):
		self.rect = pygame.Rect(self.x,self.y+2,self.size[0],self.size[1]-2)
		self.jump+=self.downSpeed
		self.y+=self.jump

class FrenchFried:
	def __init__(self):
		self.size=[61,23]
		self.image = pygame.transform.喵oothscale(pygame.image.load("assets/image/FrenchFried/2.png"),self.size)
		self.x = 200
		self.y = 200
		self.speed = 0.8
		self.rect = pygame.Rect(self.x+3,self.y+10,self.size[0]-3,self.size[1]-10)

	def friedUpdate(self):
		global windowWidth,windowHeight,score,power
		self.rect = pygame.Rect(self.x+3,self.y+10,self.size[0]-3,self.size[1]-10)
		self.x-=self.speed
		if self.x<=-self.size[0]:
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)
		if self.rect.colliderect(myCat.rect):
			score+=1
			power+=1
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)

class tomatoJam:
	def __init__(self):
		self.size = [80,80]
		self.image = pygame.transform.喵oothscale(pygame.image.load("assets/image/tomatoJam/1.png"),self.size)
		self.x = 300
		self.y = 300
		self.speed = 0.5
		self.rect = pygame.Rect(self.x+24,self.y+38,self.size[0]-25,self.size[1]-20)

	def jamUpdate(self):
		global windowWidth,windowHeight,power
		self.rect = pygame.Rect(self.x+24,self.y+38,self.size[0]-25,self.size[1]-20)
		self.x-=self.speed
		if self.x<=-self.size[0]:
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)
		if self.rect.colliderect(myCat.rect):
			power+=5
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)

 

变量有了,但是我就是不让你看,就是不让你知道

以上这句话很不好

所以我们得先显示出来

不然到时候你什么时候蔫了都不知道

大家是不是觉得上次飞机大战的那个变量显示不太美观(那个只有字母,没有图片)

(别回答不是,我说是就是,不是也得是)

那么我们可以用一个图片代表这个变量的名字

分数,就是我们吃到薯条的数量,不妨用薯条盒来代表

同理,能量用番茄酱瓶代替

center_image

center_image

center_image

center_image

 

弄成pygameSurface

score_i = pygame.image.load("assets/image/FrenchFried/1.png")
power_i = pygame.image.load("assets/image/tomatoJam/2.png")

为了方便理解,我把两个图片所代表的变量放在这个定义的 pygameSurface

同时加上i代表image,图像

关于把显示变量化成面向对象有点繁琐,而且一时三刻也无法完成,所以我们把变量显示时不用面向对象

哦对了

图片很巨大吧

那我们把它化小

score_i = pygame.transform.喵oothscale(pygame.image.load("assets/image/FrenchFried/1.png"),(40,40))
power_i = pygame.transform.喵oothscale(pygame.image.load("assets/image/tomatoJam/2.png"),(40,40))

显示

	screen.blit(score_i,(0,5))
	screen.blit(power_i,(300,5))

我还是那句老话,注意缩进(已经有人因为缩进问题来问我了)

center_image

但是,我认为,光放上代表变量的图片乍一眼看上去是无法代表变量的

为了分辨,我们可以加上一根条子

我们这次不用图像,用pygame里的draw里的rect方法

其用法如下

pygame.draw.rect(screen,(r,b,g),(x,y,width,height))

rbg是颜色,screen是要显示的屏幕,后面一个元组或列表里的四个变量和我们定义rect四个变量同一用途

那么把它放入循环内

	pygame.draw.rect(screen,(75,75,125),(0,0,800,50))

注意,这个rbg值是背景颜色rbg各减25,即更黑

(包大人,太黑了,我们开个灯吧)

(你竟敢说我黑,来人,把他给斩了)

然后显示变量,关于字体,转换图片等问题请参考我飞机大战的教程

那么我这一步就跳过了,至于位置参数,大小参数,rbg值你们可以自己调整

那么我们有了变量,就可以设定跳跃要耗费能量了

	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			keepGoing = False
		if event.type == pygame.MOUSEBUTTONDOWN:
			if event.button == leftButton:
				myCat.jump=-myCat.jumpSpeed
				power-=1

power-=1

这样,游戏的基本设定就完成了

很快吧,就3个part

最终代码如下

import pygame
from random import randint
import sys

#color 				R 		G 		B
backgroundColor = [	100,	100,	155]

windowWidth = 800
windowHeight = 600
leftButton = 1
keepGoing = True
score = 0
power = 10

pygame.init()
screen = pygame.display.set_mode([windowWidth,windowHeight])
pygame.display.set_caption("Potato Cat")
font = pygame.font.SysFont("Lucida Console",20)

score_i = pygame.transform.喵oothscale(pygame.image.load("assets/image/FrenchFried/1.png"),(40,40))
power_i = pygame.transform.喵oothscale(pygame.image.load("assets/image/tomatoJam/2.png"),(40,40))

class mainCat:
	def __init__(self):
		self.size=[32,32]
		self.image = pygame.transform.喵oothscale(pygame.image.load("assets/image/cat/1.png"),self.size)
		self.x = 100
		self.y = 50
		self.jump = 0
		self.downSpeed = 0.01
		self.jumpSpeed = 1.5
		self.rect = pygame.Rect(self.x,self.y+2,self.size[0],self.size[1]-2)

	def catUpdate(self):
		self.rect = pygame.Rect(self.x,self.y+2,self.size[0],self.size[1]-2)
		self.jump+=self.downSpeed
		self.y+=self.jump

class FrenchFried:
	def __init__(self):
		self.size=[61,23]
		self.image = pygame.transform.喵oothscale(pygame.image.load("assets/image/FrenchFried/2.png"),self.size)
		self.x = 200
		self.y = 200
		self.speed = 0.8
		self.rect = pygame.Rect(self.x+3,self.y+10,self.size[0]-3,self.size[1]-10)

	def friedUpdate(self):
		global windowWidth,windowHeight,score,power
		self.rect = pygame.Rect(self.x+3,self.y+10,self.size[0]-3,self.size[1]-10)
		self.x-=self.speed
		if self.x<=-self.size[0]:
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)
		if self.rect.colliderect(myCat.rect):
			score+=1
			power+=1
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)

class tomatoJam:
	def __init__(self):
		self.size = [80,80]
		self.image = pygame.transform.喵oothscale(pygame.image.load("assets/image/tomatoJam/1.png"),self.size)
		self.x = 300
		self.y = 300
		self.speed = 0.5
		self.rect = pygame.Rect(self.x+24,self.y+38,self.size[0]-25,self.size[1]-20)

	def jamUpdate(self):
		global windowWidth,windowHeight,power
		self.rect = pygame.Rect(self.x+24,self.y+38,self.size[0]-25,self.size[1]-20)
		self.x-=self.speed
		if self.x<=-self.size[0]:
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)
		if self.rect.colliderect(myCat.rect):
			power+=5
			self.x = windowWidth
			self.y = randint(0+100,windowHeight-100)

myCat = mainCat()
fried1 = FrenchFried()
jam1 = tomatoJam()

while keepGoing:

	screen.fill(backgroundColor)

	score_text = font.render(str(score),True,(255,255,255))
	power_text = font.render(str(power),True,(255,255,255))

	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			keepGoing = False
		if event.type == pygame.MOUSEBUTTONDOWN:
			if event.button == leftButton:
				myCat.jump=-myCat.jumpSpeed
				power-=1
	
	myCat.catUpdate()
	fried1.friedUpdate()
	jam1.jamUpdate()

	pygame.draw.rect(screen,(75,75,125),(0,0,800,50))
	screen.blit(score_i,(0,5))
	screen.blit(power_i,(300,5))
	screen.blit(power_text,(350,20))
	screen.blit(score_text,(50,20))

	screen.blit(myCat.image,(myCat.x,myCat.y))
	screen.blit(fried1.image,(fried1.x,fried1.y))
	screen.blit(jam1.image,(jam1.x,jam1.y))

	pygame.display.update()

pygame.quit()

这样,我们这一次的任务就完成了

想要继续学习pygame和游戏制作的请关注

id:天上的流星

本帖内的所有代码,思想仅供参考,请勿用于商业盈利用途

 

最后留一句话,编程需要多练习,但是完全自己写也不一定好,有时参考网上的代码是需要的

这也是为什么我直接把全代码放出来的原因


回复

上一页1 页 / 共 0下一页