ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2d游戏设计,pygame 游戏开发

2021-04-01 11:51:10  阅读:242  来源: 互联网

标签:land 游戏 time 2d player pygame jk rect


此次作业是使用pygame模块自主设计一款2D游戏。

此次制作的游戏灵感来源于jumpKing,这是一款出售于steam的高技术游戏。

我们选择了他们的操作方式: 需A、D键来控制人物的移动,以及空格键使人物跳跃,并且空格键蓄力时间越长跳的越高

下面开始介绍一下,我们此次游戏的制作过程吧。

一,设计游戏的基本逻辑和界面。
这是在草稿本上画的一些基础的界面和事件的触发判定等等。

完整的游戏设计并没有在里面完全展示。

二,游戏中的class设计
1,player类
在Player类中,我们给了基础的自身属性:

rect为人物出现的初始位置,我们将人物的初始位置放置于随机出现的第一个平台的中间上方,所以需要创建人物时来导入,方便绘制人物的初始位置。

faceR属性判断人物的运动方向,1代表向右运动,2代表向左运动。

speed属性为人物在x轴上的运动速度。

gravity属性为人物在y轴上的降落速度。

live属性为判断人物是否存活。

Drop函数来控制人物降落。

Move函数控制人物的y轴移动,需要输入time,这个time是玩家按住空格键的时间,以此来控制人物y轴移动的长短。

class Player():
def init(self, pos):
self.rect = pos
self.faceR = 1 #1为向右,2为向左
self.speed = 2
self.gravity = 10
self.live = True #是否存活

def Drop(self):
    self.rect.top += self.gravity
def Move(self, time):
    tmp = 0.2*self.speed*time*time  - self.gravity
    if tmp <= 0:
        tmp = 0
    self.rect.top -= tmp
    self.rect.left += self.speed*time*self.faceR

2,Land类
这个class中,我们给了land类的基本属性:

image属性是用来存储land的图片,

rect属性设定了land的Rect属性,通过后面随机函数产生不同的left值,来控制land出现的不同位置。

rect.topleft接收外界给的init_pos值,即land的left值。

gravity属性为land在y轴上的降落速度。

Move函数即控制land类的降落。

class Land(pygame.sprite.Sprite):
def init(self, land_img, init_pos):
pygame.sprite.Sprite.init(self)
self.image = land_img
self.rect = pygame.Rect(0,0,100,20)
self.rect.topleft = init_pos
self.gravity = 4
def Move(self):
self.rect.top += self.gravity
三,程序的基本代码
下面是按照pygame的基础设置,来给定画面的宽和高,和接下来会用到的一些属性值。应该会在下面具体用到时再详细讲述。

pygame.init()
width = 800
height = 800

window = pygame.display.set_mode((width,height))
pygame.display.set_caption(‘jumpK’)

pygame.font.init()

time = 0

white = 255, 255, 255
black = 0, 0, 0

land_frequency = 0

land_width = 100

#保存产生的所有land
lands = pygame.sprite.Group()

#player = Player()
create_player = True

player_rect = pygame.Rect(0,0,30,54,) #判断人物创建

jk_begin = True
jk_space = False
jk_left = False
jk_right = False

max_time = 0

#分数

score = 0

clock = pygame.time.Clock()
下面的是我们载入的一些图片和音效。

#载入图片
background = pygame.image.load(‘tmp/images/back_img.png’)
land = pygame.image.load(‘tmp/images/land.png’)
game_over = pygame.image.load(‘tmp/images/gameover.png’)

player1 = pygame.image.load(‘tmp/images/player_1.png’)
player2 = pygame.image.load(‘tmp/images/player_2.png’)
player3 = pygame.image.load(‘tmp/images/player_3.png’)
player4 = pygame.image.load(‘tmp/images/player_4.png’)
#载入游戏音效
jump = pygame.mixer.Sound(‘tmp/sounds/jump.wav’)
jump.set_volume(15)
game_over_sound = pygame.mixer.Sound(‘tmp/sounds/game_over.wav’)
game_over_sound.set_volume(0.05)
pygame.mixer.music.load(‘tmp/sounds/background.mp3’)
pygame.mixer.music.play(-1, 0.0)
pygame.mixer.music.set_volume(0.5)
接下来,就是需要不断更新的信息。

running = True #游戏是否结束
while running:
简单设置了游戏的帧率,背景什么的。

clock.tick(30)

window.blit(background, (0, 0))
pygame.draw.rect(window, white, [260, 740, 260, 50], 0)

这里是显示力度条,根据time来显示长度,后面我们会对time进行重置。

