设为首页 收藏本站
查看: 2234|回复: 0

[经验分享] 写简单游戏,学编程语言-python篇:传说哥大战剧毒术士

[复制链接]

尚未签到

发表于 2015-4-20 09:54:54 | 显示全部楼层 |阅读模式
  上篇写的动画示例其实算不上一个游戏,顶多算是利用pygame进行的图形操作,今天着手实现一个小游戏:传说哥大战剧毒术士。名字很玄乎,其实就是最简单的一个射击游戏。好了废话不多说,先上截图吧:

  
  一、初始化程序和定义变量
  



import pygame
import math
import random
# 1 - Initialize the game
pygame.init()
# prepare the variables
width, height = 640, 480
screen=pygame.display.set_mode((width, height))   
playerpos=[100,100]
speed_x=5
speed_y=5   
speed_bullet=10
speed_shit=3
shot=0
alive=True
bullet=[]
shit=[]
green=[0,255,0]   
# 2 - Load images
player = pygame.image.load("1.bmp")
badguy = pygame.image.load("2.bmp")
backgroud= pygame.image.load("3.bmp")
bullet_bmp=pygame.image.load("4.bmp")
shit_bmp=pygame.image.load("5.bmp")
player.set_colorkey([0,0,0])
badguy.set_colorkey([0,0,0])
shit_bmp.set_colorkey([255,255,255])
  第一部分声明的变量中主要是传说哥的移动速度,子弹的数据,剧毒术士喷出的便便速度等。第二部分预载入图片资源:角色,背景图等。注意设置set_colorkey进行透明色处理(书上有介绍)。
  二、响应事件处理相关
    



1 # 4 - clear the screen before drawing it again
2      screen.fill(0)
3     # 5 - draw the backgroud   
4      for x in range(width/backgroud.get_width()+1):
5          for y in range(height/backgroud.get_height()+1):
6                 screen.blit(backgroud,(x*90,y*65))                  
7      # 6 - loop through the events
8      for event in pygame.event.get():
9          # check if the event is the X button
10          if event.type==pygame.QUIT:
11              # if it is quit the game
12              pygame.quit()
13              exit(0)
14          if event.type==pygame.KEYDOWN:
15             if event.key == pygame.K_w:
16                     playerpos[1]-=speed_y
17             elif event.key == pygame.K_s:
18                     playerpos[1]+=speed_y
19             elif event.key == pygame.K_a:
20                     playerpos[0]-=speed_x
21             elif event.key == pygame.K_d:
22                     playerpos[0]+=speed_x      
23          position = pygame.mouse.get_pos()
24          angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+32))
25          playerrot = pygame.transform.rotate(player, 360-angle*57.29)
26          playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
27          if event.type==pygame.MOUSEBUTTONDOWN:
28              position=pygame.mouse.get_pos()
29              bullet.append([math.atan2(position[1]-(playerpos1[1]+32),
30                     position[0]-(playerpos1[0]+32)),playerpos1[0]+32,playerpos1[1]+32])
  这一部分首先将加载进的背景图片利用blit函数贴到窗口里。随后进入事件循环:这里主要是两种事件:WSAD控制人物运动,鼠标点击射出子弹,由于是用鼠标控制射击方向,因此需要获取图片的新位置,简单的数学知识,偏转角计算如下图,这块的处理具体参照一篇不错的文章http://bbs.chinaunix.net/thread-4094150-1-2.html,这个小东东借鉴了里面很多知识。

  三、处理对战逻辑
    



1         # 7 - process fight        
2          screen.blit(playerrot, playerpos1)
3          for oneshot in bullet:
4              index=0
5              velx=math.cos(oneshot[0])*speed_bullet
6              vely=math.sin(oneshot[0])*speed_bullet
7              oneshot[1]+=velx
8              oneshot[2]+=vely
9              if oneshot[1]640 or oneshot[2]480:
10                  bullet.pop(index)
11              index+=1
12              for eachone in bullet:
13                 pos_x=int(eachone[1])
14                 pos_y=int(eachone[2])
15                 pos=[pos_x,pos_y]
16                 bullet_bmp_new=pygame.transform.rotate(bullet_bmp,360-eachone[0]*57.29)
17                 screen.blit(bullet_bmp_new,pos)
18                 pygame.display.flip()
19          for oneshot in bullet:
20              if oneshot[1]badguy_pos[0] and\
21                 oneshot[2]badguy_pos[1]:
22                  shot+=1
23                  alive=False
24                  break
25          if shot

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58680-1-1.html 上篇帖子: python 解析XML xml.dom 下篇帖子: Python标准库11 多进程探索 (multiprocessing包)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表