KPL青少年电脑编程语言--一步一步学KPL【9】:如何对按键进行处理?如何处理字母精灵的爆炸效果?

[KPL学习指南]一步一步学KPL【9】:如何对按键进行处理?如何处理字母精灵的爆炸效果?
kpl 发布于 2007-8-19 16:20:00


 


为了完成最后的按键处理和爆炸处理过程,我们需要在游戏循环内增加一个新的方法:HandleKeys()

该方法的位置如下:

    
  While GameOver=False
   Trace("animate!")
   Animate()
   
   Trace("HandleKeys!")
   HandleKeys()   //新增该行
  End While
  
  Alert("Game Over!","hehe")

HandleKeys的定义如下:

 Method HandleKeys()
  Var key As String=GetKey()
  
  Trace("key:"+key)
  
  Var i As Int
  Var num As Int
  Var explodecount As Int
  
  For i=1 To MaxCharNum
   If key=EnglishCharArray[CurIndexArray[i]].name And EnglishCharArray[CurIndexArray[i]].living=False Then
 //   PlaySound( "Explosion1.wav" )
  
    LoadSprite( "ExplodePlayer", "Explosion.gif" )
    MoveSpriteToPoint( "ExplodePlayer", GetSpriteLeft( "char"+i ), GetSpriteTop( "char"+i ) )
    SetSpriteZIndex( "ExplodePlayer", 5000 )
    ShowSprite( "ExplodePlayer" )
  
    HideSprite( "char"+i )
    
    
    For num = 1 To GetSpriteFrameCount( "ExplodePlayer" )
     SetSpriteActiveFrame( "ExplodePlayer", num )
     RefreshScreen()
     Delay( 10 )
    Next
    
    UnloadSprite( "ExplodePlayer" )    
   
    
    EnglishCharArray[CurIndexArray[i]].living=True
    
    explodecount=explodecount+1
    
    If explodecount=MaxCharNum Then
     GameOver=True
    End If
   End If

  Next

 End Method

这段代码中,有些细节我们要好好交代一下,因为为了代码可以顺利执行,我们要对以前的代码做一些小的调整。

这段代码的思路如下:

【1】返回一个按键;

【2】判断该按键代表的字符精灵是否还在屏幕上,如果还在的话,则字母精灵爆炸消失;

要处理这个环节,我们需要把以前在Main方法内定义的两个变量放在该方法的外部,即放在数据类型定义的后面。这样原来的局部变量就变成了全局变量,可以在任意位置被访问了。

移动的变量是:

 //初始化字母数组
 Var EnglishCharArray As EnglishChar[MaxCharNum]
 //保存随机字母顺序的数组
 Var CurIndexArray As Int[MaxCharNum] 

为了标志已经爆炸使用过的字母精灵,我们为EnglishChar数据类型增加了一个新的属性:living,用于标识对应的字母精灵是否存活(爆炸后死掉,不再显示)

做出了上述调整后,以上的代码过程就不难理解了。

【3】屏幕上的字母爆炸完后,游戏结束。

字母爆炸的动画处理,可以参见KPL游戏示例编程中,飞机爆炸的代码,完全一样。


到此为止,打字练习的游戏代码示范结束。你可以根据这个思路,修改成可以打字升级的游戏,也可以改变字母精灵出现的方式。

或者自己重新做一个完全不一样的程序。


我们把最终的代码放在下面供大家参考:


Program Demo

 //自定义数据结构
 Structure EnglishChar
  index As Int  //序号
  name As String  //字母
  using As Bool  //是否已被使用
  living As Bool
 End Structure
 
 //屏幕上的点的数据结构
 Structure Point
  x As Decimal
  y As Decimal
 End Structure


  
 //最大字母数
 Var MaxCharNum As Int=26
 
 //初始化字母数组
 Var EnglishCharArray As EnglishChar[MaxCharNum]
 //保存随机字母顺序的数组
 Var CurIndexArray As Int[MaxCharNum] 
 
 Var oldPoint As Point[MaxCharNum]   //用于保存图片移动前的位置
 Var curPoint As Point[MaxCharNum] //用于保存图片的当前位置
 Var xPoint As Point[MaxCharNum]  //用于保存图片移动的偏移量
 
 Var GameOver As Bool=False
 
 
 
 Method Main()

  // 初始化26个英文字母
  //Var CharArray As String[]={"a","b","c"}
  Var EnglishCharStr As String="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
  Var CharArray As String[]=Split(EnglishCharStr,",")
  

  
  Var CharNum As Int
  
  For CharNum=1 To MaxCharNum
   EnglishCharArray[CharNum].index=CharNum
   EnglishCharArray[CharNum].name=CharArray[CharNum]
   EnglishCharArray[CharNum].using=False
   
   //调试语句
   Trace("indx:"+EnglishCharArray[CharNum].index)
   Trace("name:"+EnglishCharArray[CharNum].name)
   Trace("using:"+EnglishCharArray[CharNum].using) 
   Trace("---------------------------------------")
  Next
  
  
 
  
  
  Var CurNum As Int=1
  Var CurIndex As Int
  
  While CurNum<=MaxCharNum
   //随机抽取
   CurIndex=Random(1,MaxCharNum)
   
   //以下代码保证字母抽取不重复
   If EnglishCharArray[CurIndex].using=False Then
    EnglishCharArray[CurIndex].using=True
    CurIndexArray[CurNum]=CurIndex
    
    CurNum=CurNum+1
    
    Trace("CurIndexArray["+CurNum+"]:"+EnglishCharArray[CurIndex].name+"---CurIndex:"+CurIndex)
   End If
   
   
  End While
  
  //初始化精灵
  Var count As Int
  
  For count=1 To MaxCharNum
   LoadSprite("char"+count,"snurkel-a-z.gif")
   SetSpriteActiveFrame("char"+count,CurIndexArray[count])
   SetSpriteZIndex("char"+count,count)
   
   While curPoint[count].x=oldPoint[count].x And curPoint[count].y=oldPoint[count].y
    curPoint[count].x=Random(0,ScreenWidth() - 20)
    curPoint[count].y=Random(0,ScreenHeight() - 20)
   End While
   
   MoveSpriteToPoint("char"+count,curPoint[count].x,curPoint[count].y)
   ShowSprite("char"+count)
   
   oldPoint[count].x=curPoint[count].x
   oldPoint[count].y=curPoint[count].y
   
   xPoint[count].x=Random( -10, 10 )
   xPoint[count].y=Random( -10, 10 )


   Trace("x:"+xPoint[count].x+"  y:"+xPoint[count].y)
   
   Next
   
   
    
  While GameOver=False
   Trace("animate!")
   Animate()
   
   Trace("HandleKeys!")
   HandleKeys()
  End While
  
  Alert("Game Over!","hehe")
  
 End Method

 Method Animate()
  
  BeginFrame()
  
  Var i As Int
  
  For i=1 To MaxCharNum
   If curPoint[i].x<0 Or curPoint[i].x>(ScreenWidth()- GetSpriteWidth("char"+i)) Then
    xPoint[i].x=xPoint[i].x*-1
   End If
   
   If curPoint[i].y<0 Or curPoint[i].y>(ScreenHeight()- GetSpriteHeight("char"+i)) Then
    xPoint[i].y=xPoint[i].y*-1
   End If
   
   curPoint[i].x=curPoint[i].x+xPoint[i].x
   curPoint[i].y=curPoint[i].y+xPoint[i].y
   
   MoveSpriteToPoint("char"+i,curPoint[i].x,curPoint[i].y)
   Trace("x:"+xPoint[i].x+"  y:"+xPoint[i].y)
  Next
  
  RefreshScreen()
 End Method
 
 Method HandleKeys()
  Var key As String=GetKey()
  
  Trace("key:"+key)
  
  Var i As Int
  Var num As Int
  Var explodecount As Int
  
  For i=1 To MaxCharNum
   If key=EnglishCharArray[CurIndexArray[i]].name And EnglishCharArray[CurIndexArray[i]].living=False Then
 //   PlaySound( "Explosion1.wav" )
  
    LoadSprite( "ExplodePlayer", "Explosion.gif" )
    MoveSpriteToPoint( "ExplodePlayer", GetSpriteLeft( "char"+i ), GetSpriteTop( "char"+i ) )
    SetSpriteZIndex( "ExplodePlayer", 5000 )
    ShowSprite( "ExplodePlayer" )
  
    HideSprite( "char"+i )
    
    
    For num = 1 To GetSpriteFrameCount( "ExplodePlayer" )
     SetSpriteActiveFrame( "ExplodePlayer", num )
     RefreshScreen()
     Delay( 10 )
    Next
    
    UnloadSprite( "ExplodePlayer" )    
   
    
    EnglishCharArray[CurIndexArray[i]].living=True
    
    explodecount=explodecount+1
    
    If explodecount=MaxCharNum Then
     GameOver=True
    End If
   End If

  Next

 End Method
End Program

转发到新浪微博

 

网上书店:当当图书  卓越亚马逊  新华书店  中国图书网  蔚蓝书店

  |  KPL QQ 群:39562753 
 




KPL QQ 群:39562753 

  验证申请请输入:KPL

  公告

敏捷培训视频培训教程,版权所有,未经授权,禁止转载

     现在国内无法访问KPL官方网站,喷嚏网(www.dapenti.com)提供的KPL资料为国内首份公开的KPL汉化资料。

该资料转载并注明作者和译者出处。如:来源:喷嚏网-www.dapenti.com

欢迎从事中小学信息技术的教师转载和引用,论坛或媒体须经书面许可

欢迎媒体合作!


邮箱:dapenti2006@gmail.com


  我的分类(专题)
  最近日志
程序员怎样学数学:半路出家也能让编程
汉语编程-汉芯之后的中国软件界大骗局
一步一步学KPL【9】:如何对按键进
一步一步学KPL【8】:如何让字母精
一步一步学KPL【7】:如何在屏幕上
一步一步学KPL【6】:如何随机产生
一步一步学KPL【5】:如何随机产生
一步一步学KPL【4】:如何编写一个
KPL开发环境中的一个bug
一步一步学KPL【3】:如何调试KP
一步一步学KPL[2]:编码的习惯和
structure有什么用?
为什么编程要用英文?
如何用任意的图形来画线?
一步一步学KPL[1]:初学者入门
吴文虎:别让“程序设计”成第二门“英
如何使用系统函数?
版权和转载申明
孩子什么时候学编程比较合适?
《KPL游戏示例代码讲解》电子书在线

  最新评论

  留言板
 

  链接

  Blog AD
 



|站点首页 | 联系我们 | 博客登陆
蜀ICP备11003155号 公安部备案号:51019002000333

特别声明:本站不提供任何视听上传服务,所有视频内容均来自视频分享站点所提供的公开引用资源

Powered by oBlog 2.52 © Copyright 2004. All rights reserved.