Author Topic: Star Backgound  (Read 21255 times)

0 Members and 1 Guest are viewing this topic.

Offline johnno56

  • Forum Resident
  • Posts: 1270
  • Live long and prosper.
Re: Star Backgound
« Reply #15 on: June 11, 2018, 06:56:02 am »
Not a problem. It's an image I through together using Gimp. Enjoy.

J
Logic is the beginning of wisdom.

Offline Ashish

  • Forum Resident
  • Posts: 630
  • Never Give Up!
Re: Star Backgound
« Reply #16 on: June 16, 2018, 12:29:57 pm »
+[banned user]
Its cool to see spaceship running!
if (Me.success) {Me.improve()} else {Me.tryAgain()}


My Projects - https://github.com/AshishKingdom?tab=repositories
OpenGL tutorials - https://ashishkingdom.github.io/OpenGL-Tutorials

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
Re: Star Backgound
« Reply #17 on: June 16, 2018, 01:02:01 pm »
Nice one [banned user]! Just like coming home again!

BTW, weren't you already a member here??? eg post in this thread June 11???
« Last Edit: June 16, 2018, 01:05:29 pm by bplus »

Offline johnno56

  • Forum Resident
  • Posts: 1270
  • Live long and prosper.
Re: Star Backgound
« Reply #18 on: June 16, 2018, 06:06:18 pm »
Just a couple of things...

Firsly, VERY cool demo...

Can I assume correctly that QB64's default transparency colour is black? If so, a couple of the planets, have transparent 'patches'... If you like I can fix that... and one of the 'Mars' images is upside down... I can fix that too if you wish... I have limited time today (Sunday), as we will be out most of the day, but I can make the changes later this afternoon if that's ok?

Other than these few 'cosmetic' effects the demo ran very smoothly... I like it!!!

J

ps: Never mind about Mars. Ran the demo longer and notice the image was 'flipped'....
« Last Edit: June 16, 2018, 06:10:24 pm by johnno56 »
Logic is the beginning of wisdom.

Offline Ashish

  • Forum Resident
  • Posts: 630
  • Never Give Up!
Re: Star Backgound
« Reply #19 on: June 17, 2018, 02:19:06 am »
Hi [banned user]!
Here's my fire MOD to your spaceship. :)
The amount of flame vary with speed of spaceship.

