📄 mmain.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 + -