本篇介绍游戏中各个对象的显示如何实现(仅显示模块)(主要也是想让大家熟悉熟悉blit和draw两个函数的使用)
在介绍前先声明一下封面的女孩是《弹丸论破》中的七海千秋(七海小天使)
在这里为了方便讲解,用类把这些都写了一遍,并进行了展示。 实现的有 kid,格子,刺er,传送门,save存档点,elf小精灵,每关名称 。 接下来就开始吧:
kid(Kid):
参数说明:color:颜色;pos:位置;size:尺寸;dead:是否死亡
用到的函数:(画圆)
pygame.draw.circle(screen, color, (x,y),radius,size)'''screen是要画在上面的那个屏幕color指这个圆的颜色(x,y)指圆心位置radius指圆的半径size指圆环的粗细,如果size为0则画一个内部填充的圆'''
代码:
def __init__(self,color,pos,size,dead): self.screen=screen self.color=color self.pos=pos self.size=size self.dead=dead def draw(self): pygame.draw.circle(self.screen, self.color, (int(self.pos[0]), int(self.pos[1])),self.size, 1) if self.dead: pygame.draw.circle(self.screen, (255, 0, 255), (int(self.pos[0]), int(self.pos[1])), int(3 / 4 * self.size), 1)
格子(Ground):
参数说明:color:颜色;poses:一组位置(因为每关可能都有多个格子嘛);size:尺寸
用到的函数:(画矩形)
pygame.draw.rect(screen,color, (x, y,width,height), size)'''screen,color,size和上一个是一样的含义,就不再赘述了(x,y,weight,height):x,y指矩形的左上角顶点的位置;width,height分别表示矩形宽高'''
代码:
class Ground(): def __init__(self,poses,color,size): self.screen = screen self.poses = poses self.color = color self.size = size def draw(self): for i in range(len(self.poses)): pygame.draw.rect(self.screen,background_color, (self.poses[i][0], self.poses[i][1],self.size,self.size), 0) pygame.draw.rect(self.screen,self.color, (self.poses[i][0], self.poses[i][1],self.size,self.size), 4)
刺er(Spine):
参数说明:poses:一组位置;size:尺寸
用到的函数:(画多边形)
pygame.draw.polygon(screen,color,[pos1,pos2,pos3,...])'''screen,color参见kid部分[pos1,pos2,pos3,...]是用来表示多边形的各个顶点(至少三个啦)pos1:一个表位置的数组:[x,y]'''
代码:
class Spine(): def __init__(self, poses,size): self.screen = screen self.poses = poses self.size=size def draw(self): e_g=self.size for i in range(len(self.poses)): pygame.draw.polygon(self.screen, (220, 223, 227), [(self.poses[i][0], self.poses[i][1] + e_g), (self.poses[i][0] + e_g, self.poses[i][1] + e_g), (self.poses[i][0] + e_g / 2, self.poses[i][1])])
传送门(Door):
参数说明:pos:位置;size:尺寸;state:用于标记kid是否进入传送门,若进入则由紫色变为黄色
用到的函数:(画圆,pygame.draw.circle(),参加kid部分)
代码:
class Door(): def __init__(self, pos, state,size): self.screen = screen self.pos = pos self.state = state self.size=size def draw(self): e_g=self.size if self.state == 0: pygame.draw.circle(self.screen, (255, 0, 255), self.pos, int(3 / 2 * e_g), 4) else: pygame.draw.circle(self.screen, yellow, self.pos, int(3 / 2 * e_g), 4)
save存档点(Save):
参数说明:pos:位置
用到的函数:(显示文字)
my_font1=pygame.font.SysFont("arial",18) word = my_font1.render("abcd", True, color,background=None) self.screen.blit(word, pos)'''my_font1(字体):"arial"字体的一种,可自行查询其他类型字体;18是字体大小word: "abcd":文字内容, True:方法中的第二个参数为抗锯齿,建议用True(所谓抗锯齿即,让图案边缘更加平滑,而不是呈现锯齿状,若没有很理解,则可以把True改为False看看效果) color不赘述 background=None:这里是背景色,若不加这一参数,则默认背景为透明blit: pos: 文字第一个字左上角坐标'''
代码:
class Save(): def __init__(self,pos): self.screen=screen self.pos=pos def draw(self): save_word1 = my_font1.render("sa", True, white) save_word2 = my_font1.render("ve", True, white) self.screen.blit(save_word1, [self.pos[0], self.pos[1]]) self.screen.blit(save_word2, [self.pos[0], self.pos[1]+5])
elf小精灵(Elf):
参数说明:pos:位置;color:颜色;size:尺寸
用到的函数:(画圆,pygame.draw.circle(),参加kid部分)
代码:
class Elf(): def __init__(self,pos,color,size): self.screen=screen self.pos=pos self.color=color self.size=size def draw(self): pygame.draw.circle(self.screen, self.color, (int(self.pos[0]), int(self.pos[1])),self.size, 1)
每关名称(LvName)(lv: level):
参数说明:pos:位置;color:颜色;name:关卡名字
用到的函数:(文字,参加save存档点部分)
代码:
class LvName(): def __init__(self,pos,color,name): self.screen=screen self.pos=pos self.color=color self.name=name def draw(self): words=my_font2.render(self.name, True, self.color) self.screen.blit(words,self.pos)
在这里放上本次的全代码:
import pygamefrom pygame import *from sys import exitgame_pygame.init()#pygame.mixer.init()screen_size=(900,600)screen=pygame.display.set_mode(screen_size,0,32)pygame.display.set_caption(game_title)my_font1=pygame.font.SysFont("arial",18)my_font2=pygame.font.SysFont("arial",30)white=(255,255,255)yellow=(255,255,0)purple=(255,0,255)background_color=(0,0,0)#black#pygame.mixer.music.load("./music/Nyan Cat.mp3")#pygame.mixer.music.play(-1)class Kid(): def __init__(self,color,pos,size,dead): self.screen=screen self.color=color self.pos=pos self.size=size self.dead=dead def draw(self): pygame.draw.circle(self.screen, self.color, (int(self.pos[0]), int(self.pos[1])),self.size, 1) if self.dead: pygame.draw.circle(self.screen, (255, 0, 255), (int(self.pos[0]), int(self.pos[1])), int(3 / 4 * self.size), 1)class Ground(): def __init__(self,poses,color,size): self.screen = screen self.poses = poses self.color = color self.size = size def draw(self): for i in range(len(self.poses)): pygame.draw.rect(self.screen,background_color, (self.poses[i][0], self.poses[i][1],self.size,self.size), 0) pygame.draw.rect(self.screen,self.color, (self.poses[i][0], self.poses[i][1],self.size,self.size), 4)class Spine(): def __init__(self, poses,size): self.screen = screen self.poses = poses self.size=size def draw(self): e_g=self.size for i in range(len(self.poses)): pygame.draw.polygon(self.screen, (220, 223, 227), [(self.poses[i][0], self.poses[i][1] + e_g), (self.poses[i][0] + e_g, self.poses[i][1] + e_g), (self.poses[i][0] + e_g / 2, self.poses[i][1])])class Door(): def __init__(self, pos, state,size): self.screen = screen self.pos = pos self.state = state self.size=size def draw(self): e_g=self.size if self.state == 0: pygame.draw.circle(self.screen, (255, 0, 255), self.pos, int(3 / 2 * e_g), 4) else: pygame.draw.circle(self.screen, yellow, self.pos, int(3 / 2 * e_g), 4)class Save(): def __init__(self,pos): self.screen=screen self.pos=pos def draw(self): save_word1 = my_font1.render("sa", True, white) save_word2 = my_font1.render("ve", True, white) self.screen.blit(save_word1, [self.pos[0], self.pos[1]]) self.screen.blit(save_word2, [self.pos[0], self.pos[1]+5])class Elf(): def __init__(self,pos,color,size): self.screen=screen self.pos=pos self.color=color self.size=size def draw(self): pygame.draw.circle(self.screen, self.color, (int(self.pos[0]), int(self.pos[1])),self.size, 1)class LvName(): def __init__(self,pos,color,name): self.screen=screen self.pos=pos self.color=color self.name=name def draw(self): words=my_font2.render(self.name, True, self.color) self.screen.blit(words,self.pos)kid=Kid(white,[300,200],10,0)ground_pos=[[100,500],[130,500],[160,500],[190,500],[220,500],[250,500], [280,500],[310,500],[340,470],[370,440],[400,410],[400,380], [430,350],[430,320],[370,260],[340,260],[280,200],[250,200], [280,140],[310,140],[340,140],[370,140],[400,140],[430,140], [460,140],[490,140],[520,140],[550,140],[580,140],[610,140],[640,140],[670,140]]ground=Ground(ground_pos,white,10)spine_pos=[[370,110],[270,110]]spine=Spine(spine_pos,10)door=Door([700,110],0,10)save=Save([115,485])elf=Elf([100,100],yellow,3)lv_names=["O The Fool","I The Magician"]lv_name=LvName([10,0],white,lv_names[0])while True: for event in pygame.event.get(): if event.type == QUIT: exit() screen.fill((0, 0, 0)) kid.draw() ground.draw() spine.draw() door.draw() save.draw() elf.draw() lv_name.draw() pygame.display.update()
---运行之后是这样子的---
唉,和预想效果不太一样
(什么不太一样,差很多才对吧!喂!)
(╯>д
但是主要是各个对象的大小没有写好,
改一下参数(大小,位置)就可以啦!
那么这个工作就交给你们来熟悉熟悉吧!
(不要给自己懒找借口啊喂!)
(╯>д
第四篇会来讲一讲如何实现kid与周围其他物体实现互动的(格子,刺er,传送门等)