Code: QB64: [Select]
  1.  
  2. 'Original by [banned user]
  3. 'Fire MOD by Ashish
  4. _TITLE "Space the Final Frontier [Fire MOD]"
  5.  
  6.  
  7. DIM SHARED fireSizeX, fireSizeY
  8. fireSizeX = 120
  9. fireSizeY = 19
  10. DIM SHARED fireBuffer(fireSizeX, fireSizeY), colorPal(255) AS _UNSIGNED LONG, fuelControl
  11. fuelControl = 0.23
  12. 'creating our palette for fire
  13. FOR i = 255 TO 0 STEP -1
  14.     IF i <= 255 AND i >= 200 THEN 'white to yellow
  15.         colorPal(i) = _RGB32(map(i, 255, 200, 255, 255), map(i, 255, 200, 255, 242), map(i, 255, 200, 255, 0))
  16.     ELSEIF i <= 201 AND i >= 79 THEN 'yellow to orange
  17.         colorPal(i) = _RGB32(map(i, 201, 79, 255, 221), map(i, 201, 79, 242, 140), map(i, 201, 79, 0, 0))
  18.     ELSEIF i <= 89 AND i >= 79 THEN 'orange to dark orange red
  19.         colorPal(i) = _RGB32(map(i, 89, 79, 221, 183), map(i, 89, 79, 140, 45), map(i, 89, 79, 0, 0))
  20.     ELSEIF i <= 78 AND i >= 0 THEN 'dark orange red to transparent
  21.         colorPal(i) = _RGBA32(map(i, 78, 0, 183, 0), map(i, 78, 0, 45, 0), map(i, 78, 0, 0, 0), map(i, 78, 0, 255, 0))
  22.     END IF
  23.  
  24.  
  25. DIM Touch AS STRING
  26.  
  27. DIM SHARED frameRate AS INTEGER
  28. DIM SHARED frameCount AS INTEGER
  29.  
  30. DIM SHARED frameTime AS STRING
  31. frameTime = RIGHT$(TIME$, 2)
  32.  
  33. ' \/\/\/\/\/\/\/\/\/\/\/\/
  34. ' Screen Width and Height
  35. ' /\/\/\/\/\/\/\/\/\/\/\/\
  36. sWidth = 800
  37. sHeight = 600
  38.  
  39. SCREEN _NEWIMAGE(sWidth, sHeight, 32)
  40.  
  41. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  42. ' Stars Background and the Starship
  43. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  44. DIM SHARED starBack AS LONG
  45. DIM SHARED Starship AS LONG
  46.  
  47. ' Stars Background:
  48. ' https://www.qb64.org/forum/index.php?PHPSESSID=fe200737599194549d14a890bf46be14&topic=250.0
  49. starBack = _LOADIMAGE(".\images\Stars.png")
  50. _PUTIMAGE (0, 0), starBack
  51.  
  52. ' Starship:
  53. ' http://www.clipartlord.com/category/space-clip-art/spaceship-clip-art/
  54. Starship = _LOADIMAGE(".\images\Starship.png")
  55. _CLEARCOLOR _RGB(0, 0, 0), Starship
  56.  
  57. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  58. ' Used to make sure Starship doesn't go offscreen
  59. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  60. wShip = sWidth - 400
  61. hShip = sHeight - 170
  62.  
  63. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/
  64. ' Starship Location (Centered)
  65. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\
  66. shipX = sWidth \ 2 - 200
  67. shipY = sHeight \ 2 - 85
  68.  
  69. ' \/\/\/\/\/\/\/\/\/\/\/
  70. ' Speed of the Starship
  71. ' /\/\/\/\/\/\/\/\/\/\/\
  72. DIM SHARED warpSpeed AS INTEGER
  73. warpSpeed = 2
  74.  
  75. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  76. ' Celestial Objects (Stars and Planets)
  77. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  78. TYPE Celestial
  79.     ' Location
  80.     x AS INTEGER
  81.     y AS INTEGER
  82.  
  83.     ' Size
  84.     w AS INTEGER
  85.     h AS INTEGER
  86.  
  87.     ' Rotation
  88.     c AS INTEGER
  89.     r AS INTEGER
  90.  
  91.     ' Planet used
  92.     used AS INTEGER
  93.  
  94.     ' Planet Spins
  95.     spin AS INTEGER
  96.  
  97.     image AS LONG
  98.  
  99. ' \/\/\/\/\/\/\/\/
  100. ' Stars Background
  101. ' /\/\/\/\/\/\/\/\
  102. DIM SHARED Stars(2) AS Celestial
  103.  
  104. Stars(1).x = 0
  105. Stars(2).x = 800
  106.  
  107. Stars(1).image = _NEWIMAGE(800, 600, 32)
  108. _PUTIMAGE (0, 0), starBack, Stars(1).image
  109.  
  110. Stars(2).image = _NEWIMAGE(800, 600, 32)
  111. Frontier
  112.  
  113. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  114. ' Display text while Planets load
  115. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  116. Touch = "Loading Planet Data...."
  117.  
  118. y = sHeight \ 2 - 8
  119. x = sWidth \ 2 - (LEN(Touch) * 4)
  120. _PRINTSTRING (x, y), Touch
  121.  
  122. DIM SHARED PlanetView(4) AS INTEGER
  123.  
  124. DIM SHARED Planet(40) AS Celestial
  125.  
  126. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  127. ' Load all the planets (40 total)
  128. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  129. FOR p = 1 TO 40
  130.     ' Planets:
  131.     ' http://www.clipartlord.com/category/space-clip-art/planets-clip-art/
  132.     Planet(p).image = _LOADIMAGE(".\images\Planet" + RIGHT$("0" + LTRIM$(STR$(p)), 2) + ".png")
  133.     _CLEARCOLOR _RGB(0, 0, 0), Planet(p).image
  134.  
  135.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  136.     ' Get the Width and Height of the planet
  137.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  138.     Planet(p).w = _WIDTH(Planet(p).image)
  139.     Planet(p).h = _HEIGHT(Planet(p).image)
  140.  
  141. ' \/\/\/\/\/\/\/\/\/\/\/\/\/
  142. ' Starship enters the scene
  143. ' /\/\/\/\/\/\/\/\/\/\/\/\/\
  144. FOR x = -400 TO shipX STEP 10
  145.     'fire
  146.     FOR fy = 3 TO fireSizeY - 2
  147.         fireBuffer(fireSizeX - 2, fy) = INT(RND * 128) + 128
  148.     NEXT
  149.     FOR fy = 3 TO fireSizeY - 2
  150.         FOR fx = 0 TO fireSizeX - 2
  151.             fireBuffer(fx, fy) = (fireBuffer(fx + 1, fy - 1) + fireBuffer(fx + 1, fy) + fireBuffer(fx + 2, fy) + fireBuffer(fx + 1, fy + 1)) * (fuelControl + .018327)
  152.     NEXT fx, fy
  153.  
  154.     _PUTIMAGE (0, 0), starBack
  155.  
  156.     'rendering fire
  157.     FOR fy = 0 TO fireSizeY
  158.         FOR fx = 0 TO fireSizeX
  159.             'PRINT INT(fireBuffer(fx, fy))
  160.             PSET (fx + x + 115 - fireSizeX + 2, fy + shipY + 100), colorPal(INT(fireBuffer(fx, fy)))
  161.     NEXT fx, fy
  162.  
  163.     _PUTIMAGE (x, shipY), Starship
  164.  
  165.     _DISPLAY
  166.     _LIMIT 30
  167.  
  168. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  169. ' Show the animations until ESC is pressed
  170. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  171. WHILE Touch <> CHR$(27)
  172.     Background
  173.  
  174.  
  175.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  176.     ' Checks to see if a key is pressed
  177.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  178.     Touch = INKEY$
  179.     IF Touch <> "" THEN
  180.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  181.         ' Keys 0-9 changes the warpspeed
  182.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  183.         IF ASC(Touch) > 47 AND ASC(Touch) < 58 THEN warpSpeed = VAL(Touch)
  184.  
  185.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  186.         ' Home key centers the Starship
  187.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  188.         IF Touch = CHR$(0) + CHR$(71) THEN
  189.             shipX = sWidth \ 2 - 200
  190.             shipY = sHeight \ 2 - 85
  191.         END IF
  192.  
  193.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  194.         ' Up and Down Arrow Keys moves the Starship
  195.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  196.         IF Touch = CHR$(0) + CHR$(72) THEN
  197.             shipY = shipY - warpSpeed
  198.             IF shipY < 0 THEN shipY = 0
  199.         END IF
  200.  
  201.         IF Touch = CHR$(0) + CHR$(80) THEN
  202.             shipY = shipY + warpSpeed
  203.             IF shipY > hShip THEN shipY = hShip
  204.         END IF
  205.     END IF
  206.  
  207.     Framed
  208.  
  209.     _DISPLAY
  210.     _LIMIT 60
  211.  
  212. SUB Background
  213.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/
  214.     ' Places the stars Backgrounds
  215.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\
  216.     _PUTIMAGE (Stars(1).x, 0), Stars(1).image
  217.     _PUTIMAGE (Stars(2).x, 0), Stars(2).image
  218.  
  219.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  220.     ' Show planet(s)  (if available)
  221.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  222.     FOR v = 1 TO 2
  223.         IF PlanetView(v) > 0 THEN
  224.             ViewPlanet PlanetView(v), v
  225.         END IF
  226.     NEXT
  227.     acc = (warpSpeed + 1) * .001905#
  228.     'fire
  229.     FOR fy = 3 TO fireSizeY - 2
  230.         fireBuffer(fireSizeX - 2, fy) = INT(RND * 128) + 128
  231.     NEXT
  232.     FOR fy = 3 TO fireSizeY - 2
  233.         FOR fx = 0 TO fireSizeX - 2
  234.             fireBuffer(fx, fy) = (fireBuffer(fx + 1, fy - 1) + fireBuffer(fx + 1, fy) + fireBuffer(fx + 2, fy) + fireBuffer(fx + 1, fy + 1)) * (fuelControl + acc)
  235.     NEXT fx, fy
  236.     'rendering fire
  237.     FOR fy = 0 TO fireSizeY
  238.         FOR fx = 0 TO fireSizeX
  239.             'PRINT INT(fireBuffer(fx, fy))
  240.             PSET (fx + shipX + 115 - fireSizeX + 2, fy + shipY + 100), colorPal(INT(fireBuffer(fx, fy)))
  241.     NEXT fx, fy
  242.  
  243.  
  244.     ' \/\/\/\/\/\/\/\/\/
  245.     ' Show the Starship
  246.     ' /\/\/\/\/\/\/\/\/\
  247.     _PUTIMAGE (shipX, shipY), Starship
  248.  
  249.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  250.     ' Have the background shift left by warpspeed
  251.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  252.     Stars(1).x = Stars(1).x - warpSpeed
  253.     Stars(2).x = Stars(2).x - warpSpeed
  254.  
  255.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  256.     ' When the background reaches the end reset background
  257.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  258.     IF Stars(2).x < 0 THEN
  259.         Stars(1).x = 0
  260.         Stars(2).x = 800
  261.  
  262.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  263.         ' Put the second image on the first to keep the animation proper
  264.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  265.         _PUTIMAGE (0, 0), Stars(2).image, Stars(1).image
  266.  
  267.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/
  268.         ' Add Planets to the animation
  269.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\
  270.         Frontier
  271.     END IF
  272.  
  273. SUB Frontier
  274.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  275.     ' Reset the background and rotate to make things different
  276.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  277.     SELECT CASE INT(4 * RND)
  278.         CASE 0: _PUTIMAGE (0, 0), starBack, Stars(2).image
  279.         CASE 1: _PUTIMAGE (799, 0)-(0, 599), starBack, Stars(2).image
  280.         CASE 2: _PUTIMAGE (0, 599)-(799, 0), starBack, Stars(2).image
  281.         CASE 3: _PUTIMAGE (799, 599)-(0, 0), starBack, Stars(2).image
  282.     END SELECT
  283.  
  284.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/
  285.     ' Choose a Planet to display
  286.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\
  287.     tag1:
  288.     p1 = INT(40 * RND) + 1
  289.     IF Planet(p1).used = 1 THEN GOTO tag1
  290.  
  291.     ' \/\/\/\/\/\/\/\/\/\/\/\/
  292.     ' Get the Width and Height
  293.     ' /\/\/\/\/\/\/\/\/\/\/\/\
  294.     w = Planet(p1).w
  295.     h = Planet(p1).h
  296.  
  297.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  298.     ' Make sure planet isn't going off the screen
  299.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  300.     x1 = INT((sWidth - w) * RND)
  301.     y1 = INT((sHeight - h) * RND)
  302.  
  303.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  304.     ' Set the Planet as used and save the location
  305.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  306.     IF PlanetView(1) = 0 THEN
  307.         PlanetView(1) = p1
  308.         'ELSE
  309.         '  PlanetView(3) = p1
  310.     END IF
  311.  
  312.     Planet(p1).x = 800 + x1
  313.     Planet(p1).y = y1
  314.  
  315.     Planet(p1).used = 1
  316.     Planet(p1).spin = INT(2 * RND)
  317.  
  318.     IF INT(2 * RND) = 1 THEN
  319.         tag2:
  320.         p2 = INT(40 * RND) + 1
  321.         IF Planet(p2).used = 1 THEN GOTO tag2
  322.  
  323.         w = Planet(p2).w
  324.         h = Planet(p2).h
  325.  
  326.         IF p2 <> p1 THEN
  327.             IF w < Planet(p1).w AND h < Planet(p1).h THEN
  328.                 x2 = INT((sWidth - w) * RND)
  329.                 y2 = INT((sHeight - h) * RND)
  330.             END IF
  331.         END IF
  332.  
  333.         IF PlanetView(2) = 0 THEN
  334.             PlanetView(2) = p2
  335.             'ELSE
  336.             '  PlanetView(4) = p2
  337.         END IF
  338.  
  339.         Planet(p2).x = 800 + x2
  340.         Planet(p2).y = y2
  341.  
  342.         Planet(p2).used = 1
  343.         Planet(p2).spin = INT(2 * RND)
  344.     END IF
  345.  
  346. SUB ViewPlanet (p, v)
  347.     'w = Planet(p).w
  348.  
  349.     'x = Planet(p).x
  350.     'y = Planet(p).y
  351.     '_PUTIMAGE (x, y), Planet(p).image, 0
  352.  
  353.     'x = x - 2
  354.     'Planet(p).x = x
  355.     '_PRINTSTRING (4, sHeight \ 2 - 8), STR$(x) + "    "
  356.  
  357.     'IF x + w < 0 THEN
  358.     '  BEEP
  359.     '  PlanetView(v) = 0
  360.     '  Planet(p).used = 0
  361.     'END IF
  362.     'EXIT SUB
  363.  
  364.     w = Planet(p).w
  365.     h = Planet(p).h
  366.  
  367.     x1 = Planet(p).x
  368.     x2 = Planet(p).x + w
  369.  
  370.     y1 = Planet(p).y
  371.     y2 = Planet(p).y + h
  372.  
  373.     SELECT CASE Planet(p).r
  374.         CASE 0: _PUTIMAGE (x1, y1), Planet(p).image, 0
  375.         CASE 1: _PUTIMAGE (x2, y1)-(x1, y2), Planet(p).image, 0
  376.         CASE 2: _PUTIMAGE (x1, y2)-(x2, y1), Planet(p).image, 0
  377.         CASE 3: _PUTIMAGE (x2, y2)-(x1, y1), Planet(p).image, 0
  378.     END SELECT
  379.  
  380.     IF Planet(p).spin = 1 THEN
  381.         Planet(p).c = Planet(p).c + 1
  382.  
  383.         IF Planet(p).c = 16 THEN
  384.             Planet(p).c = 0
  385.  
  386.             Planet(p).r = Planet(p).r + 1
  387.             IF Planet(p).r > 3 THEN Planet(p).r = 0
  388.         END IF
  389.     END IF
  390.  
  391.     x1 = x1 - warpSpeed
  392.     Planet(p).x = x1
  393.  
  394.     IF x2 < 0 THEN
  395.         PlanetView(v) = 0
  396.         Planet(p).used = 0
  397.     END IF
  398.  
  399. SUB Framed
  400.     IF RIGHT$(TIME$, 1) = frameTime THEN
  401.         frameCount = frameCount + 1
  402.     ELSE
  403.         frameRate = frameCount
  404.  
  405.         frameCount = 0
  406.         frameTime = RIGHT$(TIME$, 1)
  407.     END IF
  408.  
  409.     _PRINTSTRING (4, 8), STR$(frameRate)
  410.  
  411.  
  412. 'from p5js.bas
  413. FUNCTION map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)
  414.     map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!
  415.  
  416.  
