51CTO首页
AI.x社区
博客
学堂
精品班
直播训练营
企业培训
鸿蒙开发者社区
WOT技术大会
AIGC创新中国行
IT证书
公众号矩阵
移动端

为你的Python平台类游戏添加跳跃功能

开发 后端
在本期使用 Python Pygame 模块编写视频游戏中,学会如何使用跳跃来对抗重力。

[[313228]]

在本期使用 Python Pygame 模块编写视频游戏中,学会如何使用跳跃来对抗重力。

在本系列的 前一篇文章 中,你已经模拟了重力。但现在,你需要赋予你的角色跳跃的能力来对抗重力。

跳跃是对重力作用的暂时延缓。在这一小段时间里,你是向跳,而不是被重力拉着向下落。但你一旦到达了跳跃的最高点,重力就会重新发挥作用,将你拉回地面。

在代码中,这种变化被表示为变量。首先,你需要为玩家精灵建立一个变量,使得 Python 能够跟踪该精灵是否正在跳跃中。一旦玩家精灵开始跳跃,他就会再次受到重力的作用,并被拉回最近的物体。

设置跳跃状态变量

你需要为你的 Player 类添加两个新变量:

  • 一个是为了跟踪你的角色是否正在跳跃中,可通过你的玩家精灵是否站在坚实的地面来确定
  • 一个是为了将玩家带回地面

将如下两个变量添加到你的 Player 类中。在下方的代码中,注释前的部分用于提示上下文,因此只需要添加最后两行:

  1.                 self.movex = 0
  2.                 self.movey = 0
  3.                 self.frame = 0
  4.                 self.health = 10
  5.                 # 此处是重力相关变量
  6.                 self.collide_delta = 0
  7.                 self.jump_delta = 6

第一个变量 collide_delta 被设为 0 是因为在正常状态下,玩家精灵没有处在跳跃中的状态。另一个变量 jump_delta 被设为 6,是为了防止精灵在第一次进入游戏世界时就发生反弹(实际上就是跳跃)。当你完成了本篇文章的示例,尝试把该变量设为 0 看看会发生什么。

跳跃中的碰撞

如果你是跳到一个蹦床上,那你的跳跃一定非常优美。但是如果你是跳向一面墙会发生什么呢?(千万不要去尝试!)不管你的起跳多么令人印象深刻,当你撞到比你更大更硬的物体时,你都会立马停下。(LCTT 译注:原理参考动量守恒定律)

为了在你的视频游戏中模拟这一点,你需要在你的玩家精灵与地面等东西发生碰撞时,将 self.collide_delta 变量设为 0。如果你的 self.collide_delta 不是 0 而是其它的什么值,那么你的玩家就会发生跳跃,并且当你的玩家与墙或者地面发生碰撞时无法跳跃。

在你的 Player 类的 update 方法中,将地面碰撞相关代码块修改为如下所示:

  1.         ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False)
  2.         for g in ground_hit_list:
  3.             self.movey = 0
  4.             self.rect.y = worldy-ty-ty
  5.             self.collide_delta = 0 # 停止跳跃
  6. if self.rect.y > g.rect.y:
  7. self.health -=1
  8. print(self.health)

这段代码块检查了地面精灵和玩家精灵之间发生的碰撞。当发生碰撞时,它会将玩家 Y 方向的坐标值设置为游戏窗口的高度减去一个瓷砖的高度再减去另一个瓷砖的高度。以此保证了玩家精灵是站在地面,而不是嵌在地面里。同时它也将 self.collide_delta 设为 0,使得程序能够知道玩家未处在跳跃中。除此之外,它将 self.movey 设为 0,使得程序能够知道玩家当前未受到重力的牵引作用(这是游戏物理引擎的奇怪之处,一旦玩家落地,也就没有必要继续将玩家拉向地面)。

