sdlhm520 发表于 2004-6-21 21:27:35

飞行射击游戏制作实例,使用HSP

素材和脚本下载:http://bbs.emu-zone.org/newbbs/viewthread.php?tid=175079



这个实例的版本为1.0~~
最新版本为3.0~~因为1.0这个版本的程序比较容易理解~~
而3.0涉及到DirectX的!~~
所以大家先从简单开始!~~以后才放出3.0的汉化版本!~~
说明一下压缩包内的文件:

日文原版.as--------------日文原版的脚本
中文汉化.as--------------中文汉化后的脚本
飞行射击实例.exe------通过HSP编译后的游戏执行文件
dmg.wav, exp.wav, INT01.MID, kin.wav, shot.wav, sample.bmp------游戏中所使用的音乐图片素材!~~

以下是游戏的脚本:


; 射击游戏脚本
; by たかのん 汉化:sdlhm520
; HSP v2.61 制作引擎

;■ 初期设定
screen 0,640,480,1 ;设置游戏画面大小
title "射击游戏范例 by たかのん 汉化:sdlhm520 "
highscore=5000
*gamestart
cls 4
randomize
move=5 ;指定我方飞机移动速度
smax=50 ;星星的最大数
emax=50 ;敌机的最大数
tmax=200 ;敌机子弹的最大数
wmax=3 ;我方飞机子弹的最大数
imax=10 ;倍数显示的最大数
vmax=10 ;信息显示的最大数
bmax=10 ;爆炸最大数
level=1 ;等级水平(难易度)


;■ 排列定义
dim sx,smax ;星的X坐标
dim sy,smax ;星的Y坐标
dim sc,smax ;星的颜色
dim ss,smax ;星的移动速度

dim ex,emax ;敌机的X坐标
dim ey,emax ;敌机的Y坐标
dim ef,emax ;敌机的生死
dim en,emax ;敌机的种类
dim exv,emax ;敌机X方向移动量
dim eyv,emax ;敌机Y方向移动量
dim et,emax ;敌人出现的时间

dim tx,tmax ;敌机子弹的X坐标
dim ty,tmax ;敌机子弹的Y坐标
dim tf,tmax ;敌机子弹on/off
dim txv,tmax ;敌机子弹X方向移动量
dim tyv,tmax ;敌机子弹Y方向移动量

dim wx,wmax ;我方子弹的X轴坐标
dim wy,wmax ;我方子弹的Y轴坐标
dim wf,wmax ;我方子弹on/off
dim wyv,wmax ;我方子弹的Y轴移动量

dim ix,imax ;倍数X轴坐标
dim iy,imax ;倍数Y轴坐标
dim iff,imax ;倍数显示时间
dim iv,imax ;倍数字体大小

dim bx,bmax ;爆炸X轴坐标
dim by,bmax ;爆炸Y轴坐标
dim bf,bmax ;爆炸出现的时间


;■ 载入游戏图象的素材
buffer 2,640,480,1
pos 0,0
picload "sample.bmp",1


;■ 载入效果声音和背景音乐
sndload "Int01.mid",0,1
sndload "dmg.wav",1,0
sndload "exp.wav",2,0
sndload "shot.wav",3,0
sndload "kin.wav",4,0


;■ 星的准备
repeat smax
rnd sx.cnt,640
rnd sy.cnt,480
rnd sc.cnt,8
ss.cnt=sc.cnt+3
sc.cnt=sc.cnt*32+31
loop


;■ 平方根的准备
dim calc,900
repeat 900
temp=cnt : calc.cnt=temp*temp
loop


;■ 启动前的准备
mx=295 : my=400 ;指定我方飞机的初期坐标
mf=8 ;指定我方飞机能量大小
gameovertime=0
score=0
frame=0
highdst=0
snd 0
gsel 0,1
palcopy 2
gmode 2