#显示力度条
pygame.draw.rect(window, black, [260, 740, time / 20 * 260, 50], 0)

这里通过自己设定的land_frequency来控制平台产生的速度。

#产生下落的平台
if land_frequency % 50 == 0:
    land1_pos = [random.randint(0, width-land_width), 0]
    land1 = Land(land, land1_pos)
    lands.add(land1)

land_frequency += 1
if land_frequency >= 100:
    land_frequency = 0

这里使用判断来确保只运行一次代码。防止对后来的player产生奇怪的控制。

#创建人物
if create_player:
    create_player = False
    player_rect.left = land1.rect.left+40
    player_rect.top = land1.rect.top-55
    player = Player(player_rect)
    #创建初始的人物
    window.blit(player1, player.rect)

我们会在后面将每次产生的land存入一个group中,方便在这里不停的绘制,使用land的Move函数。

并在这里判断人物和land是否存在碰撞,并设置“jk_”开头布尔类,这些在后面来控制程序进行。

并且当平台低于一定高度时,我们会将那部分land从group中消去。

for tmp_land in lands:
    #绘制下落的平台
    window.blit(land, tmp_land.rect)
    #下坠
    tmp_land.Move()
    if pygame.sprite.collide_circle(tmp_land,player):
        #score += 100
        jk_right = False
        jk_left = False
        jk_space = False
        jk_begin = True
        player.gravity = 4

    #删除底部的平台
    if tmp_land.rect.y >= 650:
        lands.remove(tmp_land)

在player的live属性为True时,我们接受键盘的值,

如果是空格的话,改变player的相关属性。

time加0.5,绘制力度条,

当time达到20时,time将不会增加。

如果同时有左键或右键输入,我们将改变player的faceR属性,来控制人物的x轴运动方向。

#人物空格移动
if player.live:
    if jk_begin:
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_SPACE]:
            jump.play()
            jk_space = True
            jk_left = False
            jk_right = False
            window.blit(player2, player.rect)
            player.faceR = 0
            player.gravity = 10
            time += 0.5
            player.Move(time)
        else:
            jump.stop()
            jk_begin = False
            time = 0
        if time >= 20:
            jump.stop()
            time = 20
            max_time += 1
            if max_time >= 10:
                jk_begin = False
                time = 0


if key_pressed[pygame.K_LEFT] and key_pressed[pygame.K_SPACE]:
        jk_space = False
        jk_left = True
        jk_right = False
        window.blit(player3, player.rect)
        player.faceR = -1
        player.Move(time)
if key_pressed[pygame.K_RIGHT] and key_pressed[pygame.K_SPACE]:
        jk_space = False
        jk_left = False
        jk_right = True
        window.blit(player4, player.rect)
        player.faceR = 1
        player.Move(time)

我们需要对人物进行一些纠正,以防止人物图像超出画面的边界。

#纠正人物超过边缘
if player.rect.y <= -54:
    player.rect.y = -54
if player.rect.x <= 0:
    player.rect.x = 0
    time = 0
    jk_begin = False
if player.rect.x >= 770:
    player.rect.x = 770

同时,当人物的rect.y超出了750就会显示游戏结束的图片。还有player的live属性为FALSE这样,就不会继续接受玩家的键盘指令了。

#游戏结束
if player.rect.y >= 750:
    game_over_sound.play()
    player.live = False
    window.blit(game_over, (0, 0))

在最后我们统一更新人物绘制和当玩家键入不同按键时,人物的不同动作(包括正常站立,下蹲,向左看,向右看)

#更新人物,判断人物动作
if (not jk_right) and (not jk_left) and (not jk_space):
    window.blit(player1, player.rect)
if jk_space:
    window.blit(player2, player.rect)
if jk_left:
    window.blit(player3, player.rect)
if jk_right:
    window.blit(player4, player.rect)
player.Drop()

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
pygame.display.update()

四,结言
本次是我们首次使用pygame来自行进行游戏开发。

这里,我们删去了在平台上按左、右键和A、D键来控制人物移动的操作,仅用左、右键和A、D键来控制人物移动的方式。

同时我们也没有制作出大量的地形来丰富游戏的丰富性和趣味性,仅仅使用了不断降落的平台来代替固定的地形。

还有缺点是奇怪的运动轨迹、人物可以从下穿破平台、人物会浮空(这个应该和pygame的判定有些关系吧)

如果还有下次的话,希望能改正这些缺点。

标签:land,游戏,time,2d,player,pygame,jk,rect
来源: https://blog.51cto.com/14621511/2679147

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有