123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- MODULE Bimso; (** AUTHOR "TF"; PURPOSE "Template/Example for component windows"; *)
- (** This program shows the implementation of a multi instance component containing window *)
- IMPORT
- Strings, WMGraphics, WMMessages, WMComponents, WMStandardComponents,
- Modules, KernelLog, WMRectangles, WMGraphicUtilities, Random, Kernel, WMDialogs,
- WM := WMWindowManager;
- CONST
- MaxLevel = 1000;
- TYPE
- KillerMsg = OBJECT
- END KillerMsg;
- Window* = OBJECT (WMComponents.FormWindow)
- VAR b : ARRAY 4 OF WMStandardComponents.Button;
- startButton : WMStandardComponents.Button;
- start, alive : BOOLEAN;
- c, cflash : ARRAY 4 OF WMGraphics.Color;
- random : Random.Generator;
- game : ARRAY MaxLevel OF SHORTINT;
- level : LONGINT;
- step : LONGINT;
- error : BOOLEAN;
- timer : Kernel.Timer;
- s, levelStr : ARRAY 32 OF CHAR;
- PROCEDURE CreateForm() : WMComponents.VisualComponent;
- VAR
- panel : WMStandardComponents.Panel;
- i : LONGINT;
- BEGIN
- NEW(panel); panel.bounds.SetExtents(200, 200);
- panel.fillColor.Set(LONGINT(0DDFFDDFFH)); panel.takesFocus.Set(TRUE);
- NEW(b[0]); b[0].alignment.Set(WMComponents.AlignTop); b[0].bounds.SetHeight(50);
- b[0].bearing.Set(WMRectangles.MakeRect(50,0,50,0));
- panel.AddContent(b[0]);
- NEW(b[1]); b[1].alignment.Set(WMComponents.AlignBottom); b[1].bounds.SetHeight(50);
- b[1].bearing.Set(WMRectangles.MakeRect(50,0,50,0));
- panel.AddContent(b[1]);
- NEW(b[2]); b[2].alignment.Set(WMComponents.AlignLeft); b[2].bounds.SetWidth(50);
- panel.AddContent(b[2]);
- NEW(b[3]); b[3].alignment.Set(WMComponents.AlignRight); b[3].bounds.SetWidth(50);
- panel.AddContent(b[3]);
- NEW(startButton); startButton.alignment.Set(WMComponents.AlignClient);
- startButton.caption.SetAOC("Start!"); startButton.onClick.Add(Start);
- panel.AddContent(startButton);
- (* set the default colours of the buttons *)
- FOR i := 0 TO 3 DO b[i].clDefault.Set(c[i]) END;
- (* set the same color for the case where the mouse is over *)
- FOR i := 0 TO 3 DO b[i].clHover.Set(c[i]) END;
- (* set the flashcolor for the case where the button is pressed*)
- FOR i := 0 TO 3 DO b[i].clPressed.Set(cflash[i]) END;
- FOR i := 0 TO 3 DO b[i].onClick.Add(Evaluate) END;
- RETURN panel
- END CreateForm;
- PROCEDURE &New*;
- VAR vc : WMComponents.VisualComponent;
- i : LONGINT;
- BEGIN
- IncCount;
- (* initialize the button colours *)
- cflash[0] := WMGraphics.Green; cflash[1] := WMGraphics.Red;
- cflash[2] := WMGraphics.Blue; cflash[3] := WMGraphics.Magenta;
- (* scale the default colours to 50% of the flash colour *)
- FOR i := 0 TO 3 DO c[i] := WMGraphicUtilities.ScaleColor(cflash[i], 128) END;
- (* a timer may not be shared between processes so instantiate a new one *)
- NEW(timer);
- (* To create a multi language app, try loading the respective XML instead of CreateForm()
- if the XML was not found or does not contain all needed elements, use CreateForm as fallback *)
- vc := CreateForm();
- (* create a new random number generator *)
- NEW(random);
- random.InitSeed(Kernel.GetTicks());
- Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
- SetContent(vc);
- WM.DefaultAddWindow(SELF);
- SetTitle(Strings.NewString("Bimso Game"));
- END New;
- PROCEDURE Close*;
- BEGIN
- Close^;
- DecCount
- END Close;
- PROCEDURE Handle*(VAR x : WMMessages.Message);
- BEGIN
- IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN Close
- ELSE Handle^(x)
- END
- END Handle;
- PROCEDURE CreateLevel;
- BEGIN
- game[level] := SHORT(SHORT(random.Dice(4)));
- INC(level)
- END CreateLevel;
- PROCEDURE ShowLevel;
- VAR i : LONGINT;
- BEGIN
- FOR i := 0 TO level - 1 DO
- b[game[i]].clDefault.Set(cflash[game[i]]);
- timer.Sleep(150);
- b[game[i]].clDefault.Set(c[game[i]]);
- timer.Sleep(150);
- END;
- END ShowLevel;
- PROCEDURE EnableInput;
- VAR i : LONGINT;
- BEGIN
- FOR i := 0 TO 3 DO b[i].enabled.Set(TRUE) END;
- END EnableInput;
- PROCEDURE DisableInput;
- VAR i : LONGINT;
- BEGIN
- FOR i := 0 TO 3 DO b[i].enabled.Set(FALSE) END;
- END DisableInput;
- PROCEDURE Evaluate(sender, data : ANY);
- VAR i : LONGINT;
- BEGIN {EXCLUSIVE}
- FOR i := 0 TO 3 DO
- IF sender = b[i] THEN
- IF game[step] = i THEN INC(step) ELSE error := TRUE END;
- RETURN
- END
- END
- END Evaluate;
- PROCEDURE Start(sender, data : ANY);
- BEGIN
- Started;
- startButton.visible.Set(FALSE)
- END Start;
- PROCEDURE Started;
- BEGIN {EXCLUSIVE}
- start := TRUE
- END Started;
- PROCEDURE Play;
- BEGIN {EXCLUSIVE}
- step := 0;
- EnableInput;
- AWAIT(error OR (step = level))
- END Play;
- BEGIN {ACTIVE}
- alive := TRUE;
- WHILE alive DO
- start := FALSE;
- error := FALSE; level := 0;
- startButton.visible.Set(TRUE);
- BEGIN {EXCLUSIVE}
- AWAIT(start)
- END;
- error := FALSE;
- REPEAT
- KernelLog.Ln;
- DisableInput;
- timer.Sleep(500);
- CreateLevel;
- ShowLevel;
- Play;
- UNTIL error OR (level >= MaxLevel);
- IF level = MaxLevel THEN
- WMDialogs.Information("You win !!", "There are no more levels")
- ELSE
- Strings.IntToStr(level, levelStr);
- s := "You made it to level "; Strings.Append(s, levelStr);
- WMDialogs.Information("You lose !!", s)
- END;
- alive := WMDialogs.Message(WMDialogs.TQuestion, "Play again ?", "Do you want to play again ?",
- {WMDialogs.ResYes, WMDialogs.ResNo}) = WMDialogs.ResYes
- END;
- Close
- END Window;
- VAR
- nofWindows : LONGINT;
- PROCEDURE Open*;
- VAR winstance : Window;
- BEGIN
- NEW(winstance);
- END Open;
- PROCEDURE IncCount;
- BEGIN {EXCLUSIVE}
- INC(nofWindows);
- END IncCount;
- PROCEDURE DecCount;
- BEGIN {EXCLUSIVE}
- DEC(nofWindows);
- END DecCount;
- PROCEDURE Cleanup;
- VAR die : KillerMsg;
- msg : WMMessages.Message;
- m : WM.WindowManager;
- BEGIN {EXCLUSIVE}
- NEW(die);
- msg.ext := die;
- msg.msgType := WMMessages.MsgExt;
- m := WM.GetDefaultManager();
- m.Broadcast(msg);
- AWAIT(nofWindows = 0)
- END Cleanup;
- BEGIN
- Modules.InstallTermHandler(Cleanup)
- END Bimso.
- SystemTools.Free Bimso ~
- Bimso.Open ~
|