;■ 主程序
*main
redraw 2
color bgcolor,0,0 : bgcolor=0 ;指定背景颜色
boxf 0,0,640,480
gosub *message ;游戏信息
gosub *xingxing ;星星的移动
gosub *wojimove ;我方移動
gosub *weapon ;我方子弾
if frame(25-level)=0 : gosub *enemyborn ;敌机出现
gosub *enemymove ;敌机移动
gosub *dijizidanmove ;敌机子弹移动
if pat&128>0 : gosub *pausegame ;暂停
getkey returntop,121 : if returntop=1 : end ;强制结束(F10)
if mf<1 : mxv=0 : myv=0 : gameovertime++ : gosub *bomb
if gameovertime>100 : goto *gameover
await 30
redraw 1
frame++
level=frame/500+1
if level>20 : level=20
goto *main


;■ 我方移动
*wojimove
if mf>0 : stick pat,79
shottime--
if mf>0 : if (pat&64>0)&(shottime<0) : shot=1
xv=(pat>>2&1)-(pat&1)
yv=(pat>>3&1)-(pat>>1&1)
if mf>0 : mx=xv*move+mx : my=yv*move+my
if mx<0 : mx=0
if mx>590 : mx=590
if my<0 : my=0
if my>430 : my=430
pos mx,my : gcopy 2,xv*50+50,0,50,50
return


;■ 星星的移动
*xingxing
repeat smax
color sc.cnt,sc.cnt,sc.cnt
sy.cnt=sy.cnt+ss.cnt
if sy.cnt>480 : sy.cnt=0 : rnd sx.cnt,640
pset sx.cnt,sy.cnt
loop
return


;■ 我方子弹发射
*weapon
repeat wmax
if (shot=1)&(wf.cnt<1) {
wf.cnt=1
wx.cnt=mx+12
wy.cnt=my-40
shot=0
shottime=1
snd 3
}
if wf.cnt<1 : continue
pos wx.cnt,wy.cnt : gcopy 2,150,0,25,50
wy.cnt=wy.cnt-40
if wy.cnt<-50 : wf.cnt=0
loop
return


;■ 敌机出现
*enemyborn
rnd temp,7
if temp=0 : return
repeat emax
if ef.cnt>0 : continue
if temp=1 : en.cnt=1
if temp=2 : en.cnt=1
if temp=3 : en.cnt=1
if temp=4 : en.cnt=2
if temp=5 : en.cnt=2
if temp=6 : en.cnt=3
ef.cnt=en.cnt ; 固さ
rnd ex.cnt,640 ; 初期出现位置X轴
ey.cnt=-50 ; 初期出现位置Y轴
exv.cnt=0 ; 初期移动量X轴
eyv.cnt=10 ; 初期移动量Y轴
et.cnt=0
break
loop
return


;■ 敌机移动
*enemymove
repeat emax
et.cnt++
if ef.cnt<1 : continue
ent=cnt
repeat wmax
if wf.cnt<1 : continue
ddx=(ex.ent+25)-(wx.cnt+12) : if ddx<0 : ddx=-ddx
ddy=(ey.ent+25)-(wy.cnt+25) : if ddy<0 : ddy=-ddy
if (ddx>=0)&(ddx<20)&(ddy>=0)&(ddy<40) {
ef.ent-- : wf.cnt=0
if ef.ent>0 {
pos wx.cnt,wy.cnt
gcopy 2,175,25,25,25
snd 4
score++
}
else {
pos ex.ent,ey.ent
gcopy 2,200,0,50,50
snd 2
gosub *messageborn
}
}
loop
if en.cnt=1 : gosub *enemy1
if en.cnt=2 : gosub *enemy2
if en.cnt=3 : gosub *enemy3
loop
return

;■ 敌机 1
*enemy1
pos ex.cnt,ey.cnt : gcopy 2,250,0,50,50
dx=mx-ex.cnt
dy=my-ey.cnt
if dy<350 {
if dx<0 {
exv.cnt=exv.cnt-1
if exv.cnt<-25 : exv.cnt=-25
}
else {
exv.cnt=exv.cnt+1
if exv.cnt>25 : exv.cnt=25
}
}
if dx<0 : dx=-dx
if dx<50 : gosub *tamaborn
eyv.cnt=4
ex.cnt=ex.cnt+exv.cnt
ey.cnt=ey.cnt+eyv.cnt
if ex.cnt<-50 : ef.cnt=0
if ex.cnt>640 : ef.cnt=0
if ey.cnt<-50 : ef.cnt=0
if ey.cnt>480 : ef.cnt=0
return