此处 if 语句用来检测玩家是否已经落到地面之,如果是,那就扣除一点生命值作为惩罚。此处假定了你希望当你的玩家落到地图之外时失去生命值。这个设定不是必需的,它只是平台类游戏的一种惯例。更有可能的是,你希望这个事件能够触发另一些事件,或者说是一种能够让你的现实世界玩家沉迷于让精灵掉到屏幕之外的东西。一种简单的恢复方式是在玩家精灵掉落到地图之外时,将 self.rect.y 重新设置为 0,这样它就会在地图上方重新生成,并落到坚实的地面上。

撞向地面

模拟的重力使你玩家的 Y 坐标不断增大(LCTT 译注:此处原文中为 0,但在 Pygame 中越靠下方 Y 坐标应越大)。要实现跳跃,完成如下代码使你的玩家精灵离开地面,飞向空中。

在你的 Player 类的 update 方法中,添加如下代码来暂时延缓重力的作用:

  1.         if self.collide_delta < 6 and self.jump_delta < 6:
  2.             self.jump_delta = 6*2
  3.             self.movey -= 33  # 跳跃的高度
  4.             self.collide_delta += 6
  5.             self.jump_delta    += 6

根据此代码所示,跳跃使玩家精灵向空中移动了 33 个像素。此处是 33 是因为在 Pygame 中,越小的数代表距离屏幕顶端越近。

不过此事件视条件而定,只有当 self.collide_delta 小于 6(缺省值定义在你 Player 类的 init 方法中)并且 self.jump_delta 也于 6 的时候才会发生。此条件能够保证直到玩家碰到一个平台,才能触发另一次跳跃。换言之,它能够阻止空中二段跳。

在某些特殊条件下,你可能不想阻止空中二段跳,或者说你允许玩家进行空中二段跳。举个栗子,如果玩家获得了某个战利品,那么在他被敌人攻击到之前,都能够拥有空中二段跳的能力。

当你完成本篇文章中的示例,尝试将 self.collide_deltaself.jump_delta 设置为 0,从而获得百分之百的几率触发空中二段跳。

在平台上着陆

目前你已经定义了在玩家精灵摔落地面时的抵抗重力条件,但此时你的游戏代码仍保持平台与地面置于不同的列表中(就像本文中做的很多其他选择一样,这个设定并不是必需的,你可以尝试将地面作为另一种平台)。为了允许玩家精灵站在平台之上,你必须像检测地面碰撞一样,检测玩家精灵与平台精灵之间的碰撞。将如下代码放于你的 update 方法中:

  1.         plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False)
  2.         for p in plat_hit_list:
  3.             self.collide_delta = 0 # 跳跃结束
  4.             self.movey = 0

但此处还有一点需要考虑:平台悬在空中,也就意味着玩家可以通过从上面或者从下面接触平台来与之互动。

确定平台如何与玩家互动取决于你,阻止玩家从下方到达平台也并不稀奇。将如下代码加到上方的代码块中,使得平台表现得像天花板或者说是藤架。只有在玩家精灵跳得比平台上沿更高时才能跳到平台上,但会阻止玩家从平台下方跳上来:

  1.             if self.rect.y > p.rect.y:
  2.                 self.rect.y = p.rect.y+ty
  3.             else:
  4.                 self.rect.y = p.rect.y-ty

此处 if 语句代码块的第一个子句阻止玩家精灵从平台正下方跳到平台上。如果它检测到玩家精灵的坐标比平台更大(在 Pygame 中,坐标更大意味着在屏幕的更下方),那么将玩家精灵新的 Y 坐标设置为当前平台的 Y 坐标加上一个瓷砖的高度。实际效果就是保证玩家精灵距离平台一个瓷砖的高度,防止其从下方穿过平台。

else 子句做了相反的事情。当程序运行到此处时,如果玩家精灵的 Y 坐标比平台的更大,意味着玩家精灵是从空中落下(不论是由于玩家刚刚从此处生成,或者是玩家执行了跳跃)。在这种情况下,玩家精灵的 Y 坐标被设为平台的 Y 坐标减去一个瓷砖的高度(切记,在 Pygame 中更小的 Y 坐标代表在屏幕上的更高处)。这样就能保证玩家在平台,除非他从平台上跳下来或者走下来。