if (Me.success) {Me.improve()} else {Me.tryAgain()}


My Projects - https://github.com/AshishKingdom?tab=repositories
OpenGL tutorials - https://ashishkingdom.github.io/OpenGL-Tutorials

Offline Petr

  • Forum Resident
  • Posts: 1720
  • The best code is the DNA of the hops.
Re: Star Backgound
« Reply #20 on: June 17, 2018, 05:07:42 am »
Very nice original by [banned user] and also modification by Ashish! :-D

Offline johnno56

  • Forum Resident
  • Posts: 1270
  • Live long and prosper.
Re: Star Backgound
« Reply #21 on: June 17, 2018, 05:11:38 am »
Ok. I have modified ALL of the images. All images now have a transparent background and all 'black' has been replaced by a complimentary colour. All images resized and centered. I ran the program with the modified images and everything looks fine. No missing patches... Cool.

BUT... In the meantime... 'Rotating' planets has been introduced... All of the modified spherical planets 'rotate' just fine. All that have rings look weird when rotating. Suggest that these planets do not rotate.

I have some ideas for rotating ringed planets but it may take some time to work on them.

I have attached all of the modified images. Make a backup copy of the originals then replace them with these....

J

ps: "Attachments and other options" does NOT include a browse to file. I will attempt to include a link. I hope I get this right...

https://www.dropbox.com/s/zgpmn9ly4tnp3bx/planets.zip?dl=0
Logic is the beginning of wisdom.

FellippeHeitor

  • Guest
Re: Star Backgound
« Reply #22 on: June 17, 2018, 10:13:57 am »
Great job, [banned user]. And welcome back to the forum.

Ashish's fire mod definitely adds a fine touch here too.

Here's my humble contribution to the y-axis movement (up/down arrows):
Code: QB64: [Select]
  1. _TITLE "Space the Final Frontier"
  2.  
  3. CONST true = -1, false = NOT true
  4. DIM Touch AS STRING
  5.  
  6. DIM SHARED frameRate AS INTEGER
  7. DIM SHARED frameCount AS INTEGER
  8.  
  9. DIM SHARED frameTime AS STRING
  10. frameTime = RIGHT$(TIME$, 2)
  11.  
  12. DIM SHARED modFire AS _BYTE
  13. modFire = true
  14.  
  15. DIM SHARED fireSizeX, fireSizeY
  16. fireSizeX = 120
  17. fireSizeY = 19
  18.  
  19. DIM SHARED fireBuffer(fireSizeX, fireSizeY), colorPal(255) AS _UNSIGNED LONG, fuelControl
  20. fuelControl = 0.23
  21.  
  22. 'creating our palette for fire
  23. FOR i = 255 TO 0 STEP -1
  24.     IF i <= 255 AND i >= 200 THEN 'white to yellow
  25.         colorPal(i) = _RGB32(map(i, 255, 200, 255, 255), map(i, 255, 200, 255, 242), map(i, 255, 200, 255, 0))
  26.     ELSEIF i <= 201 AND i >= 79 THEN 'yellow to orange
  27.         colorPal(i) = _RGB32(map(i, 201, 79, 255, 221), map(i, 201, 79, 242, 140), map(i, 201, 79, 0, 0))
  28.     ELSEIF i <= 89 AND i >= 79 THEN 'orange to dark orange red
  29.         colorPal(i) = _RGB32(map(i, 89, 79, 221, 183), map(i, 89, 79, 140, 45), map(i, 89, 79, 0, 0))
  30.     ELSEIF i <= 78 AND i >= 0 THEN 'dark orange red to transparent
  31.         colorPal(i) = _RGBA32(map(i, 78, 0, 183, 0), map(i, 78, 0, 45, 0), map(i, 78, 0, 0, 0), map(i, 78, 0, 255, 0))
  32.     END IF
  33.  
  34. ' \/\/\/\/\/\/\/\/\/\/\/\/
  35. ' Screen Width and Height
  36. ' /\/\/\/\/\/\/\/\/\/\/\/\
  37. sWidth = 800
  38. sHeight = 600
  39.  
  40. SCREEN _NEWIMAGE(sWidth, sHeight, 32)
  41.  
  42. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  43. ' Stars Background and the Starship
  44. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  45. DIM SHARED starBack AS LONG
  46. DIM SHARED Starship AS LONG
  47.  
  48. ' Stars Background:
  49. ' https://www.qb64.org/forum/index.php?PHPSESSID=fe200737599194549d14a890bf46be14&topic=250.0
  50. starBack = _LOADIMAGE(".\images\Stars.png")
  51. _PUTIMAGE (0, 0), starBack
  52.  
  53. ' Starship:
  54. ' http://www.clipartlord.com/category/space-clip-art/spaceship-clip-art/
  55. Starship = _LOADIMAGE(".\images\Starship.png")
  56. _CLEARCOLOR _RGB(0, 0, 0), Starship
  57.  
  58. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  59. ' Used to make sure Starship doesn't go offscreen
  60. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  61. wShip = sWidth - 400
  62. hShip = sHeight - 170
  63.  
  64. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/
  65. ' Starship Location (Centered)
  66. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\
  67. shipX = sWidth \ 2 - 200
  68. shipY = sHeight \ 2 - 85
  69.  
  70. ' \/\/\/\/\/\/\/\/\/\/\/
  71. ' Speed of the Starship
  72. ' /\/\/\/\/\/\/\/\/\/\/\
  73. DIM SHARED warpSpeed AS INTEGER
  74. warpSpeed = 2
  75.  
  76. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  77. ' Celestial Objects (Stars and Planets)
  78. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  79. TYPE Celestial
  80.     ' Location
  81.     x AS INTEGER
  82.     y AS INTEGER
  83.  
  84.     ' Size
  85.     w AS INTEGER
  86.     h AS INTEGER
  87.  
  88.     ' Rotation
  89.     c AS INTEGER
  90.     r AS INTEGER
  91.  
  92.     ' Planet used
  93.     used AS INTEGER
  94.  
  95.     ' Planet Spins
  96.     spin AS INTEGER
  97.  
  98.     image AS LONG
  99.  
  100. ' \/\/\/\/\/\/\/\/
  101. ' Stars Background
  102. ' /\/\/\/\/\/\/\/\
  103. DIM SHARED Stars(2) AS Celestial
  104.  
  105. Stars(1).x = 0
  106. Stars(2).x = 800
  107.  
  108. Stars(1).image = _NEWIMAGE(800, 600, 32)
  109. _PUTIMAGE (0, 0), starBack, Stars(1).image
  110.  
  111. Stars(2).image = _NEWIMAGE(800, 600, 32)
  112. Starfield
  113. Frontier
  114.  
  115. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  116. ' Display text while Planets load
  117. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  118. Touch = "Loading Planet Data...."
  119.  
  120. y = sHeight \ 2 - 8
  121. x = sWidth \ 2 - (LEN(Touch) * 4)
  122. _PRINTSTRING (x, y), Touch
  123.  
  124. DIM SHARED PlanetView(4) AS INTEGER
  125.  
  126. DIM SHARED Planet(40) AS Celestial
  127.  
  128. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  129. ' Load all the planets (40 total)
  130. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  131. FOR p = 1 TO 40
  132.     ' Planets:
  133.     ' http://www.clipartlord.com/category/space-clip-art/planets-clip-art/
  134.     Planet(p).image = _LOADIMAGE(".\images\Planet" + RIGHT$("0" + LTRIM$(STR$(p)), 2) + ".png")
  135.     _CLEARCOLOR _RGB(0, 0, 0), Planet(p).image
  136.  
  137.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  138.     ' Get the Width and Height of the planet
  139.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  140.     Planet(p).w = _WIDTH(Planet(p).image)
  141.     Planet(p).h = _HEIGHT(Planet(p).image)
  142.  
  143. ' \/\/\/\/\/\/\/\/\/\/\/\/\/
  144. ' Starship enters the scene
  145. ' /\/\/\/\/\/\/\/\/\/\/\/\/\
  146. FOR x = -400 TO shipX STEP 10
  147.     IF modFire THEN
  148.         'fire
  149.         FOR fy = 3 TO fireSizeY - 2
  150.             fireBuffer(fireSizeX - 2, fy) = INT(RND * 128) + 128
  151.         NEXT
  152.         FOR fy = 3 TO fireSizeY - 2
  153.             FOR fx = 0 TO fireSizeX - 2
  154.                 fireBuffer(fx, fy) = (fireBuffer(fx + 1, fy - 1) + fireBuffer(fx + 1, fy) + fireBuffer(fx + 2, fy) + fireBuffer(fx + 1, fy + 1)) * (fuelControl + .018327)
  155.         NEXT fx, fy
  156.     END IF
  157.  
  158.     _PUTIMAGE (0, 0), starBack
  159.  
  160.     IF modFire THEN
  161.         'rendering fire
  162.         FOR fy = 0 TO fireSizeY
  163.             FOR fx = 0 TO fireSizeX
  164.                 'PRINT INT(fireBuffer(fx, fy))
  165.                 PSET (fx + x + 115 - fireSizeX + 2, fy + shipY + 100), colorPal(INT(fireBuffer(fx, fy)))
  166.         NEXT fx, fy
  167.     END IF
  168.  
  169.     _PUTIMAGE (x, shipY), Starship
  170.  
  171.     _DISPLAY
  172.     _LIMIT 30
  173.  
  174. ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  175. ' Show the animations until ESC is pressed
  176. ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  177. WHILE Touch <> CHR$(27)
  178.     Background
  179.  
  180.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  181.     ' Checks to see if a key is pressed
  182.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  183.     Touch = INKEY$
  184.     IF Touch <> "" THEN
  185.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  186.         ' Keys 0-9 changes the warpspeed
  187.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  188.         IF ASC(Touch) > 47 AND ASC(Touch) < 58 THEN warpSpeed = VAL(Touch)
  189.  
  190.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/
  191.         ' M key will add the fire mod
  192.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\
  193.         IF UCASE$(Touch) = "M" THEN
  194.             modFire = NOT modFire
  195.         END IF
  196.  
  197.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  198.         ' Home key centers the Starship
  199.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  200.         IF Touch = CHR$(0) + CHR$(71) THEN
  201.             shipX = sWidth \ 2 - 200
  202.             shipY = sHeight \ 2 - 85
  203.         END IF
  204.  
  205.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  206.         ' Up and Down Arrow Keys moves the Starship
  207.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  208.         IF Touch = CHR$(0) + CHR$(72) THEN
  209.             yMovement = -3
  210.         END IF
  211.  
  212.         IF Touch = CHR$(0) + CHR$(80) THEN
  213.             yMovement = 3
  214.         END IF
  215.     END IF
  216.  
  217.     shipY = shipY + yMovement
  218.     IF yMovement > 0.5 THEN yMovement = yMovement - .05
  219.     IF yMovement < -0.5 THEN yMovement = yMovement + .05
  220.  
  221.     'Framed
  222.  
  223.     _DISPLAY
  224.     _LIMIT 60
  225.  
  226. FUNCTION map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)
  227.     map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!
  228.  
  229. SUB Background
  230.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/
  231.     ' Places the stars Backgrounds
  232.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\
  233.     _PUTIMAGE (Stars(1).x, 0), Stars(1).image
  234.     _PUTIMAGE (Stars(2).x, 0), Stars(2).image
  235.  
  236.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  237.     ' Show planet(s)  (if available)
  238.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  239.     FOR v = 1 TO 2
  240.         IF PlanetView(v) > 0 THEN
  241.             ViewPlanet PlanetView(v), v
  242.         END IF
  243.     NEXT
  244.  
  245.     IF modFire THEN
  246.         acc = (warpSpeed + 1) * .001905#
  247.  
  248.         'fire
  249.         FOR fy = 3 TO fireSizeY - 2
  250.             fireBuffer(fireSizeX - 2, fy) = INT(RND * 128) + 128
  251.         NEXT
  252.  
  253.         FOR fy = 3 TO fireSizeY - 2
  254.             FOR fx = 0 TO fireSizeX - 2
  255.                 fireBuffer(fx, fy) = (fireBuffer(fx + 1, fy - 1) + fireBuffer(fx + 1, fy) + fireBuffer(fx + 2, fy) + fireBuffer(fx + 1, fy + 1)) * (fuelControl + acc)
  256.         NEXT fx, fy
  257.  
  258.         'rendering fire
  259.         FOR fy = 0 TO fireSizeY
  260.             FOR fx = 0 TO fireSizeX
  261.                 'PRINT INT(fireBuffer(fx, fy))
  262.                 PSET (fx + shipX + 115 - fireSizeX + 2, fy + shipY + 100), colorPal(INT(fireBuffer(fx, fy)))
  263.         NEXT fx, fy
  264.     END IF
  265.  
  266.     ' \/\/\/\/\/\/\/\/\/
  267.     ' Show the Starship
  268.     ' /\/\/\/\/\/\/\/\/\
  269.     _PUTIMAGE (shipX, shipY), Starship
  270.  
  271.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  272.     ' Have the background shift left by warpspeed
  273.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  274.     Stars(1).x = Stars(1).x - warpSpeed
  275.     Stars(2).x = Stars(2).x - warpSpeed
  276.  
  277.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  278.     ' When the background reaches the end reset background
  279.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  280.     IF Stars(2).x < 0 THEN
  281.         Stars(1).x = 0
  282.         Stars(2).x = 800
  283.  
  284.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  285.         ' Put the second image on the first to keep the animation proper
  286.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  287.         _PUTIMAGE (0, 0), Stars(2).image, Stars(1).image
  288.  
  289.         Starfield
  290.     END IF
  291.  
  292. SUB Frontier
  293.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/
  294.     ' Choose a Planet to display
  295.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\
  296.     'tag1:
  297.     p1 = INT(40 * RND) + 1
  298.     'IF Planet(p1).used = 1 THEN GOTO tag1
  299.  
  300.     ' \/\/\/\/\/\/\/\/\/\/\/\/
  301.     ' Get the Width and Height
  302.     ' /\/\/\/\/\/\/\/\/\/\/\/\
  303.     w = Planet(p1).w
  304.     h = Planet(p1).h
  305.  
  306.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  307.     ' Make sure planet isn't going off the screen
  308.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  309.     x1 = INT((sWidth - w) * RND)
  310.     y1 = INT((sHeight - h) * RND)
  311.  
  312.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  313.     ' Set the Planet as used and save the location
  314.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  315.     PlanetView(1) = p1
  316.  
  317.     Planet(p1).x = 800 + x1
  318.     Planet(p1).y = y1
  319.  
  320.     Planet(p1).used = 1
  321.     IF p1 < 29 THEN Planet(p2).spin = INT(2 * RND)
  322.  
  323.     IF INT(2 * RND) = 1 THEN
  324.         p2 = INT(40 * RND) + 1
  325.  
  326.         w = Planet(p2).w
  327.         h = Planet(p2).h
  328.  
  329.         IF p2 <> p1 THEN
  330.             IF w < Planet(p1).w AND h < Planet(p1).h THEN
  331.                 x2 = INT((sWidth - w) * RND)
  332.                 y2 = INT((sHeight - h) * RND)
  333.             END IF
  334.         END IF
  335.  
  336.         PlanetView(2) = p2
  337.  
  338.         Planet(p2).x = 800 + x2
  339.         Planet(p2).y = y2
  340.  
  341.         Planet(p2).used = 1
  342.  
  343.         IF p2 < 29 THEN Planet(p2).spin = INT(2 * RND)
  344.     END IF
  345.  
  346. SUB Starfield
  347.     ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  348.     ' Reset the background and rotate to make things different
  349.     ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  350.     SELECT CASE INT(4 * RND)
  351.         CASE 0: _PUTIMAGE (0, 0), starBack, Stars(2).image
  352.         CASE 1: _PUTIMAGE (799, 0)-(0, 599), starBack, Stars(2).image
  353.         CASE 2: _PUTIMAGE (0, 599)-(799, 0), starBack, Stars(2).image
  354.         CASE 3: _PUTIMAGE (799, 599)-(0, 0), starBack, Stars(2).image
  355.     END SELECT
  356.  
  357. SUB ViewPlanet (p, v)
  358.     w = Planet(p).w
  359.     h = Planet(p).h
  360.  
  361.     x1 = Planet(p).x
  362.     x2 = Planet(p).x + w
  363.  
  364.     y1 = Planet(p).y
  365.     y2 = Planet(p).y + h
  366.  
  367.     SELECT CASE Planet(p).r
  368.         CASE 0: _PUTIMAGE (x1, y1), Planet(p).image, 0
  369.         CASE 1: _PUTIMAGE (x2, y1)-(x1, y2), Planet(p).image, 0
  370.         CASE 2: _PUTIMAGE (x1, y2)-(x2, y1), Planet(p).image, 0
  371.         CASE 3: _PUTIMAGE (x2, y2)-(x1, y1), Planet(p).image, 0
  372.     END SELECT
  373.  
  374.     IF Planet(p).spin = 1 THEN
  375.         Planet(p).c = Planet(p).c + 1
  376.  
  377.         IF Planet(p).c = 16 THEN
  378.             Planet(p).c = 0
  379.  
  380.             Planet(p).r = Planet(p).r + 1
  381.             IF Planet(p).r > 3 THEN Planet(p).r = 0
  382.         END IF
  383.     END IF
  384.  
  385.     x1 = x1 - warpSpeed
  386.     Planet(p).x = x1
  387.  
  388.     IF x1 + w < 0 THEN
  389.         PlanetView(v) = 0
  390.         Planet(p).used = 0
  391.  
  392.         ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/
  393.         ' Add Planets to the animation
  394.         ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\
  395.         Frontier
  396.     END IF
  397.  
  398. SUB Framed
  399.     IF RIGHT$(TIME$, 1) = frameTime THEN
  400.         frameCount = frameCount + 1
  401.     ELSE
  402.         frameRate = frameCount
  403.  
  404.         frameCount = 0
  405.         frameTime = RIGHT$(TIME$, 1)
  406.     END IF
  407.  
  408.     _PRINTSTRING (4, 8), STR$(frameRate)
  409.  

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
Re: Star Backgound
« Reply #23 on: June 17, 2018, 11:16:03 am »
Not suppose to have fire in space but Ashish application is really good!