;■ 敌机 2
*enemy2
pos ex.cnt,ey.cnt : gcopy 2,300,0,50,50
dx=mx-ex.cnt
if et.cnt<2 {
if dx<0 {
exv.cnt=-6
}
else {
exv.cnt=6
}
}
if et.cnt>25 : eyv.cnt-- : if eyv.cnt<-10 : eyv.cnt=-10
if ey.cnt>200 : gosub *tamaborn
ex.cnt=ex.cnt+exv.cnt
ey.cnt=ey.cnt+eyv.cnt
if ex.cnt<-50 : ef.cnt=0
if ex.cnt>640 : ef.cnt=0
if ey.cnt<-50 : ef.cnt=0
if ey.cnt>480 : ef.cnt=0
return;


■ 敌机 3
*enemy3
pos ex.cnt,ey.cnt : gcopy 2,350,0,50,50
dx=mx-ex.cnt
if et.cnt<2 {
if dx<0 {
exv.cnt=-3
}
else {
exv.cnt=3
}
}
if ey.cnt>200 : eyv.cnt--
if et.cnt>20 : if ey.cnt<50 : eyv.cnt++
if ey.cnt>200 : gosub *tamaborn
if et.cnt>20 : if ey.cnt<50 : gosub *tamaborn
ex.cnt=ex.cnt+exv.cnt
ey.cnt=ey.cnt+eyv.cnt
if ex.cnt<-50 : ef.cnt=0
if ex.cnt>640 : ef.cnt=0
if ey.cnt<-50 : ef.cnt=0
if ey.cnt>480 : ef.cnt=0
return


;■ 敌机子弹发射
*tamaborn
if frame(8-(level/4))>0 : return
dx=mx-ex.cnt : px=dx : if dx<0 : dx=0-dx
dy=my-ey.cnt : py=dy : if dy<0 : dy=0-dy
dst=(dx*dx)+(dy*dy)
edx=ex.cnt+12 : edy=ey.cnt+12
repeat 900
if dst<calc.cnt : dst=cnt : break
loop
repeat tmax
if tf.cnt>0 : continue
tf.cnt=1
tx.cnt=edx : ty.cnt=edy
rnd ds,8 : ds=level/5+3+ds
txv.cnt=px*ds/dst
tyv.cnt=py*ds/dst
break
loop
return


;■ 敌机子弹移动 & 击中判断
*dijizidanmove
repeat tmax
if tf.cnt<1 : continue
tx.cnt=tx.cnt+txv.cnt
ty.cnt=ty.cnt+tyv.cnt
if tx.cnt>640 : tf.cnt=0 : continue
if tx.cnt<-25 : tf.cnt=0 : continue
if ty.cnt>480 : tf.cnt=0 : continue
if ty.cnt<-25 : tf.cnt=0 : continue
pos tx.cnt,ty.cnt : gcopy 2,175,0,25,25
dx=(mx+25)-(tx.cnt+12) : if dx<0 : dx=-dx
dy=(my+25)-(ty.cnt+12) : if dy<0 : dy=-dy
if (dx>=0)&(dx<10)&(dy>=0)&(dy<10) {
repeat tmax : tf.cnt-- : loop
pos tx.cnt,ty.cnt
gcopy 2,175,25,25,25
bgcolor=128
snd 1
mf--
}
if (dx>=10)&(dx<40)&(dy>=10)&(dy<40) : score++
loop
return