你也可以尝试其他的方式来处理玩家与平台之间的互动。举个栗子,也许玩家精灵被设定为处在平台的“前面”,他能够无障碍地跳跃穿过平台并站在上面。或者你可以设计一种平台会减缓而又不完全阻止玩家的跳跃过程。甚至你可以通过将不同平台分到不同列表中来混合搭配使用。

触发一次跳跃

目前为此,你的代码已经模拟了所有必需的跳跃条件,但仍缺少一个跳跃触发器。你的玩家精灵的 self.jump_delta 初始值被设置为 6,只有当它比 6 小的时候才会触发更新跳跃的代码。

为跳跃变量设置一个新的设置方法,在你的 Player 类中创建一个 jump 方法,并将 self.jump_delta 设为小于 6 的值。通过使玩家精灵向空中移动 33 个像素,来暂时减缓重力的作用。

  1.     def jump(self,platform_list):
  2.         self.jump_delta = 0

不管你相信与否,这就是 jump 方法的全部。剩余的部分在 update 方法中,你已经在前面实现了相关代码。

要使你游戏中的跳跃功能生效,还有最后一件事情要做。如果你想不起来是什么,运行游戏并观察跳跃是如何生效的。

问题就在于你的主循环中没有调用 jump 方法。先前你已经为该方法创建了一个按键占位符,现在,跳跃键所做的就是将 jump 打印到终端。

调用 jump 方法

在你的主循环中,将方向键的效果从打印一条调试语句,改为调用 jump 方法。

注意此处,与 update 方法类似,jump 方法也需要检测碰撞,因此你需要告诉它使用哪个 plat_list

  1.             if event.key == pygame.K_UP or event.key == ord('w'):
  2.                 player.jump(plat_list)

如果你倾向于使用空格键作为跳跃键,使用 pygame.K_SPACE 替代 pygame.K_UP 作为按键。另一种选择,你可以同时使用两种方式(使用单独的 if 语句),给玩家多一种选择。

现在来尝试你的游戏吧!在下一篇文章中,你将让你的游戏卷动起来。

[[313229]]

Pygame 平台类游戏

