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

📄 mmain.module

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 MODULE
字号:
''   Copyright (C) 2004, Michael Isaac.  All rights reserved.'PUBLIC Obj              AS Object[]PUBLIC Bullet           AS Object[]PUBLIC Canvas           AS DrawingAreaPUBLIC BULLET_SIZE      AS FloatPUBLIC BULLET_SPEED     AS FloatPUBLIC KEY_LEFT         AS BooleanPUBLIC KEY_RIGHT        AS BooleanPUBLIC KEY_UP           AS BooleanPUBLIC KEY_DOWN         AS BooleanPUBLIC KEY_FIRE         AS BooleanPUBLIC KEY_FIRESTATE    AS BooleanPUBLIC SCREEN_WIDTH     AS IntegerPUBLIC SCREEN_HEIGHT    AS IntegerPUBLIC BOT_SPACE        AS Integer  'Which Obj[] is the botPUBLIC FPS_TIME         AS IntegerPUBLIC FPS_COUNTER      AS IntegerPUBLIC FPS_COUNT        AS IntegerPUBLIC SUB Main()    MMath.InitializeSineTable()    Obj = NEW Object[]    Bullet = NEW Object[]    FPS_TIME = Second(Now())    BULLET_SIZE = 7    BULLET_SPEED = 15    SCREEN_WIDTH = FMain.ClientW    SCREEN_HEIGHT = FMain.ClientH    LoadObjectList()    FMain.Show()ENDPUBLIC SUB Exit()    Obj = NULL    Bullet = NULL    Canvas = NULLENDSUB LoadObjectList()    DIM I AS Integer    DIM sData AS String    DIM J AS Integer    DIM tmpO AS CObject    'DIM F AS File    DIM V AS NEW String[]    DIM aLine AS NEW String[]    sData = File.Load(Application.Path &/ "object.data/main.lst")    'OPEN Application.Path &/ "object.data/main.lst" FOR READ AS #F    'READ #F, sData, Lof(F)    'Split this into an array and remove the CR character    aLine = Split(Replace(sData, Chr$(13), NULL), "\n")    FOR I = 0 TO aLine.Count - 1        IF (NOT (Left$(aLine[I], 1) = "'")) AND (NOT (aLine[I] = "")) THEN            V = Split(aLine[I], ",")            IF V.Count = 4 THEN                'FOR j = 1 TO If(v[1] = "Object1", 25, 1)                tmpO = NEW CObject                tmpO.Load2DObject(V[0], V[1], CInt(V[2]), CInt(V[3]))                Obj.Add(tmpO)                'NEXT            END IF        END IF    NEXT    'CLOSE #FENDSUB ApplyPhysics()    DIM I AS Integer    DIM U AS Integer    DIM Ob AS Object    IF Obj = NULL THEN RETURN    FOR EACH Ob IN Obj        WITH Ob            .Direction = .Direction + Rad(.Torque)            IF .TurnLeft = TRUE THEN .Direction = .Direction + Rad(.Agility)            IF .TurnRight = TRUE THEN .Direction = .Direction - Rad(.Agility)            IF .Direction > Rad(360) THEN .Direction = Rad(0)            IF .Direction < Rad(0) THEN .Direction = Rad(360)            IF .Thrust = TRUE THEN                .MX = .MX + ((MMath.SinE(.Direction)) * .Acceleration)                .MY = .MY + ((MMath.CosE(.Direction)) * .Acceleration)            END IF            IF (.MX <> 0) OR (.MY <> 0) THEN                .X = .X + (.MX / 20)                .Y = .Y + (.MY / 20)            END IF            IF .Attack THEN                AddBullet(CInt(.X), CInt(.Y), .Direction, .ID, 10)            END IF        END WITH    NEXTENDFUNCTION IsObjectCollision(O1 AS CObject, O2 AS CObject) AS Boolean    IF GetDistance(O1.X, O1.Y, O2.X, O2.Y) <= O2.Size THEN        RETURN TRUE    END IFEND FUNCTIONFUNCTION IsBulletCollision(O AS CObject, B AS CBullet) AS Boolean    IF GetDistance(O.X, O.Y, B.X, B.Y) <= O.Size THEN        RETURN TRUE    END IFEND FUNCTIONSUB CollisionHandler()    DIM I AS Integer    DIM J AS Integer    IF Obj = NULL THEN RETURN    IF Bullet = NULL THEN RETURN    FOR I = 0 TO Obj.Count - 1        FOR J = 0 TO Bullet.Count - 1            IF J > Bullet.Count - 1 THEN BREAK            IF I > Obj.Count - 1 THEN BREAK            IF NOT (Bullet[J].Owner = Obj[I].ID) THEN                IF IsBulletCollision(Obj[I], Bullet[J]) THEN                    Obj[I].Hull = Obj[I].Hull - Bullet[J].Damage                    Bullet.Remove(J)                    IF Obj[I].Hull <= 0 THEN                        IF I = 0 THEN                            'Message("Player was just killed.")                        ELSE                            Obj.Remove(I)                        END IF                    END IF                END IF            END IF        NEXT    NEXT'     FOR J = 0 TO (Obj.Count - 1)'         FOR I = 0 TO (Obj.Count - 1)'             IF I <> J THEN'                 IF IsObjectCollision(Obj[J], Obj[I]) THEN'                     'This is where Objects collide, and we need'                     'calculate forces here.'                 END IF'             END IF'         NEXT'     NEXTENDPUBLIC SUB AddBullet(CX AS Integer, CY AS Integer, D AS Float, OwnMe AS String, Dmg AS Integer)    DIM B AS NEW CBullet    WITH B        .X = CX        .Y = CY        .Direction = D        .Owner = OwnMe        .Damage = Dmg    END WITH    Bullet.Add(B)ENDSUB MoveBullets()    DIM I AS Integer    IF Bullet = NULL THEN RETURN    FOR I = 0 TO Bullet.Count - 1        IF I > Bullet.Count - 1 THEN BREAK        WITH Bullet[I]            .X = .X + ((MMath.SinE(.Direction)) * BULLET_SPEED)            .Y = .Y + ((MMath.CosE(.Direction)) * BULLET_SPEED)        END WITH        IF ((Bullet[I].X > SCREEN_WIDTH) OR (Bullet[I].X < 0)) OR ((Bullet[I].Y > SCREEN_HEIGHT) OR (Bullet[I].Y < 0)) THEN            Bullet.Remove(I)        END IF    NEXTENDSUB RenderBullets()    DIM B AS Object    Draw.ForeColor = Color.Cyan    Draw.FillColor = Color.Blue    Draw.FillStyle = 1    Randomize    FOR EACH B IN Bullet        Draw.Ellipse(B.X, B.Y, BULLET_SIZE, BULLET_SIZE)    NEXTENDPUBLIC SUB RenderObjects()    DIM I AS Integer    DIM Ob AS Object    DIM Size AS Integer    DIM Tag AS String    FOR EACH Ob IN Obj        WITH Ob            Size = .Degree.Count - 1            .Points.Clear()            FOR I = 0 TO Size                .Points.Add( CInt(.X + ((MMath.SinE(.Direction + Rad(.Degree[I]))) * .Distance[I])) )                .Points.Add( CInt(.Y + ((MMath.CosE(.Direction + Rad(.Degree[I]))) * .Distance[I])) )            NEXT            Draw.ForeColor = Color.Red            Draw.Polygon(.Points)            Draw.ForeColor = Color.Green            Tag = .ID & " " & .Hull & "%"            Draw.Text(Tag, .X - (Draw.TextWidth(Tag) / 2), .Y - (35))        END WITH    NEXTENDSUB CheckObjectWarp()    DIM Ob AS Object    FOR EACH Ob IN Obj        WITH Ob            IF .Y > SCREEN_HEIGHT THEN .Y = 0            IF .Y < 0 THEN .Y = SCREEN_HEIGHT            IF .X > SCREEN_WIDTH THEN .X = 0            IF .X < 0 THEN .X = SCREEN_WIDTH        END WITH    NEXTENDSUB MainLoop()    ApplyPhysics()    CollisionHandler()    MoveBullets()    IF Canvas = NULL THEN RETURN    CheckObjectWarp()    Canvas.Clear()    Draw.Begin(Canvas)    Draw.ForeColor = Color.Magenta    Draw.Text("Object Count: " & Obj.Count, 1, Draw.TextHeight("A") * 0)    Draw.Text("Bullet Count: " & Bullet.Count, 1, Draw.TextHeight("A") * 1)    Draw.Text("FPS         : " & FPS_COUNT, 1, Draw.TextHeight("A") * 2)    IF (Second(Now()) - FPS_TIME) = 1 THEN        FPS_TIME = Second(Now())        FPS_COUNT = FPS_COUNTER        FPS_COUNTER = 0    END IF    FPS_COUNTER = FPS_COUNTER + 1    RenderObjects()    RenderBullets()    Draw.End()ENDFUNCTION GetDistance(X1 AS Float, Y1 AS Float, X2 AS Float, Y2 AS Float) AS Float    DIM A AS Integer    DIM B AS Integer    A = (X1 - X2)    B = (Y1 - Y2)    'I'm not sure about gambas, but in VB the ^ operator    'makes calculations we dont really need.  This might speed up    'the process.  And we need as much speed as we can get.    RETURN Sqr((A * A) + (B * B))END

⌨️ 快捷键说明

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