;■ 倍率显示
*messageborn
dmy=my-ey.ent : if dmy<0 : dmy=-dmy
dstv=480-dmy/50
if highdst<dstv : highdst=dstv
dstlevel=level
dstcore=dstv*dstlevel
score=en.ent*100*dstcore+score
repeat imax
if iff.cnt>0 : continue
ix.cnt=ex.ent
iy.cnt=ey.ent
iv.cnt=dstv
iff.cnt=20
il.cnt=dstlevel
realscore=en.ebt*100
break
loop
return

;■ 游戏信息
*message
repeat imax
if iff.cnt<1 : continue
rnd icr,8 : icr=icr*32+31
rnd icg,8 : icg=icg*32+31
rnd icb,8 : icb=icb*32+31
color icr,icg,icb
font "SimHei",iv.cnt*2+8,1
pos ix.cnt,iy.cnt
mes "× "+iv.cnt
iy.cnt++
iff.cnt--
loop

font "SimHei",15,1
if highscore<score : highscore=score
color 0,255,255
pos 10,10 : mes "最高分 "+highscore

color 255,255,255
pos 10,30 : mes "得分 "+score

color 0,255,0
pos 10,50
mes "HIGH DISTANCE "+highdst

color 255,255,0
pos 10,70
mes "等级 "+level

color 255,255,255
pos 10,450
mes "能量 "
if mf<1 : return
repeat mf
color 255,cnt*32,0
pos cnt*10+60,450
mes "■ "
loop
return


;■ 我机爆炸
*bomb
repeat bmax
bf.cnt--
if bf.cnt<1 {
rnd bf.cnt,10 : bf.cnt=bf.cnt+10
rnd bx.cnt,50 : bx.cnt=25-bx.cnt+mx
rnd by.cnt,50 : by.cnt=25-by.cnt+my
}
pos bx.cnt,by.cnt
gcopy 2,200,0,50,50
rnd dbx,10 : dbx=dbx-5
bx.cnt=bx.cnt+dbx
by.cnt=by.cnt+10
loop
rnd effect,10
if effect=0 : snd 1 : bgcolor=128
if effect=1 : snd 2 : bgcolor=255
return


;■ 暂停处理
*pausegame
redraw 2
font "SimHei",40,1
rnd icr,8 : icr=icr*32+31
rnd icg,8 : icg=icg*32+31
rnd icb,8 : icb=icb*32+31
color icr,icg,icb
pos 270,200 : mes "暂停 "
stick pat : if pat&128>0 : return
getkey returntop,121 : if returntop=1 : end ; 强制结束(F10)
await 30
redraw 1
goto *pausegame


;■ 游戏结束
*gameover
redraw 2
font "SimHei ",40,1
rnd icr,8 : icr=icr*32+31
rnd icg,8 : icg=icg*32+31
rnd icb,8 : icb=icb*32+31
color icr,icg,icb
pos 230,200 : mes "游戏结束 "
pos 140,250 : mes "按 Enter 重新开始 "
stick pat : if pat&32>0 : sndoff : wait 10 : goto *gamestart
getkey returntop,121 : if returntop=1 : end ; 强制结束(F10)
await 30
redraw 1
goto *gameover

jelamb 发表于 2004-6-25 12:47:14

好厉害
看不懂

月了心蓝 发表于 2006-1-23 16:00:38

同楼上~~~~~~~~~~~~~

化冻 发表于 2006-1-24 17:41:24

我说,不要老是掘古墓嘛

yoxola 发表于 2006-1-25 18:47:47

其實...HSP提供了比RMXP更多的彈性和更好的支持,
只是沒有一個整合編輯器而已,但是BASIC語言的難度不會比RGSS高

fgo 发表于 2006-2-25 02:31:20

等待3.0......

yoxola 发表于 2006-2-27 22:18:18

http://www.onionsoft.net/hsp/

目前3.1beta

Advance 发表于 2006-3-2 01:56:18

看到这帖就想起以前无聊弄的一个仅花了一小时的东西,顺便也贴一下吧,虽然现在看来写得实在是烂


;HSP 2.61 script,STG sample by Advance(LOVEHINA-AVC)