以下是目前为止的所有代码:

  1. #!/usr/bin/env python3
  2. # draw a world
  3. # add a player and player control
  4. # add player movement
  5. # add enemy and basic collision
  6. # add platform
  7. # add gravity
  8. # add jumping
  9.  
  10. # GNU All-Permissive License
  11. # Copying and distribution of this file, with or without modification,
  12. # are permitted in any medium without royalty provided the copyright
  13. # notice and this notice are preserved.  This file is offered as-is,
  14. # without any warranty.
  15.  
  16. import pygame
  17. import sys
  18. import os
  19.  
  20. '''
  21. Objects
  22. '''
  23.  
  24. class Platform(pygame.sprite.Sprite):
  25. # x 坐标,y 坐标,图像宽度,图像高度,图像文件
  26.     def __init__(self,xloc,yloc,imgw,imgh,img):
  27.         pygame.sprite.Sprite.__init__(self)
  28.         self.image = pygame.image.load(os.path.join('images',img)).convert()
  29.         self.image.convert_alpha()
  30.         self.rect = self.image.get_rect()
  31.         self.rect.y = yloc
  32.         self.rect.x = xloc
  33.  
  34. class Player(pygame.sprite.Sprite):
  35.     '''
  36.     生成一个玩家
  37.     '''
  38.     def __init__(self):
  39.         pygame.sprite.Sprite.__init__(self)
  40.         self.movex = 0
  41.         self.movey = 0
  42.         self.frame = 0
  43.         self.health = 10
  44.         self.collide_delta = 0
  45.         self.jump_delta = 6
  46.         self.score = 1
  47.         self.images = []
  48.         for i in range(1,9):
  49.             img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
  50.             img.convert_alpha()
  51.             img.set_colorkey(ALPHA)
  52.             self.images.append(img)
  53.             self.image = self.images[0]
  54.             self.rect  = self.image.get_rect()
  55.  
  56.     def jump(self,platform_list):
  57.         self.jump_delta = 0
  58.  
  59.     def gravity(self):
  60.         self.movey += 3.2 # how fast player falls
  61.        
  62.         if self.rect.y > worldy and self.movey >= 0:
  63.             self.movey = 0
  64.             self.rect.y = worldy-ty
  65.        
  66.     def control(self,x,y):
  67.         '''
  68.         控制玩家移动
  69.         '''
  70.         self.movex += x
  71.         self.movey += y
  72.        
  73.     def update(self):
  74.         '''
  75.         更新精灵位置
  76.         '''
  77.        
  78.         self.rect.x = self.rect.x + self.movex
  79.         self.rect.y = self.rect.y + self.movey
  80.  
  81.         # 向左移动
  82.         if self.movex < 0:
  83.             self.frame += 1
  84.             if self.frame > ani*3:
  85.                 self.frame = 0
  86.             self.image = self.images[self.frame//ani]
  87.  
  88.         # 向右移动
  89.         if self.movex > 0:
  90.             self.frame += 1
  91.             if self.frame > ani*3:
  92.                 self.frame = 0
  93.             self.image = self.images[(self.frame//ani)+4]
  94.  
  95.         # 碰撞
  96.         enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False)
  97.         for enemy in enemy_hit_list:
  98.             self.health -= 1
  99.             #print(self.health)
  100.  
  101.         plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False)
  102.         for p in plat_hit_list:
  103.             self.collide_delta = 0 # stop jumping
  104.             self.movey = 0
  105.             if self.rect.y > p.rect.y:
  106.                 self.rect.y = p.rect.y+ty
  107.             else:
  108.                 self.rect.y = p.rect.y-ty
  109.            
  110.         ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False)
  111.         for g in ground_hit_list:
  112.             self.movey = 0
  113.             self.rect.y = worldy-ty-ty
  114.             self.collide_delta = 0 # stop jumping
  115.             if self.rect.y > g.rect.y:
  116.                 self.health -=1
  117.                 print(self.health)
  118.                
  119.         if self.collide_delta < 6 and self.jump_delta < 6:
  120.             self.jump_delta = 6*2
  121.             self.movey -= 33  # how high to jump
  122.             self.collide_delta += 6
  123.             self.jump_delta    += 6
  124.            
  125. class Enemy(pygame.sprite.Sprite):
  126.     '''
  127.     生成一个敌人
  128.     '''
  129.     def __init__(self,x,y,img):
  130.         pygame.sprite.Sprite.__init__(self)
  131.         self.image = pygame.image.load(os.path.join('images',img))
  132.         self.movey = 0
  133.         #self.image.convert_alpha()
  134.         #self.image.set_colorkey(ALPHA)
  135.         self.rect = self.image.get_rect()
  136.         self.rect.x = x
  137.         self.rect.y = y
  138.         self.counter = 0
  139.  
  140.                
  141.     def move(self):
  142.         '''
  143.         敌人移动
  144.         '''
  145.         distance = 80
  146.         speed = 8
  147.  
  148.         self.movey += 3.2
  149.        
  150.         if self.counter >= 0 and self.counter <= distance:
  151.             self.rect.x += speed
  152.         elif self.counter >= distance and self.counter <= distance*2:
  153.             self.rect.x -= speed
  154.         else:
  155.             self.counter = 0
  156.        
  157.         self.counter += 1
  158.  
  159.         if not self.rect.y >= worldy-ty-ty:
  160.             self.rect.y += self.movey
  161.  
  162.         plat_hit_list = pygame.sprite.spritecollide(self, plat_list, False)
  163.         for p in plat_hit_list:
  164.             self.movey = 0
  165.             if self.rect.y > p.rect.y:
  166.                 self.rect.y = p.rect.y+ty
  167.             else:
  168.                 self.rect.y = p.rect.y-ty
  169.  
  170.         ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False)
  171.         for g in ground_hit_list:
  172.             self.rect.y = worldy-ty-ty
  173.  
  174.        
  175. class Level():
  176.     def bad(lvl,eloc):
  177.         if lvl == 1:
  178.             enemy = Enemy(eloc[0],eloc[1],'yeti.png') # 生成敌人
  179.             enemy_list = pygame.sprite.Group() # 创建敌人组
  180.             enemy_list.add(enemy)              # 将敌人添加到敌人组
  181.            
  182.         if lvl == 2:
  183.             print("Level " + str(lvl) )
  184.  
  185.         return enemy_list
  186.  
  187.     def loot(lvl,lloc):
  188.         print(lvl)
  189.  
  190.     def ground(lvl,gloc,tx,ty):
  191.         ground_list = pygame.sprite.Group()
  192.         i=0
  193.         if lvl == 1:
  194.             while i < len(gloc):
  195.                 ground = Platform(gloc[i],worldy-ty,tx,ty,'ground.png')
  196.                 ground_list.add(ground)
  197.                 i=i+1
  198.  
  199.         if lvl == 2:
  200.             print("Level " + str(lvl) )
  201.  
  202.         return ground_list
  203.  
  204.     def platform(lvl,tx,ty):
  205.         plat_list = pygame.sprite.Group()
  206.         ploc = []
  207.         i=0
  208.         if lvl == 1:
  209.             ploc.append((0,worldy-ty-128,3))
  210.             ploc.append((300,worldy-ty-256,3))
  211.             ploc.append((500,worldy-ty-128,4))
  212.  
  213.             while i < len(ploc):
  214.                 j=0
  215.                 while j <= ploc[i][2]:
  216.                     plat = Platform((ploc[i][0]+(j*tx)),ploc[i][1],tx,ty,'ground.png')
  217.                     plat_list.add(plat)
  218.                     j=j+1
  219.                 print('run' + str(i) + str(ploc[i]))
  220.                 i=i+1
  221.  
  222.         if lvl == 2:
  223.             print("Level " + str(lvl) )
  224.  
  225.         return plat_list
  226.  
  227. '''
  228. Setup
  229. '''
  230. worldx = 960
  231. worldy = 720
  232.  
  233. fps = 40 # 帧率
  234. ani = 4  # 动画循环
  235. clock = pygame.time.Clock()
  236. pygame.init()
  237. main = True
  238.  
  239. BLUE  = (25,25,200)
  240. BLACK = (23,23,23 )
  241. WHITE = (254,254,254)
  242. ALPHA = (0,255,0)
  243.  
  244. world = pygame.display.set_mode([worldx,worldy])
  245. backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()
  246. backdropbox = world.get_rect()
  247. player = Player() # 生成玩家
  248. player.rect.x = 0
  249. player.rect.y = 0
  250. player_list = pygame.sprite.Group()
  251. player_list.add(player)
  252. steps = 10 # how fast to move
  253. jump = -24
  254.  
  255. eloc = []
  256. eloc = [200,20]
  257. gloc = []
  258. #gloc = [0,630,64,630,128,630,192,630,256,630,320,630,384,630]
  259. tx = 64 # 瓷砖尺寸
  260. ty = 64 # 瓷砖尺寸
  261.  
  262. i=0
  263. while i <= (worldx/tx)+tx:
  264.     gloc.append(i*tx)
  265.     i=i+1
  266.  
  267. enemy_list = Level.bad( 1, eloc )
  268. ground_list = Level.ground( 1,gloc,tx,ty )
  269. plat_list = Level.platform( 1,tx,ty )
  270.  
  271. '''
  272. 主循环
  273. '''
  274. while main == True:
  275.     for event in pygame.event.get():
  276.         if event.type == pygame.QUIT:
  277.             pygame.quit(); sys.exit()
  278.             main = False
  279.  
  280.         if event.type == pygame.KEYDOWN:
  281.             if event.key == pygame.K_LEFT or event.key == ord('a'):
  282.                 print("LEFT")
  283.                 player.control(-steps,0)
  284.             if event.key == pygame.K_RIGHT or event.key == ord('d'):
  285.                 print("RIGHT")
  286.                 player.control(steps,0)
  287.             if event.key == pygame.K_UP or event.key == ord('w'):
  288.                 print('jump')
  289.  
  290.         if event.type == pygame.KEYUP:
  291.             if event.key == pygame.K_LEFT or event.key == ord('a'):
  292.                 player.control(steps,0)
  293.             if event.key == pygame.K_RIGHT or event.key == ord('d'):
  294.                 player.control(-steps,0)
  295.             if event.key == pygame.K_UP or event.key == ord('w'):
  296.                 player.jump(plat_list)
  297.  
  298.             if event.key == ord('q'):
  299.                 pygame.quit()
  300.                 sys.exit()
  301.                 main = False
  302.  
  303. #    world.fill(BLACK)
  304.     world.blit(backdrop, backdropbox)
  305.     player.gravity() # 检查重力
  306.     player.update()
  307.     player_list.draw(world) # 刷新玩家位置
  308.     enemy_list.draw(world)  # 刷新敌人
  309.     ground_list.draw(world)  # 刷新地面
  310.     plat_list.draw(world)   # 刷新平台
  311.     for e in enemy_list:
  312.         e.move()
  313.     pygame.display.flip()
  314.     clock.tick(fps)

本期是使用 Pygame 模块在 Python 3 中创建视频游戏连载系列的第 7 期。往期文章为:

  • 通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程
  • 使用 Python 和 Pygame 模块构建一个游戏框架
  • 如何在你的 Python 游戏中添加一个玩家
  • 用 Pygame 使你的游戏角色移动起来
  • 如何向你的 Python 游戏中添加一个敌人
  • 在 Pygame 游戏中放置平台
  • 在你的 Python 游戏中模拟引力

 

 

责任编辑:庞桂玉 来源: Linux中国
相关推荐
一场跳跃游戏玩过了吗?
刚看到本题一开始可能想:当前位置元素如果是3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢

2021-11-16 11:32:55

开发 跳跃 游戏
LeetCode题解之跳跃游戏
给定一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

2021-03-12 08:19:20

数组 跳跃 游戏
OpenAI ChatGPT 添加多模态输入功能了解吗?
据介绍,ChatGPT此次推出的语音和图像功能提供了一种新的、更直观的界面类型,允许用户跟它进行语音对话,向ChatGPT展示说话内容。

2023-09-26 19:26:28

OpenAI ChatGPT Twitter
使用BokehPython绘图添加交互性
在这一系列文章中,我通过在每个Python绘图库中制作相同的多条形绘图,来研究不同Python绘图库的特性。这次我重点介绍的是Bokeh(读作“BOEkay”)。

2020-06-19 13:53:47

Bokeh Python 绘图
Android应用添加搜索功能
在Android应用中增加检索功能是个很大的讨论题目。在很多移动设备中的主屏幕中,都内置了快速检索的选项,稍微旧点的设备的话会有检索的按钮。用户通过使用快速检索文本框,能快速检索各种app应用或者通讯录的内容。很多app应用也提供了本地搜索功能,能让用户尽快地找到所需要的信息。

2012-07-30 09:41:04

Android 搜索功能
添加声音到你Python游戏
通过添加声音到你的游戏中,听听当你的英雄战斗、跳跃、收集战利品时会发生什么。学习如何在这个Pygame系列的第十三篇文章中,创建一个声音平台类精灵。

2020-12-02 09:46:08

Python 游戏 编程语言
在你Python平台游戏中放一些奖励
这部分是关于在使用Python的Pygame模块开发的视频游戏总给你的玩家提供收集的宝物和经验值的内容。

2020-11-30 13:33:25

Python 平台类游戏 编程语言
Redis跳跃表如何添加元素?
跳跃表是由多个有序的链表组成的,最底层存储了所有元素的数据,这样存储让它的查询效率更高,查询复杂度从O(n)变为了O(logn)。

2023-06-27 08:53:05

跳跃表 Redis
使用 LVM Fedora 系统添加存储
有时需要在系统中添加另一块磁盘。这就是逻辑卷管理(LVM)的用武之地。LVM的好处之处在于它相当灵活。有几种方法可以添加一块磁盘。这篇文章介绍了一种方法。