If you want even more helm control, I have updated RotoZoom:
https://www.qb64.org/forum/index.php?topic=278.0

Offline Ashish

  • Forum Resident
  • Posts: 630
  • Never Give Up!
Re: Star Backgound
« Reply #24 on: June 17, 2018, 11:55:41 am »
Thanks Guys! :D
I thought that the fire was not looking good in space. It must be somewhat neon light blue in color to give a nitro booster effect to spaceship.
if (Me.success) {Me.improve()} else {Me.tryAgain()}


My Projects - https://github.com/AshishKingdom?tab=repositories
OpenGL tutorials - https://ashishkingdom.github.io/OpenGL-Tutorials

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
Re: Star Backgound
« Reply #25 on: June 18, 2018, 09:29:40 am »
Ha! I thought it was Love that makes the worlds go round.

How does it make you feel with all this planet making and turning? :D

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
Re: Star Backgound
« Reply #26 on: June 18, 2018, 12:34:11 pm »
Yeah, they made my head spin but a view at pole of earth would show same spinning (maybe not so fast), actually I was offering RotoZoom2 for helm control to point ship in different directions, but then you'd have to make star background adjust to new direction. You could then draw an infinite space by generating new star systems... extending the universe out to infinity... how do you feel about that? ;D Then the trick would be to repeat the same star pattern if you turn the ship around!
« Last Edit: June 18, 2018, 12:36:13 pm by bplus »

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
Re: Star Backgound
« Reply #27 on: June 18, 2018, 02:47:14 pm »
Oh hey a crazy idea, make a rectangular map of the planet, code it to a cylinder (connect the left edge to the right with mod) and then map the upper and lower edges to a single point, the poles, add snow and spin.

Offline johnno56

  • Forum Resident
  • Posts: 1270
  • Live long and prosper.
Re: Star Backgound
« Reply #28 on: June 18, 2018, 06:10:32 pm »
bplus,

I had that thought as well. A rectangular image converted to an animated sphere. Already done that ages ago... Gimp has the ability to do that and to generate an animated gif. It's easy enough to extract the many 'frames' but would be even easier if QB64 has the ability to display animated gif's.

If I can find my old tutorial I will post it... Hang on... I can't. "attachments' do not cater for files... Is someone going to fix that little issue? Never mind. I create a link. Give me a little while to find my files... lol

J
Logic is the beginning of wisdom.

Offline johnno56

  • Forum Resident
  • Posts: 1270
  • Live long and prosper.
Re: Star Backgound
« Reply #29 on: June 18, 2018, 06:37:09 pm »
Done.

Here is the link to the tutorial: http://www.paintshopprotutorials.co.uk/html/spinning_globe_animation_gimp.html

Here are the links to the files I used.
https://www.dropbox.com/s/ain0yxptec30i1b/flag.png?dl=0 (image)
https://www.dropbox.com/s/0ofsdv7xnihe2kv/flag.gif?dl=0 (gif - 100 frames)

The whole process took only a few minutes. (NB: I deliberately used a 'square' image. Produced a better globe)

I hope this helps...

J

ps: Just finished "Mars". Enjoy.

https://www.dropbox.com/s/x2puc7x1x315r2a/mars.png?dl=0 (image)
https://www.dropbox.com/s/z1yd3uj57cgfuch/mars.gif?dl=0 (gif - 100 frames)
« Last Edit: June 18, 2018, 06:54:55 pm by johnno56 »
Logic is the beginning of wisdom.