;使用比GetTickCount更为精确的取时函数

;后记:反汇编了一下,其实这东西用的就是GetTickCount,我寒

#uselib    "dsoundex.hpi"
#func    ds_timer    timer    $0

;为子弹的状态判断定义常量

#define SC_EMPTY    0
#define SC_USED      1
#define SC_HITED    2
#define SC_MOVING    4
#define SC_STOP      8
#define SC_DISAPPEARING    16
#define SC_CREATING    32


;初始化窗体,开启随机取SEED
*InitWindow

    x = dispx - 320 >> 1
    y = dispy - 240 >> 1
    screen 0,320,240,6,x,y

    FPS_DrawSync = 0

    title "刷新间隔:0毫秒|FPS:0"
    color 0,0,0
    boxf
    randomize

;建立图片数据
*BulidData

    buffer 2,13,13
    color 255,255,255
    boxf
    color 255,0,0
    boxf 6,6,7,7

    buffer 3,8,8
    color 230,0,0
    boxf
    color 255,255,255
    boxf 2,2,5,5

    buffer 4,15,15
    color 0,0,230
    boxf
    color 255,255,255
    boxf 3,3,11,11

    buffer 5,30,30
    color 230,230,0
    boxf
    color 255,255,255
    boxf 8,8,22,22

;判定区域&描绘区域
    SO_HitBox_Leftup = 6
    SO_HitBox_RightDown = 7
    ES_HitBox_LeftUp = 2,3,8
    ES_HitBox_RightDown = 5,11,22
    ES_DrawRect_Width = 8,15,30
    ES_DrawRect_Height = 8,15,30
    ExtraBorder = 64
   
;初始化环境参数

    ES_Max = 50

    dim ES_Pos_X,512
    dim ES_Pos_Y,512
    dim ES_Status,512
    dim ES_Type,512
    dim ES_Aim_X,512
    dim ES_Aim_Y,512
    dim ES_Move_X,512
    dim ES_Move_Y,512

    SO_Pos_X = 320 - 13 >> 1
    SO_Pos_Y = 240 - 13 >> 1
    ISHited = 0

;是否锁帧

    FPS_IsLockIn60 = 1

;准备好平方根数据以节省CPU开支

    dim SquareRoot,320 + 240 + (ExtraBorder << 2)

    repeat 320 + 240 + (ExtraBorder << 2)
      SquareRoot.cnt = cnt * cnt
    loop

;以下描绘部分为GDI+

*Start

    gsel 0,1
    gmode 1,13,13
    pos SO_Pos_X,SO_Pos_Y
    gcopy 2

    ds_timer
    if stat < 0 {
      FPS_Timer_Now = stat + 2147483647
    } else {
      FPS_Timer_Now = stat
    }

    Start_Time = FPS_Timer_Now
    LeveUp_Timer = FPS_Timer_Now
    FPS_Original_Timer = FPS_Timer_Now

*GameLoop

    if FPS_ISLockIn60 {
      ds_timer
      if stat < 0 {
            FPS_Timer_Now = stat + 2147483647
      } else {
            FPS_Timer_Now = stat
      }

      FPS_Template_Timer = FPS_Timer_Now
    }

;停止刷新窗体客户区,开始内存搬运

    gsel 0
    redraw 0