2020-12-20 19:26:20

LVM Fedora Linux
应用添加内置收费 In App Purchase
本文讲阐述如何为你现有的应用或游戏添加程序内购买(InAppPurchase)功能。阅读前提:假设了你拥有一定的iPhoneSDK开发基础,和AppStore实践经验。

2013-09-09 16:37:48

iOS应用 添加内置收费 In App Purc
添加计分到你Python游戏
在本系列的第十一篇有关使用PythonPygame模块进行编程的文章中,显示玩家获得战利品或受到伤害时的得分。

2020-11-30 13:45:35

Python 游戏 编程语言
在你Python游戏添加投掷机制
四处奔跑躲避敌人是一回事,反击敌人是另一回事。学习如何在这系列的第十二篇文章中在Pygame中创建平台游戏。

2020-11-30 14:00:16

Python 游戏 编程语言
是哪游戏设计师?
本文是作者对策划的经验分类,将游戏设计师分为军官、佛祖、对抗、上帝、推销、传道、懒惰的抄袭者、艺术家、游戏玩家、工程师、青春期少年、地下城领主等12种类型。如果你想知道自己是哪种类型的游戏设计师,请看下文…

2011-04-08 09:56:03

CAARCserve添加去重和SRM功能
CA昨天宣布了一系列的措施,以加强其旗舰产品ARCserve备份恢复软件以及XOsoft产品线和高可用性的产品,所有这些产品都属于CARecoveryManagement。

2009-05-07 20:05:21

CA SRM Vmware
网站添加上JavaScript禁用提示页面吧
本文主要介绍的是,网站禁用JavaScript脚本的程序,作者从淘宝说起,让我们一起来看。

2011-04-22 11:12:42

JavaScript
游戏焕发新生!微软Windows 11推出全新游戏优化功能
微软宣布在Dev频道的最新预览版中推出了一项新功能,可以优化玩家在Windows11下游玩老游戏的体验。

2022-02-17 20:39:18

微软 Windows 11 游戏优化
Java程序中添加播放MIDI音乐功能
Java程序在多媒体处理方面的确优势不大,但是我们在程序中有些时候又需要一些音乐做为点缀,本文向您介绍在Java程序中添加MIDI音乐功能的例子。

2009-06-14 21:47:14

MIDI Java程序
苹果将尝试 iPhone 添加心理健康功能
据《华尔街日报》报道,苹果公司正在进行一系列新项目,帮助iPhone用户检测压力、抑郁、焦虑和认知能力下降等心理健康问题。

2021-09-22 10:17:50

iPhone 心理健康 苹果
改动少许代码,让iOS游戏跨界Android平台
iOS和Android主宰了整个应用市场,无论是放弃哪一个平台,对于开发者来说都是“艰难的抉择”,但是同时进行两个平台的开发和维护,却并不是一件容易的事。到底还有没有什么好的办法,可以在保证应用质量的情况下,尽可能简单地进行跨平台开发?

2014-04-03 10:29:27

iOS Android 跨界平台

哆哆女性网三才五格起名软件吗起名用8划的字青岛联通用雄字起名字梦幻花园破解版下载下载初春的雨读后感千月周易宝宝取名的seo网络营销推广专员三维机械动画设计网站太原网站设计姓张起个两个字名字学生网站制作方法起个建材公司名字大全小朋友起名字网站国际周易风水公司周公解梦梦见找客户推拿店怎么起名字公司测名起名廊坊市建设网站植物 起名周公解梦剃头性张猪宝宝起名起名任氏做梦吵架是什么征兆周公解梦算命测五行八字周易第九卦韩姓婴儿起名字创业软件专业网络整合营销推广公司淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化