Le langage Basic est d’un apprentissage aisé ce qui en fait une porte d’entrée à l’informaticien en herbe désireux de s’initier à la programmation.
Il existe plusieurs environnements de développement Basic, comme Free Basic ou Small BASIC (Microsoft), tous deux disponibles en libre téléchargement.
Des exemples de codes sources s’inspirant de programmes de jeu emblématiques des années 80 écrits en Small Basic sont librement téléchargeables sur le site www.nonkit.com : Donkey Kong, Snake, jeu de GO, Tic Tac Toe… L’analyse de ces listings est une source précieuse facilitant l’apprentissage de la programmation.
Exemple avec DONKEY KONG :
' DONKEY KONG in the Small Basic World 0.91 ' Small Basic version written by Nonki Takahashi. ' ' History: ' 0.91 2014-05-18 Added workaround for Silverlight. (FGM769-8) ' 0.8 2014-03-24 Added ladders. (FGM769-6) ' 0.7 2014-03-24 Changed music. (FGM769-5) ' 0.6 2014-03-24 Added music and ending. (FGM769-4) ' 0.5b 2014-03-14 Added motion of Mario. (FGM769-3) ' 0.4a 2014-03-13 Added Donkey Kong. (FGM769-2) ' 2014-03-13 13:40:50 Donkey Kong generated by Shapes 1.6b. ' 0.3a 2014-03-12 Barrels demo with friction. (FGM769-1) ' 0.2a 2014-03-10 Barrel demo without friction. (FGM769-0) ' 0.1a 2014-03-08 Created only for graphics. (FGM769) ' GraphicsWindow.Title = "DONKEY KONG in the Small Basic World 0.91" MAXBARREL = 8 Init() Opening() g = 9.8 ' [m/s^2] dt = 1 / 24 ' [s] pxpm = 50 ' [pixel/m] pslope[1] = "x1=200;y1=70;x2=400;y2=70;height=16;pitch=10;color=Maroon;" pslope[2] = "x1=0;y1=130;x2=540;y2=150;height=16;pitch=10;color=Maroon;" pslope[3] = "x1=60;y1=240;x2=600;y2=220;height=16;pitch=10;color=Maroon;" pslope[4] = "x1=0;y1=310;x2=540;y2=330;height=16;pitch=10;color=Maroon;" pslope[5] = "x1=300;y1=412;x2=600;y2=400;height=16;pitch=10;color=Maroon;" pslope[6] = "x1=0;y1=412;x2=300;y2=412;height=16;pitch=10;color=Maroon;" ns = Array.GetItemCount(pslope) For i = 1 To ns param = pslope[i] Slope_Add() EndFor pladder[1] = "x=360;y=86;width=20;height=56;pitch=8;color=DarkCyan;" pladder[2] = "x=500;y=166;width=20;height=56;pitch=8;color=DarkCyan;" pladder[3] = "x=80;y=256;width=20;height=56;pitch=8;color=DarkCyan;" pladder[4] = "x=500;y=346;width=20;height=56;pitch=8;color=DarkCyan;" nl = Array.GetItemCount(pladder) For i = 1 To nl param = pladder[i] Ladder_Add() EndFor op = 100 For i = 1 To 10 hx = hx + 2 op = op - 10 Shapes.Move(help, hx, hy) Shapes.SetOpacity(help, op) Program.Delay(200) EndFor param = "x=10;y=40;m=5000;e=0.56;mu=1;" Barrel_Add() lastms = Clock.ElapsedMilliseconds timeout = "False" Timer.Interval = dt * 1000 Timer.Tick = OnTick Sound.PlayMusic("O6C4D8F8R8D8C8D8O5B-8O6C16D16E-16F16G16A16B-2") GraphicsWindow.KeyDown = OnKeyDown inGame = "True" goal = "False" While inGame If timeout Then ms = Clock.ElapsedMilliseconds If 5000 < ms - lastms Then param = "x=10;y=40;m=5000;e=0.56;mu=1;" Barrel_Add() lastms = ms If mario["ob"] Then Mario_Add() EndIf EndIf Barrel_Motion() Mario_Motion() timeout = "False" Else Program.Delay(dt * 1000) EndIf If goal Then Ending() EndIf EndWhile Closing() Sub Ending Shapes.ShowShape(heart) Sound.PlayMusic("O6R4D4D-8D8R8G8R4G4F8D8R4C4C4F8D-8D8R8O5B-2") inGame = "False" Program.Delay(3000) EndSub Sub Closing GraphicsWindow.Clear() fs = 40 GraphicsWindow.FontSize = fs GraphicsWindow.BrushColor = "White" tw = 267 x = Math.Floor((gw - tw) / 2) y = Math.Floor((gh - fs) / 2) GraphicsWindow.DrawText(x, y, "GAME OVER") EndSub Sub Init gw = 598 gh = 428 GraphicsWindow.Width = gw GraphicsWindow.Height = gh GraphicsWindow.BackgroundColor = "Black" Not = "True=False;False=True;" EndSub Sub OnKeyDown key = GraphicsWindow.LastKey If mario["landing"] Then If key = "Left" Then mario["vx"] = mario["vx"] - 100 mario["vy"] = mario["vy"] - 100 ElseIf key = "Right" Then mario["vx"] = mario["vx"] + 100 mario["vy"] = mario["vy"] - 100 ElseIf key = "Up" Then mario["vy"] = mario["vy"] - 160 EndIf EndIf EndSub Sub OnTick timeout = "True" EndSub Sub Opening ' initialize shapes SB_Workaround() GraphicsWindow.BrushColor = "White" GraphicsWindow.FontName = "Arial Black" GraphicsWindow.FontSize = 40 title = Shapes.AddText("DONKEY KONG") tw = 336 x = (gw - tw) / 2 Shapes.Move(title, x, 20) GraphicsWindow.FontSize = 20 subtitle = Shapes.AddText("in the Small Basic World") tw = 267 x = (gw - tw) / 2 Shapes.Move(subtitle, x, 80) Shapes_Init() ' add shapes scale = 1 angle = 0 iMin = 1 iMax = 47 Shapes_Add() Sound.PlayMusic("O3B2O4R4C#4D2O3B2O4F#16F16F#16F16F#16F16F#16F16F#16F16F#16F16F#16F16F#16F16F#1") Shapes.Remove(title) Shapes.Remove(subtitle) Shapes_Remove() url = "http://www.nonkit.com/smallbasic.files/" peach = Shapes.AddImage(url + "Peach96.png") If silverlight Then Program.Delay(msWait) EndIf Shapes.Move(peach, 180, -4) Shapes.Zoom(peach, 0.6, 0.6) GraphicsWindow.BrushColor = "White" GraphicsWindow.FontSize = 12 help = Shapes.AddText("HELP!") hx = 260 hy = 20 Shapes.Move(help, hx, hy) ' add shapes scale = 0.3 angle = 0 iMin = 1 iMax = 47 Shapes_Add() x = 20 y = 48 Shapes_Move() GraphicsWindow.PenWidth = 2 Mario_Add() GraphicsWindow.FontSize = 50 GraphicsWindow.BrushColor = "Magenta" heart = Shapes.AddText("♥") Shapes.Move(heart, 260, 0) Shapes.HideShape(heart) EndSub Sub Barrel_Add ' param["x"] - left co-ordinate ' param["y"] - top co-ordinate ' param["m"] - mass of barrel [g] ' param["e"] - coefficient of resititution ' param["mu"] - cofficient of friction n = barrel["num"] n = n + 1 If MAXBARREL < n Then Barrel_FindUsed() Else barrel["num"] = n EndIf barrel[n]["m"] = param["m"] barrel[n]["e"] = param["e"] barrel[n]["mu"] = param["mu"] url = "http://www.nonkit.com/smallbasic.files/Barrel32.png" x = param["x"] y = param["y"] If barrel[n]["obj"] = "" Then barrel[n]["obj"] = Shapes.AddImage(url) If silverlight Then Program.Delay(msWait) EndIf EndIf Shapes.SetOpacity(barrel[n]["obj"], 100) barrel[n]["x"] = x barrel[n]["y"] = y Shapes.Move(barrel[n]["obj"], x, y) barrel[n]["vx"] = 0 barrel[n]["vy"] = 0 barrel[n]["vr"] = 0 ' rotational velocity barrel[n]["r"] = 0 ' rotation angle EndSub Sub Barrel_FindUsed ' return n - index of barrel used For n = 1 To barrel["num"] If barrel[n]["x"] < -32 Then Goto bfu_found EndIf EndFor bfu_found: EndSub Sub Barrel_Motion nb = barrel["num"] ns = slope["num"] ax = 0 ay = g * pxpm For ib = 1 To nb vx = barrel[ib]["vx"] vy = barrel[ib]["vy"] barrel[ib]["vx"] = vx + ax * dt barrel[ib]["vy"] = vy + ay * dt barrel[ib]["x"] = barrel[ib]["x"] + (vx + barrel[ib]["vx"]) * dt / 2 barrel[ib]["y"] = barrel[ib]["y"] + (vy + barrel[ib]["vy"]) * dt / 2 xo = barrel[ib]["x"] + 16 yo = barrel[ib]["y"] + 16 e = barrel[ib]["e"] m = barrel[ib]["m"] mu = barrel[ib]["mu"] For is = 1 To ns a = slope[is]["a"] b = slope[is]["b"] c = slope[is]["c"] d = Math.Abs(a * xo + b * yo + c) / Math.SquareRoot(a * a + b * b) If d <= 16 And slope[is]["x1"] <= xo And xo <= slope[is]["x2"] Then x = barrel[ib]["vx"] y = barrel[ib]["vy"] Math_CartesianToPolar() ss = slope[is]["ss"] a = ss * 2 - a vx = r * Math.Cos(Math.GetRadians(a)) vy = r * Math.Sin(Math.GetRadians(a)) dv = Math.SquareRoot(Math.Power((vx - x), 2) + Math.Power((vy - y), 2)) a = g * Math.Sin(Math.GetRadians(ss)) * pxpm / 2 If barrel[ib]["vr"] * a < 0 Then barrel[ib]["vr"] = -0.3 * barrel[ib]["vr"] EndIf barrel[ib]["vr"] = barrel[ib]["vr"] + a * dt dvx = barrel[ib]["vr"] * 16 * Math.Cos(Math.GetRadians(ss)) dvy = barrel[ib]["vr"] * 16 * Math.Sin(Math.GetRadians(ss)) barrel[ib]["vx"] = (vx - x) * e / 2 + (vx + x) / 2 barrel[ib]["vy"] = (vy - y) * e / 2 + (vy + y) / 2 barrel[ib]["x"] = barrel[ib]["x"] + (vx - x) * (16 - d) / dv * e * e barrel[ib]["y"] = barrel[ib]["y"] + (vy - y) * (16 - d) / dv * e * e EndIf EndFor barrel[ib]["r"] = barrel[ib]["r"] + barrel[ib]["vr"] * dt Shapes.Rotate(barrel[ib]["obj"], barrel[ib]["r"] * 10) l = barrel[ib]["x"] If l < 0 And barrel[ib]["y"] < 290 Then barrel[ib]["x"] = -l * e * e barrel[ib]["vx"] = -barrel[ib]["vx"] * e EndIf r = barrel[ib]["x"] + 32 If gw < r Then barrel[ib]["x"] = barrel[ib]["x"] - 2 * (r - gw) * e * e barrel[ib]["vx"] = -barrel[ib]["vx"] * e EndIf h = gh - (barrel[ib]["y"] + 32) If h < 0 Then barrel[ib]["y"] = barrel[ib]["y"] + h * e * e barrel[ib]["vy"] = -barrel[ib]["vy"] * e EndIf Shapes.Move(barrel[ib]["obj"], barrel[ib]["x"], barrel[ib]["y"]) EndFor EndSub Sub Ladder_Add ' param["x"] - top-left x co-ordinate ' param["y"] - top-left y co-ordinate ' param["width"] - width of ladder ' param["height"] - height of ladder ' param["pitch"] - y pitch for steps ' param["color"] - color of slop ' return slope GraphicsWindow.PenColor = param["color"] x = param["x"] y = param["y"] width = param["width"] height = param["height"] pitch = param["pitch"] GraphicsWindow.DrawLine(x, y, x, y + height) GraphicsWindow.DrawLine(x + width, y, x + width, y + height) For ys = y + pitch / 2 To y + height - pitch / 2 Step pitch GraphicsWindow.DrawLine(x, ys, x + width, ys) EndFor EndSub Sub Mario_Add x = 10 y = gh - 20 - 48 If mario["obj1"] = "" Then mario["n"] = 3 url = "http://www.nonkit.com/smallbasic.files/" For i = 1 To mario["n"] life[i] = Shapes.AddImage(url + "Mario48.png") If silverlight Then Program.Delay(msWait) EndIf Shapes.Move(life[i], gw + (i - 5) * 24, 10) Shapes.Zoom(life[i], 0.5, 0.5) EndFor mario["obj1"] = Shapes.AddImage(url + "Mario48.png") If silverlight Then Program.Delay(msWait) EndIf Shapes.Move(mario["obj1"], x, y) mario["obj2"] = Shapes.AddImage(url + "Mario48L.png") mario["obj3"] = Shapes.AddImage(url + "MarioJump48.png") mario["obj4"] = Shapes.AddImage(url + "MarioJump48L.png") If silverlight Then Program.Delay(msWait) EndIf For i = 1 To 4 Shapes.HideShape(mario["obj" + i]) EndFor Program.Delay(1000) Shapes.ShowShape(mario["obj1"]) Shapes.HideShape(life[mario["n"]]) mario["n"] = mario["n"] - 1 ElseIf 0 < mario["n"] Then Shapes.HideShape(life[mario["n"]]) mario["n"] = mario["n"] - 1 Shapes.Move(mario["obj1"], x, y) Shapes.Rotate(mario["obj1"], 0) Shapes.ShowShape(mario["obj1"]) Else inGame = "False" EndIf mario["x"] = x mario["y"] = y mario["vx"] = 1 mario["vy"] = 0 mario["r"] = 0 mario["vr"] = 0 mario["lastobj"] = 1 mario["hit"] = "False" mario["right"] = "True" mario["ob"] = "False" EndSub Sub Mario_Motion ax = 0 ay = g * pxpm vx = mario["vx"] vy = mario["vy"] mario["vx"] = vx + ax * dt mario["vy"] = vy + ay * dt xm = mario["x"] + (vx + mario["vx"]) * dt / 2 + 24 ym = mario["y"] + (vy + mario["vy"]) * dt / 2 + 24 mario["landing"] = "False" If Not[mario["hit"]] Then nb = barrel["num"] For ib = 1 To nb xb = barrel[ib]["x"] + 16 yb = barrel[ib]["y"] + 16 d = Math.SquareRoot(Math.Power((xb - xm), 2) + Math.Power((yb - ym), 2)) If d < 20 Then mario["hit"] = "True" mario["vx"] = 0 ym = ym - 24 mario["vr"] = 720 EndIf EndFor ns = slope["num"] For is = 1 To ns a = slope[is]["a"] b = slope[is]["b"] c = slope[is]["c"] d = Math.Abs(a * xm + b * ym + c) / Math.SquareRoot(a * a + b * b) If d <= 24 And slope[is]["x1"] <= xm And xm <= slope[is]["x2"] Then mario["landing"] = "True" mario["vx"] = 0 mario["vy"] = 0 ym = -(a * xm + c) / b - 22 Goto mm_break EndIf EndFor mm_break: EndIf mario["x"] = xm - 24 mario["y"] = Math.Floor(ym - 24) l = mario["x"] If mario["landing"] And is = 1 Then goal = "True" EndIf If l < 0 Then mario["x"] = -l * e * e mario["vx"] = -mario["vx"] * e EndIf r = mario["x"] + 48 If gw < r Then mario["x"] = mario["x"] - 2 * (r - gw) * e * e mario["vx"] = -mario["vx"] * e EndIf h = gh - (mario["y"] + 48) If mario["hit"] Then If h < -48 Then mario["ob"] = "True" EndIf Else If h < 0 Then mario["y"] = mario["y"] + h * e * e mario["vy"] = -mario["vy"] * e EndIf EndIf If mario["landing"] Then If 0 < mario["vx"] Then im = 1 ElseIf mario["vx"] < 0 Then im = 2 Else im = Math.Remainder(im - 1, 2) + 1 EndIf Else If 0 < mario["vx"] Then im = 3 ElseIf mario["vx"] < 0 Then im = 4 Else im = Math.Remainder(im - 1, 2) + 3 EndIf EndIf If mario["lastobj"] <> im Then Shapes.HideShape(mario["obj" + mario["lastobj"]]) Shapes.ShowShape(mario["obj" + im]) mario["lastobj"] = im EndIf mario["r"] = mario["r"] + mario["vr"] * dt Shapes.Rotate(mario["obj" + im], mario["r"]) Shapes.Move(mario["obj" + im], mario["x"], mario["y"]) EndSub Sub Math_CartesianToPolar ' Math | convert cartesian coodinate to polar coordinate ' param x, y - cartesian coordinate ' return r, a - polar coordinate r = Math.SquareRoot(x * x + y * y) If x = 0 And y > 0 Then a = 90 ' [degree] ElseIf x = 0 And y < 0 Then a = -90 Else a = Math.ArcTan(y / x) * 180 / Math.Pi EndIf If x < 0 Then a = a + 180 ElseIf x > 0 And y < 0 Then a = a + 360 EndIf EndSub Sub SB_RotateWorkaround ' Small Basic | Rotate workaround for Silverlight ' param x, y - original coordinate ' param alpha - angle [radian] ' returns x, y - workaround coordinate If shape[i]["func"] = "tri" Then x1 = -Math.Floor(shape[i]["x3"] / 2) y1 = -Math.Floor(shape[i]["y3"] / 2) ElseIf shape[i]["func"] = "line" Then x1 = -Math.Floor(Math.Abs(shape[i]["x1"] - shape[i]["x2"]) / 2) y1 = -Math.Floor(Math.Abs(shape[i]["y1"] - shape[i]["y2"]) / 2) EndIf ox = x - x1 oy = y - y1 x = x1 * Math.Cos(alpha) - y1 * Math.Sin(alpha) + ox y = x1 * Math.Sin(alpha) + y1 * Math.Cos(alpha) + oy EndSub Sub SB_Workaround ' Small Basic | Workaround for Silverlight ' returns silverlight - "True" if in remote color = GraphicsWindow.GetPixel(0, 0) If Text.GetLength(color) > 7 Then silverlight = "True" msWait = 300 Else silverlight = "False" EndIf EndSub Sub Shapes_Add ' Shapes | add shapes as shapes data ' param iMin, iMax - shape indices to add ' param shape - array of shapes ' param scale - 1 if same scale ' return shWidth, shHeight - total size of shapes ' return shAngle - current angle of shapes Stack.PushValue("local", i) Stack.PushValue("local", x) Stack.PushValue("local", y) Shapes_CalcWidthAndHeight() s = scale For i = iMin To iMax GraphicsWindow.PenWidth = shape[i]["pw"] * s If shape[i]["pw"] > 0 Then GraphicsWindow.PenColor = shape[i]["pc"] EndIf If Text.IsSubText("rect|ell|tri|text", shape[i]["func"]) Then GraphicsWindow.BrushColor = shape[i]["bc"] EndIf If shape[i]["func"] = "rect" Then shape[i]["obj"] = Shapes.AddRectangle(shape[i]["width"] * s, shape[i]["height"] * s) ElseIf shape[i]["func"] = "ell" Then shape[i]["obj"] = Shapes.AddEllipse(shape[i]["width"] * s, shape[i]["height"] * s) ElseIf shape[i]["func"] = "tri" Then shape[i]["obj"] = Shapes.AddTriangle(shape[i]["x1"] * s, shape[i]["y1"] * s, shape[i]["x2"] * s, shape[i]["y2"] * s, shape[i]["x3"] * s, shape[i]["y3"] * s) ElseIf shape[i]["func"] = "line" Then shape[i]["obj"] = Shapes.AddLine(shape[i]["x1"] * s, shape[i]["y1"] * s, shape[i]["x2"] * s, shape[i]["y2"] * s) ElseIf shape[i]["func"] = "text" Then If silverlight Then fs = Math.Floor(shape[i]["fs"] * 0.9) Else fs = shape[i]["fs"] EndIf GraphicsWindow.FontSize = fs * s GraphicsWindow.FontName = shape[i]["fn"] shape[i]["obj"] = Shapes.AddText(shape[i]["text"]) EndIf x = shape[i]["x"] y = shape[i]["y"] shape[i]["rx"] = x shape[i]["ry"] = y If silverlight And Text.IsSubText("tri|line", shape[i]["func"]) Then alpha = Math.GetRadians(shape[i]["angle"]) SB_RotateWorkaround() shape[i]["wx"] = x shape[i]["wy"] = y EndIf Shapes.Move(shape[i]["obj"], shX + x * s, shY + y * s) If Text.IsSubText("rect|ell|tri|text", shape[i]["func"]) And shape[i]["angle"] <> 0 Then Shapes.Rotate(shape[i]["obj"], shape[i]["angle"]) EndIf EndFor shAngle = 0 y = Stack.PopValue("local") x = Stack.PopValue("local") i = Stack.PopValue("local") EndSub Sub Shapes_CalcRotatePos ' Shapes | Calculate position for rotated shape ' param["x"], param["y"] - position of a shape ' param["width"], param["height"] - size of a shape ' param ["cx"], param["cy"] - center of rotation ' param ["angle"] - rotate angle ' return x, y - rotated position of a shape _cx = param["x"] + param["width"] / 2 _cy = param["y"] + param["height"] / 2 x = _cx - param["cx"] y = _cy - param["cy"] Math_CartesianToPolar() a = a + param["angle"] x = r * Math.Cos(a * Math.Pi / 180) y = r * Math.Sin(a * Math.Pi / 180) _cx = x + param["cx"] _cy = y + param["cy"] x = _cx - param["width"] / 2 y = _cy - param["height"] / 2 EndSub Sub Shapes_CalcWidthAndHeight ' Shapes | Calculate total width and height of shapes ' param iMin, iMax - shape indices to add ' return shWidth, shHeight - total size of shapes For i = iMin To iMax If shape[i]["func"] = "tri" Or shape[i]["func"] = "line" Then xmin = shape[i]["x1"] xmax = shape[i]["x1"] ymin = shape[i]["y1"] ymax = shape[i]["y1"] If shape[i]["x2"] < xmin Then xmin = shape[i]["x2"] EndIf If xmax < shape[i]["x2"] Then xmax = shape[i]["x2"] EndIf If shape[i]["y2"] < ymin Then ymin = shape[i]["y2"] EndIf If ymax < shape[i]["y2"] Then ymax = shape[i]["y2"] EndIf If shape[i]["func"] = "tri" Then If shape[i]["x3"] < xmin Then xmin = shape[i]["x3"] EndIf If xmax < shape[i]["x3"] Then xmax = shape[i]["x3"] EndIf If shape[i]["y3"] < ymin Then ymin = shape[i]["y3"] EndIf If ymax < shape[i]["y3"] Then ymax = shape[i]["y3"] EndIf EndIf shape[i]["width"] = xmax - xmin shape[i]["height"] = ymax - ymin EndIf If i = 1 Then shWidth = shape[i]["x"] + shape[i]["width"] shHeight = shape[i]["y"] + shape[i]["height"] Else If shWidth < shape[i]["x"] + shape[i]["width"] Then shWidth = shape[i]["x"] + shape[i]["width"] EndIf If shHeight < shape[i]["y"] + shape[i]["height"] Then shHeight = shape[i]["y"] + shape[i]["height"] EndIf EndIf EndFor EndSub Sub Shapes_Init ' Shapes | Initialize shapes data for Donkey Kong ' return shX, shY - current position of shapes ' return shape - array of shapes shX = 150 ' x offset shY = 120 ' y offset shape = "" shape[1] = "func=ell;x=98;y=44;width=110;height=71;bc=#834216;pw=0;" shape[2] = "func=ell;x=51;y=247;width=75;height=23;angle=348;bc=#FDBC90;pc=#834216;pw=2;" shape[3] = "func=ell;x=197;y=250;width=74;height=22;angle=11;bc=#FDBC90;pc=#834216;pw=2;" shape[4] = "func=ell;x=113;y=253;width=20;height=22;bc=#FDBC90;pc=#834216;pw=2;" shape[5] = "func=ell;x=191;y=255;width=18;height=20;bc=#FDBC90;pc=#834216;pw=2;" shape[6] = "func=ell;x=40;y=260;width=13;height=16;bc=#FDBC90;pc=#834216;pw=2;" shape[7] = "func=ell;x=47;y=264;width=16;height=18;bc=#FDBC90;pc=#834216;pw=2;" shape[8] = "func=ell;x=261;y=267;width=13;height=13;bc=#FDBC90;pc=#834216;pw=2;" shape[9] = "func=ell;x=252;y=269;width=13;height=15;bc=#FDBC90;pc=#834216;pw=2;" shape[10] = "func=ell;x=81;y=190;width=36;height=67;angle=332;bc=#834216;pw=0;" shape[11] = "func=ell;x=200;y=188;width=35;height=67;angle=20;bc=#834216;pw=0;" shape[12] = "func=ell;x=76;y=175;width=62;height=43;bc=#834216;pw=0;" shape[13] = "func=ell;x=171;y=178;width=60;height=40;bc=#834216;pw=0;" shape[14] = "func=ell;x=112;y=139;width=82;height=76;bc=#834216;pw=0;" shape[15] = "func=ell;x=75;y=99;width=81;height=72;bc=#834216;pw=0;" shape[16] = "func=ell;x=149;y=96;width=82;height=74;bc=#834216;pw=0;" shape[17] = "func=ell;x=5;y=87;width=107;height=55;angle=340;bc=#834216;pw=0;" shape[18] = "func=ell;x=195;y=82;width=109;height=59;angle=25;bc=#834216;pw=0;" shape[19] = "func=ell;x=0;y=126;width=43;height=76;angle=341;bc=#834216;pw=0;" shape[20] = "func=ell;x=263;y=126;width=45;height=72;angle=17;bc=#834216;pw=0;" shape[21] = "func=ell;x=33;y=176;width=39;height=35;bc=#FDBC90;pc=#834216;pw=2;" shape[22] = "func=ell;x=239;y=176;width=41;height=37;bc=#FDBC90;pc=#834216;pw=2;" shape[23] = "func=tri;x=113;y=0;x1=37;y1=0;x2=0;y2=76;x3=75;y3=76;bc=#834216;pw=0;" shape[24] = "func=tri;x=148;y=5;x1=15;y1=0;x2=0;y2=43;x3=31;y3=43;bc=#834216;pw=0;" shape[25] = "func=ell;x=110;y=46;width=58;height=41;angle=33;bc=#FDBC90;pw=0;" shape[26] = "func=ell;x=138;y=47;width=61;height=41;angle=318;bc=#FDBC90;pw=0;" shape[27] = "func=tri;x=119;y=60;x1=33;y1=0;x2=0;y2=41;x3=67;y3=41;angle=180;bc=#000000;pc=#000000;pw=2;" shape[28] = "func=ell;x=127;y=61;width=28;height=19;angle=349;bc=#FFFFFF;pc=#000000;pw=2;" shape[29] = "func=ell;x=152;y=62;width=30;height=20;angle=16;bc=#FFFFFF;pc=#000000;pw=2;" shape[30] = "func=ell;x=135;y=66;width=14;height=15;bc=#000000;pc=#000000;pw=2;" shape[31] = "func=ell;x=158;y=67;width=14;height=15;bc=#000000;pc=#000000;pw=2;" shape[32] = "func=ell;x=123;y=140;width=59;height=60;bc=#FCA76E;pc=#834216;pw=2;" shape[33] = "func=ell;x=150;y=107;width=62;height=55;bc=#FCA76E;pw=0;" shape[34] = "func=ell;x=94;y=107;width=64;height=53;bc=#FCA76E;pw=0;" shape[35] = "func=ell;x=96;y=79;width=118;height=69;bc=#FDBC90;pc=#834216;pw=2;" shape[36] = "func=ell;x=77;y=65;width=35;height=23;angle=38;bc=#FDBC90;pc=#834216;pw=2;" shape[37] = "func=ell;x=194;y=63;width=36;height=23;angle=317;bc=#FDBC90;pc=#834216;pw=2;" shape[38] = "func=ell;x=130;y=74;width=22;height=17;angle=15;bc=#FDBC90;pw=0;" shape[39] = "func=ell;x=156;y=73;width=22;height=18;angle=348;bc=#FDBC90;pw=0;" shape[40] = "func=tri;x=111;y=90;x1=10;y1=0;x2=0;y2=22;x3=20;y3=22;angle=298;bc=#FFFFFF;pc=#000000;pw=2;" shape[41] = "func=tri;x=172;y=91;x1=11;y1=0;x2=0;y2=23;x3=22;y3=23;angle=62;bc=#FFFFFF;pc=#000000;pw=2;" shape[42] = "func=rect;x=125;y=97;width=55;height=21;bc=#FFFFFF;pc=#000000;pw=2;" shape[43] = "func=ell;x=135;y=78;width=15;height=9;angle=23;bc=#834216;pw=0;" shape[44] = "func=ell;x=159;y=77;width=15;height=9;angle=339;bc=#834216;pw=0;" shape[45] = "func=line;x=152;y=97;x1=0;y1=0;x2=0;y2=19;pc=#000000;pw=2;" shape[46] = "func=line;x=137;y=98;x1=0;y1=0;x2=0;y2=19;pc=#000000;pw=2;" shape[47] = "func=line;x=167;y=99;x1=0;y1=0;x2=0;y2=18;pc=#000000;pw=2;" EndSub Sub Shapes_Move ' Shapes | Move shapes ' param iMin, iMax - shape indices to add ' param shape - array of shapes ' param scale - to zoom ' param x, y - position to move ' return shX, shY - new position of shapes Stack.PushValue("local", i) s = scale shX = x shY = y For i = iMin To iMax If silverlight And Text.IsSubText("tri|line", shape[i]["func"]) Then _x = shape[i]["wx"] _y = shape[i]["wy"] Else _x = shape[i]["rx"] _y = shape[i]["ry"] EndIf Shapes.Move(shape[i]["obj"], shX + _x * s, shY + _y * s) EndFor i = Stack.PopValue("local") EndSub Sub Shapes_Remove ' Shapes | Remove shapes ' param iMin, iMax - shapes indices to remove ' param shape - array of shapes Stack.PushValue("local", i) For i = iMin To iMax Shapes.Remove(shape[i]["obj"]) EndFor i = Stack.PopValue("local") EndSub Sub Shapes_Rotate ' Shapes | Rotate shapes ' param iMin, iMax - shapes indices to rotate ' param shape - array of shapes ' param scale - to zoom ' param angle - to rotate Stack.PushValue("local", i) Stack.PushValue("local", x) Stack.PushValue("local", y) s = scale param["angle"] = angle param["cx"] = shWidth / 2 param["cy"] = shHeight / 2 For i = iMin To iMax param["x"] = shape[i]["x"] param["y"] = shape[i]["y"] param["width"] = shape[i]["width"] param["height"] = shape[i]["height"] Shapes_CalcRotatePos() shape[i]["rx"] = x shape[i]["ry"] = y If silverlight And Text.IsSubText("tri|line", shape[i]["func"]) Then alpha = Math.GetRadians(angle + shape[i]["angle"]) SB_RotateWorkAround() shape[i]["wx"] = x shape[i]["wy"] = y EndIf Shapes.Move(shape[i]["obj"], shX + x * s, shY + y * s) Shapes.Rotate(shape[i]["obj"], angle + shape[i]["angle"]) EndFor y = Stack.PopValue("local") x = Stack.PopValue("local") i = Stack.PopValue("local") EndSub Sub Slope_Add ' param["x1"] - top-left x co-ordinate ' param["y1"] - top-left y co-ordinate ' param["x2"] - top-right x co-ordinate ' param["y2"] - top-right y co-ordinate ' param["height"] - height of slope ' param["pitch"] - x pitch for diagonal brace ' param["color"] - color of slop ' return slope n = slope["num"] n = n + 1 slope["num"] = n GraphicsWindow.PenColor = param["color"] x1 = param["x1"] y1 = param["y1"] x2 = param["x2"] y2 = param["y2"] GraphicsWindow.DrawLine(x1, y1, x2, y2) slope[n]["x1"] = x1 slope[n]["y1"] = y1 slope[n]["x2"] = x2 slope[n]["y2"] = y2 x = x2 - x1 y = y2 - y1 Math_CartesianToPolar() slope[n]["ss"] = a slope[n]["a"] = y slope[n]["b"] = -x slope[n]["c"] = -y * x1 + x * y1 x3 = x1 y3 = y1 + param["height"] x4 = x2 y4 = y2 + param["height"] GraphicsWindow.DrawLine(x3, y3, x4, y4) slope[n]["x3"] = x3 slope[n]["y3"] = y3 slope[n]["x4"] = x4 slope[n]["y4"] = y4 pitch = param["pitch"] up = "False" For x5 = x1 To x2 - pitch Step pitch x6 = x5 + pitch If up Then y5 = y1 + (y2 - y1) * (x5 - x1) / (x2 - x1) y6 = y3 + (y4 - y3) * (x6 - x3) / (x4 - x3) Else y5 = y3 + (y4 - y3) * (x5 - x3) / (x4 - x3) y6 = y1 + (y2 - y1) * (x6 - x1) / (x2 - x1) EndIf GraphicsWindow.DrawLine(x5, y5, x6, y6) up = Not[up] EndFor EndSub
Small Basic version 1.2 en téléchargement sur le site de Microsoft
Pour aller plus loin : s’initier à la programmation en Basic / découvrir le langage VBA / les langages de programmation (histoire de l’informatique)
Derniers articles parBenoît RIVIERE (voir tous)
- Nouveautés de l’interpréteur de formules de calcul (v1.1) - dimanche 3 novembre 2024
- Dématérialisation de la facturation : nouvelles mentions obligatoires - lundi 28 octobre 2024
- Interpréteur de formules de calcul en Python - dimanche 13 octobre 2024
- Les données de la facturation électronique - mercredi 9 octobre 2024
- VBA/SQL vs Power Query : deux solutions complémentaires - mercredi 2 octobre 2024
Pingback: Analyse de données et automatisation avec Excel et Access (7ème volet) - Audit & Systèmes d'Information
Pingback: Retrogaming : (re)jouer aux jeux vidéo d'antan - Audit & Systèmes d'Information