*CreateNewBullet

    repeat ES_Max
      if ES_Status.cnt = SC_EMPTY {
            Now = cnt
            ES_Status.Now = SC_USED | SC_MOVING

;挑一个大小随机的子弹
            rnd ES_Type.Now,3

;分配初始位置(在可视范围之外的四周,同特训救救)
            rnd nTemp,2
            if nTemp {
                rnd nTemp,ExtraBorder << 1
                if nTemp < ExtraBorder {
                  ES_Pos_X.Now = -nTemp >> 1
                } else {
                  ES_Pos_X.Now = 320 + (nTemp >> 1)
                }

                rnd ES_Pos_Y.Now,240
            } else {
                rnd nTemp,ExtraBorder << 1
                if nTemp < ExtraBorder {
                  ES_Pos_Y.Now = -nTemp >> 1
                } else {
                  ES_Pos_Y.Now = 240 + (nTemp >> 1)
                }

                rnd ES_Pos_X.Now,320
            }

            ES_Aim_X.Now = SO_Pos_X
            ES_Aim_Y.Now = SO_Pos_Y

            rnd nTemp,3
            ES_Speed = nTemp + 1

;确定移动方向和移动量(如需精确瞄准某处,移动量需以浮点表示或反复计算)

            Dest_Pos_X = ES_Aim_X.Now - ES_Pos_X.Now
            Dest_Pos_Y = ES_Aim_Y.Now - ES_Pos_Y.Now

            nTemp = Dest_Pos_X * Dest_Pos_X + (Dest_Pos_Y * Dest_Pos_Y)

            repeat 320 + 240 + (ExtraBorder << 2)
                if nTemp < SquareRoot.cnt {
                  Dest_Movement = cnt
                  break
                }
            loop

            ES_Move_X.Now = (Dest_Pos_X * ES_Speed / Dest_Movement)
            ES_Move_Y.Now = (Dest_Pos_Y * ES_Speed / Dest_Movement)

;丢弃无效的子弹
            if (ES_Move_X.Now = 0) | (ES_Move_Y.Now = 0) : ES_Status.Now = SC_EMPTY
      }
    loop

*KeyCheck

;自机移动检测
      getkey Key_ShiftFlag,16
      getkey Key_Status_Left,37
      getkey Key_Status_Up,38
      getkey Key_Status_Right,39
      getkey Key_Status_Down,40
      getkey Key_Status_Esc,27

      if Key_Status_Esc : end

;慢移2星快移6星,沙沙的标准速度XD
      if Key_Status_Left {
            if Key_ShiftFlag : SO_Pos_X -= 2 : else : SO_Pos_X -= 6
      }
      if Key_Status_Up {
            if Key_ShiftFlag : SO_Pos_Y -= 2 : else : SO_Pos_Y -= 6
      }
      if Key_Status_Right {
            if Key_ShiftFlag : SO_Pos_X += 2 : else : SO_Pos_X += 6
      }
      if Key_Status_Down {
            if Key_ShiftFlag : SO_Pos_Y += 2 : else : SO_Pos_Y += 6
      }

;斜角移动速度修正(这里不使用浮点)
      if Key_Status_Left & Key_Status_Up {
            if Key_ShiftFlag {
                SO_Pos_X += 1
                So_Pos_Y += 1
            } else {
                SO_Pos_X += 2
                So_Pos_Y += 2
            }
      }
      if Key_Status_Right & Key_Status_Up {
            if Key_ShiftFlag {
                SO_Pos_X -= 1
                So_Pos_Y += 1
            } else {
                SO_Pos_X -= 2
                So_Pos_Y += 2
            }
      }
      if Key_Status_Left & Key_Status_Down {
            if Key_ShiftFlag {
                SO_Pos_X += 1
                So_Pos_Y -= 1
            } else {
                SO_Pos_X += 2
                So_Pos_Y -= 2
            }
      }
      if Key_Status_Right & Key_Status_Down {
            if Key_ShiftFlag {
                SO_Pos_X -= 1
                So_Pos_Y -= 1
            } else {
                SO_Pos_X -= 2
                So_Pos_Y -= 2
            }
      }

;边缘保证

      if SO_Pos_X < 0 : SO_Pos_X = 0
      if SO_Pos_Y < 0 : SO_Pos_Y = 0
      if SO_Pos_X > (320 - 13) : SO_Pos_X = 320 - 13
      if SO_Pos_Y > (240 - 13) : SO_Pos_Y = 240 - 13

*DrawBullet

