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