用户:天上的流星_tianqiVirus查看:0 回复:0 评论:0 创建时间:2019-07-10T11:59:53
教你用pygame开发游戏
今日游戏:薯架(自创)
如果对几行代码没有看懂,那么你可能是没看过上一次的结果
那就去看看我之前的帖子
这次我们来加分
你看你好不容易吃了几根薯条,然后就没有然后了,这样一来你总归不会感觉好到哪里去
对吧
分数嘛,肯定要来几个变量
不妨叫score和power
所以我们先在两个类前面定义变量
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)
变量有了,但是我就是不让你看,就是不让你知道
以上这句话很不好
所以我们得先显示出来
不然到时候你什么时候蔫了都不知道
大家是不是觉得上次飞机大战的那个变量显示不太美观(那个只有字母,没有图片)
(别回答不是,我说是就是,不是也得是)
那么我们可以用一个图片代表这个变量的名字
分数,就是我们吃到薯条的数量,不妨用薯条盒来代表
同理,能量用番茄酱瓶代替
弄成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))
我还是那句老话,注意缩进(已经有人因为缩进问题来问我了)
但是,我认为,光放上代表变量的图片乍一眼看上去是无法代表变量的
为了分辨,我们可以加上一根条子
我们这次不用图像,用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:天上的流星
本帖内的所有代码,思想仅供参考,请勿用于商业盈利用途
最后留一句话,编程需要多练习,但是完全自己写也不一定好,有时参考网上的代码是需要的
这也是为什么我直接把全代码放出来的原因