;先刷干净,星星之类的东西我就不涂了
    color 0,0,0
    boxf

    repeat ES_Max
      if ES_Status.cnt & SC_USED = 1 {
            Now = cnt

            ES_Pos_X.Now += ES_Move_X.Now
            ES_Pos_Y.Now += ES_Move_Y.Now

            nTemp = ES_Type.cnt
            gmode 1,ES_DrawRect_Width.nTemp,ES_DrawRect_Height.nTemp
            pos ES_Pos_X.Now,ES_Pos_Y.Now
            gcopy nTemp + 3

;出界了就TF,空出被占用的位置
            if (ES_Pos_X.Now < (-ExtraBorder)) | (ES_Pos_Y.Now < (-ExtraBorder)) | (ES_Pos_X.Now > (320 + ExtraBorder)) | (ES_Pos_Y.Now > (240 + ExtraBorder)) {
                ES_Status.Now = SC_EMPTY
            }

;中弹判定
            nTemp = ES_Type.Now
            if ES_Pos_X.Now + ES_HitBox_RightDown.nTemp >= (SO_Pos_X + SO_HitBox_LeftUp) {
                if ES_Pos_X.Now + ES_HitBox_LeftUp.nTemp <= (SO_Pos_X + SO_HitBox_RightDown) {
                  if ES_Pos_Y.Now + ES_HitBox_RightDown.nTemp >= (SO_Pos_Y + SO_HitBox_LeftUp) {
                        if ES_Pos_Y.Now + ES_HitBox_LeftUp.nTemp <= (SO_Pos_Y + SO_HitBox_RightDown) {
                            ISHited = 1
                        }
                  }
                }
            }
                        
      }
    loop

    if ISHited : goto GameOver

*DrawSelf

    gmode 1,13,13
    pos SO_Pos_X,SO_Pos_Y
    gcopy 2

    redraw 1


    FPS_Now ++

;延迟锁帧
    ds_timer
    if stat < 0 {
      FPS_Timer_Now = stat + 2147483647
    } else {
      FPS_Timer_Now = stat
    }

    if FPS_IsLockIn60 {
      FPS_DrawSync = 16 - (FPS_Timer_Now - FPS_Template_Timer)
      if FPS_DrawSync < 0 : FPS_DrawSync = 0
      FPS_Template_Timer = FPS_Timer_Now

      repeat
            ds_timer
            if stat < 0 {
                FPS_Timer_Now = stat + 2147483647
            } else {
                FPS_Timer_Now = stat
            }
            if FPS_Timer_Now - FPS_Template_Timer >= FPS_DrawSync : break

            await 0,1
      loop
    } else {
      await 0,1
    }

*CalculateFPS

;计算FPS
    if FPS_Timer_Now - FPS_Original_Timer >= 1000 {
;每隔一秒刷新一次FPS记录并增加最大弹数
      if ES_Max < 512 : ES_Max ++

      FPS_Original_Timer = FPS_Timer_Now
      title "刷新间隔:" + FPS_DrawSync + "毫秒|FPS:" + FPS_Now
      FPS_Now = 0
    }

    goto GameLoop

*GameOver

    ds_timer
    if stat < 0 {
      FPS_Timer_Now = stat + 2147483647
    } else {
      FPS_Timer_Now = stat
    }

    nTemp = FPS_Timer_Now - Start_Time / 1000
    nTemp2 = FPS_Timer_Now - Start_Time \\ 1000

    buffer 2,320,240
    color 0,0,0
    boxf

    gsel 0
    gmode 3,320,240,128
    pos 0,0
    gcopy 2
    color 255,255,255
    font "",32
    pos 40,70
    mes "你坚持了" + nTemp + "." + nTemp2 + "秒 "
    pos 10,110
    mes "按ENTER键再试一遍 "
    redraw 1

    repeat
      stick nTemp
      if nTemp = 32 : break
      await 10
    loop

    goto BulidData

yoxola 发表于 2006-3-30 01:29:05

從樓主的發帖時間起算...快兩年了,HSP的漢化到底..

http://www.ppxbbs.com/archiver/?tid-168961.html
而這是結果....

雖然不用HSP了偶爾還會關注一下...
页: [1]
查看完整版本: 飞行射击游戏制作实例,使用HSP