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

[复制链接]
sosoyoyo 发表于 2018-1-20 09:18:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

: ]; r4 K% C' E3 T  G制作游戏场景
) N& s7 Y+ W2 @$ B, |& [1 x! P" X9 W0 \2 ?9 G
现在我们要制作游戏场景,这只需要多用几次screen.blit()就可以做到。在代码的第三部分 (#3 )载入小兔子图片后,加上下面两行代码:
% ]; @% l2 v" J, N' B6 a- d' Wgrass = pygame.image.load("resources/images/grass.png")8 P7 I( u& h+ K1 j! i5 S, |
castle = pygame.image.load("resources/images/castle.png")2 p& ^" |$ e) r: B7 _
这两行代码载入了两张不同的图片并把图片分别放入了不同的变量(variable)中。现在这两张图片就能出现在屏幕上了。不过你会发现,由grass.png载入的草坪背景不能覆盖整个640 x 480的窗口。这意味着你必须调整图片来完全覆盖窗口。
/ ]& V* U  q0 i" E/ s0 e在第六部分(#6)的开头添加以下代码(在确定小兔子位置之前):
7 I, C/ @" k& c6 p* [# j5 vfor x in range(width/grass.get_width()+1):
0 ~) U0 \- Z+ e for y in range(height/grass.get_height()+1):
) H  y! j5 r# O! c screen.blit(grass,(x*100,y*100))
1 T8 h5 W9 K8 I  Q2 i: F% Mscreen.blit(castle,(0,30))' F/ F4 i+ a6 n8 O$ k7 l
screen.blit(castle,(0,135))8 V9 Y; T1 f, c% W9 O, t
screen.blit(castle,(0,240))% R3 p( b' O" D, e$ D
screen.blit(castle,(0,345))6 [. D' k8 P$ k1 e6 p
让我们一起来看看上面的代码~for语句先使用x进行循环。在这一层循环中,代码又通过y进行内层循环,然后把草坪图片放在循环得到的x, y 坐标上。接下来的几行代码在屏幕上放置堡垒(castle)。
( T9 p; z- J+ c$ S# U' y: G如果你现在执行程序,你将看到下图的场景:
6 ~: A6 }$ Z6 Q* B& D. g. Q; y
是不是比刚才好多了?:)
' L) U$ v( ?* B2 {1 o  ]% o让小兔子动起来!
6 U$ k7 _! `- `$ @9 U$ f7 E& u% c' q" J8 p7 N) G- `) Q

  X( {) Z' F6 l3 x接下来我们要真正开始加入游戏元素啦!比如通过按键盘让小兔子动起来。
: |7 @; |& D) k9 i- |# ]首先,我们需要让程序追踪玩家什么时候按下了什么键。将下面两行代码添加到第二部分(#2)的末尾(在设定游戏窗口的高和宽之后):
- p% ?2 }' z2 }" T3 ?8 lkeys = [False, False, False, False]
4 D3 t7 C+ L. N- ^1 vplayerpos=[100,100]/ t$ Q6 O% {( Y% X+ h+ R( p
在这两行代码中,我们创建了一个名为keys的数组(array),其中有4个False值,每个值对应W、A、S、D中的一个按键。变量playerpos对应小兔子位置坐标。因为在游戏进行的过程中,小兔子会不断移动,所以用一个变量储存小兔子的位置更加方便。
' @, K$ q6 p4 P. W; M" s现在,我们要修改现有的代码,把小兔子图片放在playerpos对应的坐标上。把第六部分(#6)中的这行代码:
6 V! }( ^- @. B& i1 @+ T/ N+ X screen.blit(player, (100, 100))( R% F% L5 ?7 S( Z: M  V* V7 Y
改为:5 h0 @' R% J& H& t: w( \* D4 T
screen.blit(player, playerpos)* r9 f$ b/ ?' H+ Q- s* J, D
接下来,我们要使用PyGame自带的event.key函数来检测玩家按下了什么键,并相应地将keys内的False值改为True。
; R" X: G* O) q6 M! D在第八部分(#8)的最后,紧接着event.type == pygame.QUIT后,加上这些代码(缩进和pygame.QUIT的if代码块相同): 9 b6 E% P# d. P# _9 ]5 Y
if event.type == pygame.KEYDOWN:
. {  ^5 c) l$ e" D/ Y. [ if event.key==K_w:+ |- p* R, D. j
keys[0]=True
9 @6 |; G% A0 K8 F# ^8 i elif event.key==K_a:
0 u0 c  w' }3 Z, ~$ @7 o, C! C- w6 v keys[1]=True, Y3 S: Q6 U4 O% G
elif event.key==K_s:  U7 i* G  B& q9 B1 f6 F7 o, h6 W" [
keys[2]=True" r9 }9 W! g6 r
elif event.key==K_d:
& `4 j( @* Z5 t! t3 E keys[3]=True
8 j- f/ j2 j0 k* I3 P9 B4 o/ Iif event.type == pygame.KEYUP:, L/ `2 y, P. C& q' s3 s/ d, Y. M% M
if event.key==pygame.K_w:( f8 |5 W- K+ Q2 b. B/ X( I
keys[0]=False, V5 O2 [+ e6 t' P) }$ ?
elif event.key==pygame.K_a:; @  s, C  A; P4 r9 a) Z$ N& U+ C
keys[1]=False$ C; E3 a8 {; `% f
elif event.key==pygame.K_s:
* I, B) G/ v' _+ O! X3 J! W' p: c keys[2]=False
/ n- W3 u- N% _: r- @ elif event.key==pygame.K_d:
" \3 i$ f. Z. ^0 S keys[3]=False
/ S8 l' J, I+ M4 x; [" Y哇哦!这里有好多行代码呢!不过如果我们将这些代码拆分来看,其实并不是太难。& x! U' e1 v* O" F, D& ]
首先,我们要看看是否(if)有键被按下或者松开了,接着检测是哪个键被按下或者松开了。如果检测到的键是W、A、S、D中的某一个,就相应更新keys数列中的值。接着,你需要根据玩家按下的键更新playerpos变量,这个非常简单,只需要把下面代码加到目前所写的代码最后(使用一个缩进,和for循环同一层)
1 ~) \( l3 J( E. U! o# 9 – 移动小兔子
- h2 P( p$ u+ ^( `& J/ ] if keys[0]:1 S8 |8 W9 D& K& R
playerpos[1]-=5
  x. V' B# S0 L9 o0 S/ l8 A" ?5 U2 f elif keys[2]:
1 ~7 y- ?1 a8 ~$ _ playerpos[1]+=5& a! I$ f! m4 h5 R5 |
if keys[1]:
2 c+ I8 |/ ?5 H: `, w& R playerpos[0]-=5
" X- Q  B4 u7 g9 r; ]' o elif keys[3]:8 B- V7 g# n: x& t) w; R' h5 ]: n
playerpos[0]+=50 G2 S7 D# b, R$ j" A: i- R
这些代码检测哪个键被按下了,并对小兔子的x或y坐标做相应的增减。
% s) _* R- m: ~4 M7 T, q; F# p运行游戏,你会看到和刚才相似的场景。试着按按WASD,你的小兔子动起来了!% H- {; p& Z  _& B! a
7 u( Z5 g! ~. Y! ^; ~, m
(未完待续)

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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