_TITLE "Christmas Star Tree" 'B+ for QB64 2018-11-30
RANDOMIZE TIMER
CONST xmax = 1280
CONST ymax = 720
COMMON SHARED cN, pR, pG, Plasma AS _UNSIGNED LONG
'for Plasma writing
DIM SHARED maxIndex AS INTEGER
maxIndex = 3200
REDIM SHARED xyDat%(maxIndex, 1)
DIM SHARED cNw, pRw, pGw, pBw, indexP, DOTi
loadPlasmaData
resetPlasmaWrite
SCREEN _NEWIMAGE(xmax, ymax, 32)
_SCREENMOVE 75, 5
'begin drawing background stars&
stars& = _NEWIMAGE(xmax, ymax, 32)
_DEST stars&
FOR i = 0 TO ymax - 80 ' sky
LINE (0, i)-(xmax, i), _RGB32(50, 0, i / ymax * 68)
NEXT
FOR s = 1 TO 100 ' stars
c = rand(155, 255)
COLOR _RGBA32(c, c, c, RND * 100 + 155)
fcirc RND * xmax, rand(0, 520), rand(0, 3)
NEXT
FOR i = ymax - 80 TO ymax 'ground
LINE (0, i)-(xmax, i), _RGB32(50, 30, 20)
NEXT
' setup for main screen
_DEST 0
midx = 400
starCenterY = 30
maxd = ((ymax - starCenterY) ^ 2 + (midx - xmax) ^ 2) ^ .5
ofs = 0
dir = 1
DO WHILE _KEYDOWN(27) = 0 'main loop
'update message
_DEST stars&
changePlasmaWrite
DOTi = DOTi + 1
IF DOTi <= indexP THEN fcirc xyDat%(DOTi, 0), xyDat%(DOTi, 1), 10
'show update
_DEST 0
_PUTIMAGE , stars&, 0
'main star over tree
resetPlasma
FOR a = 0 TO _PI(2) STEP _PI(1 / 36)
IF a = 0 THEN
lastx = midx + maxd * COS(a)
lasty = starCenterY + maxd * SIN(a)
ELSE
x1 = midx + maxd * COS(a)
y1 = starCenterY + maxd * SIN(a)
changePlasma
ftri midx, starCenterY, lastx, lasty, x1, y1, Plasma
lastx = x1: lasty = y1
END IF
NEXT
FOR R = 25 TO 0 STEP -1
COLOR _RGBA(255, 255, 205, (25 - R) ^ 2 / 2.5)
fcirc midx, starCenterY, R
NEXT
'tree
stepper = stepper + dir
IF stepper > 75 THEN dir = dir * -1: stepper = 75
IF stepper < 14 THEN dir = dir * -1: stepper = 14
FOR y = 80 TO ymax - 20 STEP stepper
star midx, y, 5 + .1 * y, 15 + .5 * y, 6, ofs + _PI(y / 720)
NEXT
_DISPLAY
ofs = ofs + _PI(1 / 36)
IF ofs > _PI(2) THEN ofs = 0
_LIMIT 8
LOOP
SUB changePlasma ()
cN = cN + 1
Plasma = _RGBA(200 + 56 * SIN(pR * cN), 200 + 56 * SIN(pG * cN), 128, RND * 64 + 30)
END SUB
SUB resetPlasma ()
pR = RND ^ 2: pG = RND ^ 2
END SUB
SUB ftri (x1, y1, x2, y2, x3, y3, K AS _UNSIGNED LONG)
a& = _NEWIMAGE(1, 1, 32)
_DEST a&
PSET (0, 0), K
_DEST 0
_MAPTRIANGLE _SEAMLESS(0, 0)-(0, 0)-(0, 0), a& TO(x1, y1)-(x2, y2)-(x3, y3)
_FREEIMAGE a& '<<< this is important!
END SUB
SUB fatLine (x1, y1, x2, y2)
stepx = x2 - x1: stepy = y2 - y1
length = INT((stepx ^ 2 + stepy ^ 2) ^ .5)
IF length THEN
dx = stepx / length: dy = stepy / length
FOR i = 0 TO length
CIRCLE (x1 + dx * i, y1 + dy * i), 5
NEXT
END IF
END SUB
SUB star (x, y, rInner, rOuter, nPoints, angleOffset)
' x, y are same as for circle,
' rInner is center circle radius
' rOuter is the outer most point of star
' nPoints is the number of points,
' angleOffset = angle offset in radians
' this is to allow us to spin the star
'modified a bit for stacking up a tree
DIM ar(INT(nPoints) * 4 + 3) 'add two for origin
pAngle = _PI(2) / nPoints: radAngleOffset = angleOffset - _PI(1 / 2)
x1 = x + rOuter * COS(radAngleOffset)
y1 = y + .2 * rOuter * SIN(radAngleOffset)
idx = 4
FOR i = 0 TO nPoints - 1
x2 = x + rInner * COS(i * pAngle + radAngleOffset + .5 * pAngle)
y2 = y + .2 * rInner * SIN(i * pAngle + radAngleOffset + .5 * pAngle)
COLOR _RGB32(rand(0, 40), rand(40, 120), rand(0, 35))
fatLine x1, y1, x2, y2
x1 = x2
y1 = y2
x2 = x + rOuter * COS((i + 1) * pAngle + radAngleOffset)
y2 = y + .2 * rOuter * SIN((i + 1) * pAngle + radAngleOffset)
COLOR _RGB32(rand(0, 40), rand(40, 120), rand(0, 35))
fatLine x1, y1, x2, y2
x1 = x2
y1 = y2
NEXT
END SUB
FUNCTION rand% (lo%, hi%)
rand% = INT(RND * (hi% - lo% + 1)) + lo%
END FUNCTION
SUB fcirc (CX AS LONG, CY AS LONG, R AS LONG)
DIM subRadius AS LONG, RadiusError AS LONG
DIM X AS LONG, Y AS LONG
subRadius = ABS(R)
RadiusError = -subRadius
X = subRadius
Y = 0
IF subRadius = 0 THEN PSET (CX, CY): EXIT SUB
' Draw the middle span here so we don't draw it twice in the main loop,
' which would be a problem with blending turned on.
LINE (CX - X, CY)-(CX + X, CY), , BF
WHILE X > Y
RadiusError = RadiusError + Y * 2 + 1
IF RadiusError >= 0 THEN
IF X <> Y + 1 THEN
LINE (CX - Y, CY - X)-(CX + Y, CY - X), , BF
LINE (CX - Y, CY + X)-(CX + Y, CY + X), , BF
END IF
X = X - 1
RadiusError = RadiusError - X * 2
END IF
Y = Y + 1
LINE (CX - X, CY - Y)-(CX + X, CY - Y), , BF
LINE (CX - X, CY + Y)-(CX + X, CY + Y), , BF
WEND
END SUB
'separatePlasma for writing than main star
SUB changePlasmaWrite ()
cNw = cNw + .5
COLOR _RGB(127 + 127 * SIN(pRw * cNw), 127 + 127 * SIN(pGw * cNw), 127 + 127 * SIN(pBw * cNw))
END SUB
SUB resetPlasmaWrite ()
pRw = RND ^ 2: pGw = RND ^ 2: pBw = RND ^ 2
END SUB
SUB loadPlasmaData
indexP = 0
WHILE dx <> 9999
READ dx, dy
IF dx <> 9999 THEN xyDat%(indexP, 0) = dx: xyDat%(indexP, 1) = dy: indexP = indexP + 1
WEND
END SUB
DATA 877,65,877,65,877,65,877,65,877,65,877,67,877,70,877,74,877,79,878,85
DATA 878,89,878,95,879,100,881,105,881,111,881,116,882,120,882,122,883,126,883,131
DATA 883,135,883,140,883,144,883,148,883,153,883,159,883,164,883,166,883,177,883,179
DATA 883,183,883,188,884,191,884,194,884,197,884,201,884,203,884,205,884,207,884,208
DATA 884,210,884,211,883,211,883,211,878,211,874,211,859,210,853,210,843,210,840,210
DATA 828,211,824,211,817,211,806,210,799,209,797,208,795,207,795,207,795,207,795,207
DATA 795,207,795,207,795,207,795,207,795,207,795,207,795,207,795,207,795,207,795,207
DATA 795,207,795,207,795,207,795,207,943,154,942,154,940,156,938,159,937,162,936,164
DATA 935,167,935,170,934,173,934,174,934,177,934,179,934,183,935,186,937,189,937,192
DATA 938,195,939,197,939,199,940,200,940,201,941,202,941,203,942,203,943,203,943,204
DATA 944,204,945,204,945,204,948,205,949,205,952,206,956,206,962,206,966,206,968,205
DATA 969,205,970,203,972,201,974,200,976,199,978,198,978,197,979,196,980,194,980,192
DATA 980,190,980,186,980,183,980,182,980,181,980,180,980,179,980,178,980,177,978,175
DATA 977,173,975,171,974,169,971,167,970,166,968,165,968,165,968,165,968,164,968,164
DATA 967,164,965,163,963,163,962,162,962,161,961,161,961,161,961,161,960,161,960,161
DATA 960,161,960,161,960,161,960,161,960,161,960,161,960,161,960,161,960,161,960,161
DATA 960,161,960,161,960,161,960,161,960,161,960,161,960,161,960,161,960,161,1020,159
DATA 1020,159,1020,159,1020,159,1020,159,1020,159,1020,162,1020,166,1021,172,1022,173,1024,178
DATA 1026,180,1027,185,1028,188,1029,190,1030,192,1031,193,1031,195,1032,196,1033,197,1034,199
DATA 1034,201,1036,203,1036,204,1037,205,1037,205,1037,205,1037,205,1037,205,1037,205,1037,205
DATA 1037,205,1037,205,1037,205,1037,205,1037,205,1037,205,1037,205,1037,205,1037,205,1037,205
DATA 1037,205,1037,205,1037,205,1037,205,1038,205,1038,204,1039,203,1040,200,1040,198,1041,195
DATA 1042,192,1043,188,1044,187,1046,181,1046,180,1047,176,1047,175,1049,171,1051,169,1051,168
DATA 1052,167,1052,166,1052,165,1053,164,1053,164,1053,163,1054,162,1055,161,1055,160,1055,159
DATA 1055,158,1055,157,1056,157,1056,156,1056,155,1056,154,1056,154,1057,153,1057,153,1057,153
DATA 1057,153,1057,153,1057,153,1057,153,1057,153,1057,153,1057,153,1057,153,1057,153,1036,204
DATA 1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204
DATA 1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204
DATA 1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204,1036,204
DATA 1036,204,1036,204,1036,204,1035,207,1035,209,1035,211,1035,214,1034,218,1034,221,1033,225
DATA 1032,229,1031,234,1030,237,1029,241,1028,243,1028,245,1028,246,1027,247,1026,249,1026,250
DATA 1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251
DATA 1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251
DATA 1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251,1026,251
DATA 1026,251,1026,251,1025,252,1024,254,1024,256,1024,257,1024,257,1024,257,1024,257,1024,257
DATA 1024,257,1024,257,1024,257,1024,257,1024,257,1024,257,1024,257,1024,257,1024,257,1024,257
DATA 1024,257,1024,257,843,318,843,318,843,318,843,318,843,318,843,318,843,318,843,318
DATA 843,319,843,319,844,323,845,325,845,334,846,341,846,350,847,363,848,375,848,387
DATA 849,400,850,405,850,408,851,411,851,413,851,414,851,414,851,414,851,414,851,414
DATA 851,414,851,414,851,416,851,416,851,416,851,416,851,416,851,416,831,375,831,375
DATA 831,375,831,375,831,375,831,375,831,375,831,375,832,375,835,375,850,375,866,375
DATA 883,375,891,375,894,375,898,375,899,375,899,375,899,375,899,375,900,375,900,375
DATA 900,375,900,375,900,375,900,375,900,375,900,375,900,375,900,375,931,374,931,374
DATA 931,374,928,377,927,380,924,384,922,387,921,389,921,391,921,394,921,394,923,397
DATA 924,398,924,399,925,400,927,402,928,404,929,405,930,406,930,407,930,407,930,407
DATA 931,407,931,407,933,407,941,405,944,404,946,402,947,401,948,399,948,398,948,397
DATA 948,397,949,395,949,394,949,393,949,392,949,391,949,390,949,389,949,388,949,387
DATA 949,385,949,383,949,383,949,381,948,380,947,380,947,380,947,380,947,380,947,380
DATA 947,380,947,380,947,380,947,380,947,380,947,380,947,380,947,380,947,380,1023,303
DATA 1023,303,1023,303,1022,306,1022,309,1022,314,1022,318,1023,323,1024,332,1025,341,1026,350
DATA 1026,356,1026,361,1027,369,1028,371,1028,373,1028,375,1028,377,1028,380,1028,383,1028,386
DATA 1028,388,1028,391,1028,392,1028,393,1029,393,1029,393,1029,393,1029,393,1029,393,1029,393
DATA 1029,393,1029,393,1029,393,1029,393,1029,393,1029,393,1029,393,1029,395,1029,397,1030,398
DATA 1030,398,1030,398,1030,398,1030,398,1030,398,1030,400,1030,401,1030,403,1030,404,1030,404
DATA 1030,404,1030,404,1030,404,1030,405,1030,405,1030,405,1030,405,1030,405,1030,405,1030,405
DATA 997,352,997,352,997,352,997,352,997,352,997,352,997,352,997,352,997,352,998,352
DATA 1003,352,1011,353,1023,353,1028,352,1030,351,1031,351,1031,351,1031,351,1031,351,1031,351
DATA 1031,351,1031,351,1031,351,1031,351,1031,351,1031,351,1031,351,1032,351,1032,351,1032,351
DATA 1032,351,1032,351,1032,351,1032,351,1032,351,1032,351,1032,351,1032,351,1032,351,1032,351
DATA 1032,351,1032,351,1032,351,1032,351,1032,351,1032,351,1032,351,1032,351,1033,351,1035,351
DATA 1036,350,1037,350,1037,350,1037,350,1038,350,1039,350,1040,350,1041,349,1042,349,1042,349
DATA 1042,349,1042,349,1042,349,1042,349,1042,349,1042,349,1042,349,1042,349,1059,296,1059,296
DATA 1059,296,1059,296,1059,296,1059,296,1059,298,1059,302,1059,305,1059,314,1059,321,1059,327
DATA 1059,333,1059,338,1059,343,1059,347,1059,351,1060,358,1060,364,1060,371,1060,378,1060,384
DATA 1061,389,1061,392,1061,396,1061,398,1062,402,1062,404,1062,404,1062,405,1062,405,1062,405
DATA 1062,405,1062,405,1062,405,1062,405,1062,405,1062,405,1062,405,1062,405,1062,405,1062,405
DATA 1062,405,1062,405,1062,405,1062,405,1062,399,1063,395,1063,391,1064,386,1064,383,1065,376
DATA 1066,370,1067,365,1069,361,1070,358,1072,354,1073,352,1074,351,1074,350,1075,349,1076,349
DATA 1077,348,1078,348,1079,348,1080,348,1081,348,1081,347,1081,347,1081,347,1081,347,1081,349
DATA 1083,352,1085,356,1087,361,1089,367,1090,369,1092,376,1094,378,1094,380,1094,381,1095,384
DATA 1095,386,1095,387,1095,388,1095,389,1095,389,1095,389,1095,389,1095,389,1095,389,1095,389
DATA 1095,389,1095,389,1095,389,1095,389,1095,389,1095,389,1096,391,1096,392,1096,392,1096,393
DATA 1097,393,1098,396,1099,397,1099,397,1099,398,1099,398,1099,398,1099,398,1099,398,1099,398
DATA 1099,398,1099,398,1099,398,1099,398,1099,398,1106,366,1106,366,1106,366,1106,366,1106,366
DATA 1106,366,1106,366,1106,366,1106,366,1106,366,1106,366,1106,366,1106,366,1106,366,1106,366
DATA 1106,366,1110,365,1111,364,1115,364,1118,363,1123,362,1124,362,1125,362,1126,362,1129,361
DATA 1133,360,1137,359,1141,357,1142,356,1142,356,1143,356,1143,354,1144,353,1145,352,1146,350
DATA 1146,349,1146,348,1146,347,1146,347,1146,347,1146,347,1146,347,1146,347,1146,347,1145,346
DATA 1141,345,1138,344,1137,344,1135,344,1134,344,1132,344,1129,346,1126,347,1122,348,1119,350
DATA 1117,351,1117,352,1116,353,1113,357,1111,360,1110,363,1109,366,1108,368,1107,372,1106,377
DATA 1106,378,1106,382,1106,384,1106,386,1106,388,1106,389,1106,390,1108,390,1108,391,1109,391
DATA 1114,392,1120,393,1129,393,1139,393,1147,393,1152,392,1158,391,1163,389,1164,389,1169,386
DATA 1172,385,1175,383,1176,383,1177,381,1177,381,1177,381,1177,381,1177,381,1177,381,1177,381
DATA 1177,381,1177,381,1177,381,1177,381,1177,381,1177,381,1177,381,1177,381,797,495,797,495
DATA 797,495,797,495,797,495,797,495,797,495,797,495,797,495,797,499,800,507,802,517
DATA 804,526,811,542,816,554,820,563,822,569,825,575,826,581,827,583,828,590,829,595
DATA 830,598,831,602,832,608,832,609,834,614,834,618,835,620,837,623,838,624,838,624
DATA 840,624,841,619,843,613,845,607,847,601,849,595,852,585,854,580,856,575,858,570
DATA 859,564,861,560,864,552,865,548,866,544,867,540,869,534,870,529,873,522,873,516
DATA 876,509,877,503,878,500,879,498,879,496,879,496,879,496,879,496,879,496,879,496
DATA 879,496,879,496,879,496,879,496,879,496,879,496,879,496,880,500,881,507,883,516
DATA 884,527,885,538,889,550,891,557,892,562,894,568,894,569,896,575,896,576,896,580
DATA 897,581,898,585,898,587,900,590,902,594,904,596,906,599,907,600,908,601,909,602
DATA 911,604,911,606,912,606,912,606,912,606,913,606,913,606,913,606,913,606,913,606
DATA 914,606,914,606,915,606,915,606,916,606,916,606,916,606,917,606,917,606,918,607
DATA 920,609,920,610,920,610,920,610,920,610,920,610,920,610,921,610,921,610,921,609
DATA 924,600,925,595,926,588,927,581,928,573,930,565,931,550,932,538,932,530,933,522
DATA 934,515,936,509,936,506,936,504,936,503,937,502,937,501,937,500,937,499,937,498
DATA 937,498,937,498,937,498,937,498,937,498,937,498,937,498,937,498,937,498,937,498
DATA 937,498,937,498,937,498,937,498,937,498,989,563,989,563,988,562,988,562,987,562
DATA 985,562,983,563,981,564,977,569,975,572,973,573,970,577,968,582,967,585,966,588
DATA 966,590,966,593,966,596,966,599,967,601,968,603,969,605,971,607,972,609,974,612
DATA 975,614,976,615,977,615,977,615,977,615,977,615,980,613,985,609,989,606,992,603
DATA 994,600,994,599,997,596,997,594,999,591,1000,590,1001,587,1003,584,1004,582,1004,580
DATA 1005,579,1005,577,1005,574,1005,573,1005,571,1005,570,1005,569,1005,568,1005,568,1005,567
DATA 1005,566,1005,566,1004,566,1004,566,1004,566,1004,566,1003,563,999,561,998,560,998,560
DATA 998,560,998,560,998,560,998,560,998,560,998,560,1028,562,1028,562,1028,562,1028,562
DATA 1027,562,1027,563,1027,564,1026,566,1026,567,1026,571,1026,574,1028,581,1030,585,1033,590
DATA 1035,594,1036,597,1037,599,1038,600,1038,600,1038,600,1038,600,1038,600,1038,600,1038,600
DATA 1038,600,1038,600,1038,599,1038,599,1038,599,1038,599,1038,597,1037,591,1036,589,1035,583
DATA 1035,581,1034,577,1034,575,1034,572,1034,568,1034,566,1034,564,1034,563,1034,561,1034,560
DATA 1035,560,1036,559,1037,558,1037,558,1037,558,1037,558,1037,558,1038,558,1038,557,1038,557
DATA 1041,557,1043,556,1044,555,1044,555,1044,555,1044,555,1044,555,1044,555,1044,555,1044,555
DATA 1044,555,1044,555,1044,555,1071,499,1071,499,1071,499,1071,499,1071,499,1071,507,1071,512
DATA 1071,518,1071,525,1071,532,1071,539,1072,546,1074,554,1074,561,1075,566,1077,574,1078,580
DATA 1079,585,1080,588,1080,590,1081,593,1081,593,1081,594,1081,594,1081,594,1081,594,1081,594
DATA 1081,596,1082,597,1082,599,1082,600,1082,601,1083,602,1083,603,1083,603,1083,603,1083,603
DATA 1083,603,1083,604,1083,605,1084,605,1084,605,1084,605,1084,605,1084,605,1159,563,1159,563
DATA 1158,563,1158,563,1155,561,1153,560,1148,559,1147,559,1139,559,1135,559,1132,560,1131,561
DATA 1130,562,1129,565,1128,567,1127,569,1127,573,1126,576,1126,580,1126,583,1125,587,1125,591
DATA 1125,595,1126,601,1128,604,1130,605,1132,607,1133,609,1136,611,1138,612,1139,612,1140,612
DATA 1145,609,1151,603,1155,601,1158,598,1161,595,1164,594,1166,592,1167,589,1169,585,1171,581
DATA 1172,576,1172,573,1172,570,1172,568,1172,564,1172,561,1172,558,1171,554,1170,548,1170,542
DATA 1170,537,1170,531,1169,526,1169,521,1168,517,1167,509,1167,505,1167,502,1167,497,1167,493
DATA 1167,491,1167,489,1167,487,1167,487,1167,487,1167,486,1167,485,1167,484,1167,482,1167,480
DATA 1167,479,1167,477,1167,476,1167,475,1167,475,1167,475,1167,475,1167,475,1167,475,1167,475
DATA 1167,475,1167,475,1167,475,1167,476,1167,480,1167,487,1167,492,1168,497,1169,505,1170,511
DATA 1171,518,1174,524,1176,536,1177,542,1178,548,1180,553,1181,558,1182,562,1183,567,1184,572
DATA 1185,577,1187,584,1188,589,1189,592,1190,595,1190,598,1191,601,1191,603,1192,604,1192,605
DATA 1193,606,1193,607,1194,608,1194,609,1194,609,1195,611,1195,611,1195,612,1195,613,1196,613
DATA 1196,613,1196,613,1196,613,1196,613,1196,613,1196,613,1196,613,1196,613,1196,613,1196,613
DATA 1196,613,1196,613,1196,613,1196,613,1196,613,1196,613,1131,51,1131,51,1131,51,1131,51
DATA 1131,51,1131,51,1131,52,1131,56,1131,61,1131,71,1131,79,1131,89,1131,97,1130,106
DATA 1130,112,1130,117,1130,122,1130,122,1130,129,1130,131,1130,134,1129,136,1129,141,1128,147
DATA 1127,160,1126,164,1126,174,1126,180,1126,183,1126,183,1126,183,1125,183,1125,183,1125,183
DATA 1125,183,1125,183,1125,183,1125,183,1125,183,1125,183,1125,183,1125,183,1125,183,1125,183
DATA 1118,232,1118,232,1118,232,1118,232,1118,232,1118,232,1118,232,1118,232,1118,232,1118,232
DATA 1118,232
DATA 9999,9999