少儿编程分享:手把手教你用PYTHON编写兔獾大作战(二) ...

[复制链接]
sosoyoyo 发表于 2018-1-20 09:18:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
" j4 C% z2 p' A# ~4 t
制作游戏场景
# I/ q6 V6 h! o, Z" Q7 v/ D: a4 k' ^9 t
现在我们要制作游戏场景,这只需要多用几次screen.blit()就可以做到。在代码的第三部分 (#3 )载入小兔子图片后,加上下面两行代码:
" u  k* E  N) b: i' X  pgrass = pygame.image.load("resources/images/grass.png"); e1 i( i9 |% l1 j! O+ I' a  f% s
castle = pygame.image.load("resources/images/castle.png")# P& e4 j4 c8 Q# `4 B; k1 V
这两行代码载入了两张不同的图片并把图片分别放入了不同的变量(variable)中。现在这两张图片就能出现在屏幕上了。不过你会发现,由grass.png载入的草坪背景不能覆盖整个640 x 480的窗口。这意味着你必须调整图片来完全覆盖窗口。6 w7 V2 p2 L/ [
在第六部分(#6)的开头添加以下代码(在确定小兔子位置之前):% h% U& ]; \0 i
for x in range(width/grass.get_width()+1):( T! x8 V; P* M: @
for y in range(height/grass.get_height()+1):
" l) t4 E1 C7 o9 l) ~* W! F screen.blit(grass,(x*100,y*100))
6 G1 Q+ }3 k9 |4 Q) R( Bscreen.blit(castle,(0,30))
* Q; ~4 ?( c$ O1 Y1 gscreen.blit(castle,(0,135))7 ?4 i0 Q" L) N  }( L7 N. F7 q
screen.blit(castle,(0,240))
) ^- j. X" c' Y. \0 ^: N* cscreen.blit(castle,(0,345))
9 z% n- {( A) X& ]! i# W让我们一起来看看上面的代码~for语句先使用x进行循环。在这一层循环中,代码又通过y进行内层循环,然后把草坪图片放在循环得到的x, y 坐标上。接下来的几行代码在屏幕上放置堡垒(castle)。
; ]( D! I8 s# h如果你现在执行程序,你将看到下图的场景:  p5 V$ Z. r; d! v8 K

- ^$ Q! w8 c( [是不是比刚才好多了?:)! L/ q$ K3 g- n
让小兔子动起来!7 t, }; u* }1 Q4 C; P9 g: m
  E: J, W: ]! O6 f: G$ M5 ]

4 w9 t( s8 E  k7 p# d3 d接下来我们要真正开始加入游戏元素啦!比如通过按键盘让小兔子动起来。
! Q) y: B9 M; _* i1 `: e# Z首先,我们需要让程序追踪玩家什么时候按下了什么键。将下面两行代码添加到第二部分(#2)的末尾(在设定游戏窗口的高和宽之后):
. h+ F2 C8 ]; v* i% b+ f1 `keys = [False, False, False, False]0 r5 X7 @$ t& S/ b
playerpos=[100,100]2 u4 K* Y! H9 E. L* G: g& ^( f
在这两行代码中,我们创建了一个名为keys的数组(array),其中有4个False值,每个值对应W、A、S、D中的一个按键。变量playerpos对应小兔子位置坐标。因为在游戏进行的过程中,小兔子会不断移动,所以用一个变量储存小兔子的位置更加方便。8 F- m& g( y" ^
现在,我们要修改现有的代码,把小兔子图片放在playerpos对应的坐标上。把第六部分(#6)中的这行代码:' V& u8 y3 n* O& H
screen.blit(player, (100, 100))
: ~  S9 r; o" ^* U2 D6 |9 |改为:
* O9 o+ R* c* N- j screen.blit(player, playerpos), A& {$ D* t; {. s. u4 i4 C
接下来,我们要使用PyGame自带的event.key函数来检测玩家按下了什么键,并相应地将keys内的False值改为True。
4 ~. q5 L- N! {8 S7 I$ _6 Q在第八部分(#8)的最后,紧接着event.type == pygame.QUIT后,加上这些代码(缩进和pygame.QUIT的if代码块相同):
; A+ N5 \/ P) A& o" b* Mif event.type == pygame.KEYDOWN:
' V7 b% E; ~3 _/ y1 m+ H# U if event.key==K_w:# {8 F# w. \& [
keys[0]=True
) ]9 J7 i" w& K7 \) J3 J elif event.key==K_a:
! x  Z. T% h+ W  i% g keys[1]=True
* ^! i/ n4 P3 l" I- X* U9 ` elif event.key==K_s:
* C, {+ W, D8 ~/ g6 ` keys[2]=True* q% H! j- H" e+ ~0 r" h
elif event.key==K_d:
5 ?4 e) {; C1 X8 b" d) v keys[3]=True
* p, H5 \' w: h* L! e! _if event.type == pygame.KEYUP:
, i6 c! g- T( Y. d if event.key==pygame.K_w:" x8 D1 {% @  N5 Z1 l$ Y* @
keys[0]=False" i! h. k6 e+ M( H
elif event.key==pygame.K_a:
' r( L& h+ {9 S1 i1 O) O: p keys[1]=False
. }) H: H9 [8 m; H" ` elif event.key==pygame.K_s:
2 Y9 t, e4 \) a& ` keys[2]=False" c$ C8 f0 y# ^3 u) N" m
elif event.key==pygame.K_d:8 e3 U4 W3 u4 c- \- |
keys[3]=False
% ~+ q: F8 b8 k) j7 |哇哦!这里有好多行代码呢!不过如果我们将这些代码拆分来看,其实并不是太难。
% K  l- G8 Q& G首先,我们要看看是否(if)有键被按下或者松开了,接着检测是哪个键被按下或者松开了。如果检测到的键是W、A、S、D中的某一个,就相应更新keys数列中的值。接着,你需要根据玩家按下的键更新playerpos变量,这个非常简单,只需要把下面代码加到目前所写的代码最后(使用一个缩进,和for循环同一层)
  E. _+ }5 n: ]# 9 – 移动小兔子5 N4 X1 T) d3 X) S- R1 I
if keys[0]:
6 r( {: n( c5 t1 H! [ playerpos[1]-=53 Q1 q; Q+ @& P: @/ `2 U4 y9 i- m; c
elif keys[2]:
2 `3 M& f. w4 F- |8 \" C playerpos[1]+=5+ n/ A+ S: J! v3 n3 |% C
if keys[1]:; @& M( P2 x5 t
playerpos[0]-=5+ P: @6 Z6 N' F& t+ i
elif keys[3]:1 M9 t( W+ X3 z3 V5 ?! E
playerpos[0]+=5
, [9 U; l* z* N  q4 W这些代码检测哪个键被按下了,并对小兔子的x或y坐标做相应的增减。. C, R0 @( ^2 ^& e! U- H6 A9 G
运行游戏,你会看到和刚才相似的场景。试着按按WASD,你的小兔子动起来了!) r- ]5 h; v4 a; I/ T9 O) c

/ e2 p# v7 b: [(未完待续)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
推荐阅读更多+
阅读排行更多+
用心服务创业者
0851-88611148
周一至周五 9:00-18:00
意见反馈:admin@0851life.com

扫一扫关注我们

Powered by 童码少儿编程 X3.4© 2001-2013 0851life Inc.|网站地图