MODULE demo; FROM tigr IMPORT TigrPtr,tigrWindow,tigrFree,tigrClosed, tigrClear, tigrUpdate, TPixelType, tigrLine, TK_ESCAPE, tigrKeyDown, tigrReadChar, tfont, tigrPrint,tigrFill, tigrCircle, tigrRect, tigrFillCircle, tigrTime, tigrError, tigrClip, tigrFillRect, tigrTextWidth, tigrTextHeight, tigrLoadImage, tigrReadFile, tigrBitmap, TIGR_2X, tigrSetPostFX, tigrMouse,tigrBlit, tigrBlitAlpha, tigrEncodeUTF8, TK_RIGHT,tigrKeyHeld, TK_SPACE, TK_LEFT; FROM helper IMPORT tigrRGB, tigrRGBA; FROM DynamicStrings IMPORT String, InitStringCharStar, CopyOut; FROM InOut IMPORT Write, WriteLn, WriteCard,WriteString; FROM Delay IMPORT Delay; FROM SYSTEM IMPORT ADDRESS; FROM SMathLib0 IMPORT exp; VAR standing : BOOLEAN; remaining : SHORTREAL; backdrop, screen : TigrPtr; squinkle : TigrPtr; greeting : ARRAY[0..1023] OF CHAR; greetingRaw : ADDRESS; greetingStr : String; prevx, prevy, prev : CARDINAL; chars : ARRAY[0..16] OF CHAR; n : CARDINAL; dt : SHORTREAL; x, y ,b : CARDINAL; c : CARDINAL; playerx, playery, playerxs, playerys : CARDINAL; PROCEDURE update (dt : SHORTREAL); (* in Modula2, we cannot mix integer and real *) VAR oldx, oldy : INTEGER; fplayerx, fplayery, fplayerxs, fplayerys : SHORTREAL; fdx, fdy : SHORTREAL; foldx, foldy : SHORTREAL; BEGIN IF (remaining > 0.0) THEN remaining := remaining - dt; END; (* Read the keyboard and move the player. *) IF (standing OR (tigrKeyDown(screen, TK_SPACE) >0)) THEN IF (playerys - 200) >= 0 THEN playerys := playerys - 200; ELSE playerys := 0; END; END; IF ((tigrKeyHeld(screen, TK_LEFT) > 0) OR (tigrKeyHeld(screen, ORD('a')) > 0)) THEN IF (playerxs - 10) >= 0 THEN playerxs := playerxs - 10 ELSE playerxs := 0 END; END; IF ((tigrKeyHeld(screen, TK_RIGHT) > 0) OR (tigrKeyHeld(screen, ORD('d')) > 0)) THEN IF (playerxs + 10) <= 320 THEN playerxs := playerxs + 10 ELSE playerxs := 320 END; END; (* conversion part betwwen CARDINAL and REAL*) fplayerxs := FLOAT(playerxs); fplayerys := FLOAT(playerys); (* end conversion *) foldx := fplayerx; foldy := fplayery; (* Apply simply physics. *) fplayerxs := fplayerxs * exp(-10.0 * dt); fplayerys := fplayery * exp(-2.0 * dt); fplayerys := fplayerys + (dt * 200.0); fplayerx := fplayerx + (dt * fplayerxs); fplayery := fplayery + (dt * fplayerys); (* Apply collision. *) playerx := TRUNC(fplayerx); IF playerx < 8 THEN playerx := 8; playerxs := 0; END; IF (playerx > screen^.w - 8) THEN playerx := screen^.w - 8; playerxs := 0; END; END update; BEGIN standing := TRUE; remaining := 0.0; playerx := 160; playery := 200; playerxs := 0; playerys := 0; squinkle := tigrLoadImage("squinkle.png"); IF ( squinkle = NIL) THEN tigrError(0, "Cannot load squinkle.png"); END; (* Load some UTF-8 text. *) greetingRaw := tigrReadFile("greeting.txt", 0); IF (greetingRaw = NIL) THEN tigrError(0, "Cannot load greeting.txt"); END; greetingStr := InitStringCharStar(greetingRaw); CopyOut(greeting, greetingStr); (* Make a window and an off-screen backdrop. *) screen := tigrWindow(320, 240, greeting, TIGR_2X); backdrop := tigrBitmap(screen^.w, screen^.h); (* Fill in the background. *) tigrClear(backdrop, tigrRGB(80, 180, 255)); tigrFill(backdrop, 0, 200, 320, 40, tigrRGB(60, 120, 60)); tigrFill(backdrop, 0, 200, 320, 3, tigrRGB(0, 0, 0)); tigrLine(backdrop, 0, 201, 320, 201, tigrRGB(255, 255, 255)); (* Enable post fx *) tigrSetPostFX(screen, 1.0, 1.0, 1.0, 2.0); prevx := 0; prevy := 0; prev := 0; (* Maintain a list of characters entered. *) FOR n := 0 TO 16 BY 1 DO chars[n] := "_"; END; WHILE (NOT (tigrClosed(screen) > 0)) OR (tigrKeyDown(screen, TK_ESCAPE) > 0) DO (* Update the game. *) dt := tigrTime(); update(dt); (* Read the mouse and draw lines when pressed. *) tigrMouse(screen, x, y, b ); IF (b = 1) THEN IF (prev > 0) THEN tigrLine(backdrop, prevx, prevy, x, y, tigrRGB(0, 0, 0)); END; prevx := x; prevy := y; prev := 1; ELSE prev := 0; END; (* Composite the backdrop and sprite onto the screen. *) tigrBlit(screen, backdrop, 0, 0, 0, 0, backdrop^.w, backdrop^.h); tigrBlitAlpha(screen, squinkle, playerx - CARDINAL(squinkle^.w / 2), playery - CARDINAL(squinkle^.h), 0, 0, squinkle^.w, squinkle^.h, 1.0); tigrPrint(screen, tfont, 10, 10, tigrRGBA(0C0H, 0D0H, 0FFH, 0C0H), greeting); tigrPrint(screen, tfont, 10, 222, tigrRGBA(0FFH, 0FFH, 0FFH, 0FFH), "A D + SPACE"); (* Grab any chars and add them to our buffer. *) LOOP c := tigrReadChar(screen); IF (c = 0) THEN EXIT; END; FOR n := 1 TO 16 DO chars[n - 1] := chars[n]; END; chars[15] := CHR(c); END; Write(CHR(c)); tigrUpdate(screen); END; (* (* Print out the character buffer too. *) FOR n := 0 TO 15 DO tempString := tigrEncodeUTF8(p, chars[n]); END; *p = 0; tigrPrint(screen, tfont, 160, 222, tigrRGB(255, 255, 255), "Chars: %s", tmp); *) tigrFree(squinkle); tigrFree(backdrop); tigrFree(screen); END demo.