⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fire.bas

📁 VmBasic是一款基于虚拟机的结构化的编程语言
💻 BAS
字号:
' 飞行射击游戏
' 数据结构说明:利用P(200,6)为存储对象空间
'
Dim Shared P(200,6)            ' 对象空间
Dim Shared FlyX,FlyY           ' 飞机坐标
Dim Shared PicFly,PicEnemy,PicFire   ' 图片信息
Dim Shared Layer                     ' 二级缓存
Dim Shared FireCount                 ' 子弹个数

Sub InitBmp()
    Print "创建一个400x300的画布做双缓存并且读入图片....";
    Layer    = NewCanvas(400,300)
    PicFly   = LoadCanvas("GAME1.TGA")
    PicEnemy = LoadCanvas("GAME2.TGA")
    PicFire  = LoadCanvas("GAME3.TGA")
    If (Layer<0)Or(PicFly<0)Or(PicEnemy<0)Or(PicFire<0) Then
        Print "读入图片错误"
        VASM("EXIT")
    End If
    Print "成功"
    Print "初始化完成,这个游戏用方向键控制飞机空格键发射子弹"
    Print
    Print "回车键开始游戏....";
    While Not KeyPress(KEY_ENTER) : WEnd
End Sub

'=================== Game Engine =======================
Declare Sub ClearData()
Declare Function Alloc()
Declare Sub DrawFly(X,Y,F)
Declare Sub Plane()

Dim Shared Star(100,4)

Sub ClearData()     ' 清除P对象数组
    I=0
    While I < 200
          P(I,0)=-1
          I=I+1
    WEnd
    I=0
    While I < 80
          If I<50 Then
             Star(I,0)=2
             Star(I,1)=Random(400)
             Star(I,2)=Random(300)
          Else
             Star(I,0)=3
             Star(I,1)=Random(400)
             Star(I,2)=Random(300)
          End If
          I=I+1
    WEnd
    FlyX=200
    FlyY=180
End Sub

Function Alloc()     ' 在P(0..199)中寻找一个没有用过的地址
    I=0
    While (I<31)And(P(I,0)>=0) : I=I+1 : WEnd
    Alloc=I
End Function

Sub DrawFly(X,Y,F)
    If F<2 Then      ' 画主人翁和敌机
       PIC=PicFly
       If F=1 Then PIC=PicEnemy
       BlitCanvas(Layer,PIC,X-16,Y-16,32,32,0,0,&HF81F) ' F81Fh是紫色透明色
    Else             ' 画子弹
       BlitCanvas(Layer,PicFire,X-7-4,Y,8,8,0,0,&HF81F)
       BlitCanvas(Layer,PicFire,X+7-4,Y,8,8,0,0,&HF81F)
    End If
End Sub

Sub Plane()
    Dim Shared SpaceStatus ' 空格键状态
    If KeyPress(KEY_UP)   Then FlyY=FlyY-6 : If FlyY<-10 Then FlyY=-10
    If KeyPress(KEY_DOWN) Then FlyY=FlyY+4 : If FlyY>300 Then FlyY=300
    If KeyPress(KEY_LEFT) Then FlyX=FlyX-5 : If FlyX<-10 Then FlyX=-10
    If KeyPress(KEY_RIGHT)Then FlyX=FlyX+5 : If FlyX>410 Then FlyX=410
    DrawFly(FlyX,FlyY,0)
    If KeyPress(KEY_SPACE)=0 Then SpaceStatus=0
    If (SpaceStatus=0)And(KeyPress(KEY_SPACE)) Then
        SpaceStatus=1
        If FireCount<2 Then
           FireCount=FireCount+1
           H=Alloc()
           P(H,0)=0
           P(H,1)=FlyX
           P(H,2)=FlyY-8
        End if
    End If
End Sub

Function CheckHit(X,Y,DX,DY,DIS)
    CheckHit=0
    If (Abs(X-DX)<DIS)And(Abs(Y-DY)<DIS) Then CheckHit=1
End Function
'=================== Main  Engine =======================
Declare Sub GameDriver()  ' 主要引擎通过扫描P数组驱动游戏
Declare Sub GameMain()    ' 游戏的主循环
Declare Sub GameObject()  ' 游戏物体控制

Sub GameMain()
    Dim Shared PLAY
    PLAY=1
    TIME=0
    DELAY=1000/30
    ClearData()
    While PLAY > 0
          While (FTIMER()-TIME<DELAY) : WEnd
          TIME=FTIMER()        ' 处理时间停顿
          If KeyPress(KEY_ESCAPE) Then PLAY=0
          GameObject()        ' 处理星空和敌人
          Plane()              ' 处理玩家飞机          
          GameDriver()             ' 主要驱动程序
          ShowCanvas(Layer)    ' 显示缓存/清屏
          FillCanvas(Layer,0,0,400,300,0)
    WEnd
End Sub

Sub GameDriver()
    Dim Shared PLAY
    I=0
    While I<31
          If P(I,0)>=0 Then
             X=P(I,1) : Y=P(I,2)
             If P(I,0)=0 Then  ' 处理子弹
                DrawFly(X,Y,2)
                J=0
                While J<31
                      If P(J,0)=1 Then
                         If CheckHit(X,Y,P(J,1),P(J,2),24) Then
                            FireCount=FireCount-1
                            P(J,0)=2
                            P(J,3)=0
                            P(I,0)=-1
                            J=200
                         End If
                      End If
                      J=J+1
                WEnd
                Y=Y-10
                If (Y<-10) Then 
                    P(I,0)=-1
                    FireCount=FireCount-1
                End If
             End If
             If P(I,0)=1 Then  ' 处理敌人
                DrawFly(X,Y,1)
                If CheckHit(X,Y,FlyX,FlyY,28) Then PLAY=-1
                Y=Y+4
                If Not Random(2) Then Y=Y+3
                If Not Random(1) Then 
                   If X<FlyX Then X=X+3
                   If X>FlyX Then X=X-3
                End If
                If Y>300 Then P(I,0)=-1
             End If
             If P(I,0)=2 Then  ' 处理闪烁敌人
                J=P(I,3)
                If (J Mod 2)=0 Then DrawFly(X,Y,1)
                J=J+1
                If (J>20) Then P(I,0)=-1
                P(I,3)=J
             End If
             P(I,1)=X : P(I,2)=Y             
          End If
          I=I+1
    WEnd
End Sub

Sub GameObject()
    I=0
    While I < 80
          Y=Star(I,2)
          If I<50 Then
             Pixel(Layer,Star(I,1),Y,&H666666)
             Y=Y+2
          Else
             Pixel(Layer,Star(I,1),Y,&HAAAAAA)
             Y=Y+3
          End If
          If Y>410 Then Star(I,1)=Random(400):Y=-300+Random(300)
          Star(I,2)=Y
          I = I + 1
    WEnd 
    If Not Random(20) Then
       H=Alloc()
       P(H,0)=1
       P(H,1)=Random(400)
       P(H,2)=-30
    End If
End Sub
'=================== Main Program =======================
InitBmp()

GameMain()
CloseGraph()
Print
If Play<0 Then Print "哈哈你的飞机被击毁了 ";
Print "感谢试玩 :-)"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -