Author Topic: Pretentious not-yet-a-clone clone of Among Us in QB64  (Read 8570 times)

0 Members and 1 Guest are viewing this topic.

This topic contains a post which is marked as Best Answer. Press here if you would like to see it.

FellippeHeitor

  • Guest
Pretentious not-yet-a-clone clone of Among Us in QB64
« on: October 18, 2020, 11:43:54 am »
Watch as I talk about Among Us while writing something that vaguely resembles a player moving around a map.



Code: QB64: [Select]
  1. SCREEN _NEWIMAGE(1000, 800, 32)
  2.  
  3. TYPE object
  4.     x AS SINGLE
  5.     y AS SINGLE
  6.  
  7. DIM SHARED player AS object
  8. DIM SHARED camera AS object
  9. DIM playerSpeed AS SINGLE
  10.  
  11. map = _NEWIMAGE(_WIDTH * 3, _HEIGHT * 2, 32)
  12. _DEST map
  13. FOR i = 1 TO 50
  14.     CircleFill _WIDTH * RND, _HEIGHT * RND, 1000 * RND, _RGB32(255 * RND, 255 * RND, 255 * RND, 255 * RND)
  15.  
  16. player.x = _WIDTH / 2
  17. player.y = _HEIGHT / 2
  18.  
  19. playerSpeed = 5
  20.  
  21. CONST keyUP = 18432
  22. CONST keyDOWN = 20480
  23. CONST keyLEFT = 19200
  24. CONST keyRIGHT = 19712
  25.  
  26.     IF _KEYDOWN(keyUP) THEN player.y = player.y - playerSpeed
  27.     IF _KEYDOWN(keyDOWN) THEN player.y = player.y + playerSpeed
  28.     IF _KEYDOWN(keyLEFT) THEN player.x = player.x - playerSpeed
  29.     IF _KEYDOWN(keyRIGHT) THEN player.x = player.x + playerSpeed
  30.  
  31.     IF player.x < 0 THEN player.x = 0
  32.     IF player.x > _WIDTH(map) THEN player.x = _WIDTH(map)
  33.     IF player.y < 0 THEN player.y = 0
  34.     IF player.y > _HEIGHT(map) THEN player.y = _HEIGHT(map)
  35.  
  36.     adjustCamera
  37.     CLS
  38.     _PUTIMAGE (camera.x, camera.y), map
  39.  
  40.     CircleFill player.x + camera.x, player.y + camera.y, 20, _RGB32(255)
  41.     _DISPLAY
  42.     _LIMIT 60
  43.  
  44. SUB adjustCamera
  45.     IF player.x + camera.x > _WIDTH / 2 OR player.x + camera.x < _WIDTH / 2 THEN
  46.         camera.x = _WIDTH / 2 - player.x
  47.     END IF
  48.     IF camera.x > 0 THEN camera.x = 0
  49.     IF camera.x < -(_WIDTH(map) - _WIDTH) THEN camera.x = -(_WIDTH(map) - _WIDTH)
  50.  
  51.     IF player.y + camera.y > _HEIGHT / 2 OR player.y + camera.y < _HEIGHT / 2 THEN
  52.         camera.y = _HEIGHT / 2 - player.y
  53.     END IF
  54.     IF camera.y > 0 THEN camera.y = 0
  55.     IF camera.y < -(_HEIGHT(map) - _HEIGHT) THEN camera.y = -(_HEIGHT(map) - _HEIGHT)
  56.  
  57. SUB CircleFill (CX AS INTEGER, CY AS INTEGER, R AS INTEGER, C AS _UNSIGNED LONG)
  58.     ' CX = center x coordinate
  59.     ' CY = center y coordinate
  60.     '  R = radius
  61.     '  C = fill color
  62.     DIM Radius AS INTEGER, RadiusError AS INTEGER
  63.     DIM X AS INTEGER, Y AS INTEGER
  64.     Radius = ABS(R)
  65.     RadiusError = -Radius
  66.     X = Radius
  67.     Y = 0
  68.     IF Radius = 0 THEN PSET (CX, CY), C: EXIT SUB
  69.     LINE (CX - X, CY)-(CX + X, CY), C, BF
  70.     WHILE X > Y
  71.         RadiusError = RadiusError + Y * 2 + 1
  72.         IF RadiusError >= 0 THEN
  73.             IF X <> Y + 1 THEN
  74.                 LINE (CX - Y, CY - X)-(CX + Y, CY - X), C, BF
  75.                 LINE (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
  76.             END IF
  77.             X = X - 1
  78.             RadiusError = RadiusError - X * 2
  79.         END IF
  80.         Y = Y + 1
  81.         LINE (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
  82.         LINE (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
  83.     WEND
« Last Edit: October 26, 2020, 01:07:43 am by FellippeHeitor »

Offline Dav

  • Forum Resident
  • Posts: 792
    • View Profile
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #1 on: October 18, 2020, 04:03:50 pm »
Lol.  Thanks for leaving in the blooper.  I needed a laugh.. 

- Dav

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #2 on: October 18, 2020, 04:43:59 pm »
Wow just add image of a map and player is walking around map, nice!

FellippeHeitor

  • Guest
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #3 on: October 19, 2020, 04:29:25 pm »
@Dav glad it was entertaining!

@bplus the illusion is the key, thanks for checking it out!

FellippeHeitor

  • Guest
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #4 on: October 20, 2020, 12:53:07 pm »
Run this and choose "Connect to server" - arbitrarily limited to 10 simultaneous "players" for now.

It's the map+player code of the first post, with networking added. Still not a game, but you can see other players in real time, which is cool.

If you have trouble connecting to 98.29.249.134 (kindly hosted by SpriggsySprigs in the US), replace that on line 97 with alephc.xyz (kindly hosted by Luke in Australia).

Code: QB64: [Select]
  1.  
  2. $LET DEBUGGING = FALSE
  3. $IF DEBUGGING = TRUE THEN
  4.     $CONSOLE
  5.  
  6. CONST True = -1, False = 0
  7. CONST mode_freeplay = 0
  8. CONST mode_localhost = 1
  9. CONST mode_localclient = 2
  10. CONST mode_onlinehost = 3
  11. CONST mode_onlineclient = 4
  12.  
  13. TYPE object
  14.     name AS STRING
  15.     handle AS LONG
  16.     x AS SINGLE
  17.     y AS SINGLE
  18.     state AS INTEGER
  19.     basicInfoSent AS _BYTE
  20.     ping AS SINGLE
  21.  
  22. DIM SHARED totalClients AS INTEGER
  23. DIM SHARED playerStream(1 TO 10) AS STRING
  24. DIM SHARED serverStream AS STRING
  25. DIM SHARED player(1 TO 10) AS object, me AS INTEGER
  26. DIM SHARED warning(1 TO 30) AS object
  27. DIM idSet AS _BYTE
  28. DIM newClient AS LONG
  29. DIM serverPing AS SINGLE
  30. DIM key$, value$
  31.  
  32. DIM SHARED endSignal AS STRING
  33. endSignal = "<" + CHR$(254) + ">"
  34.  
  35. vgaPalette:
  36. DATA 0,0,170
  37. DATA 0,170,0
  38. DATA 0,170,170
  39. DATA 170,0,0
  40. DATA 170,0,170
  41. DATA 170,85,0
  42. DATA 170,170,170
  43. DATA 85,85,85
  44. DATA 85,85,255
  45. DATA 85,255,85
  46. DATA 85,255,255
  47. DATA 255,85,85
  48. DATA 255,85,255
  49. DATA 255,255,85
  50. DATA 255,255,255
  51.  
  52. RESTORE vgaPalette
  53. FOR i = 1 TO 15
  54.     READ r%, g%, b%
  55.     colors(i) = _RGB32(r%, g%, b%)
  56.  
  57. CONST timeout = 30
  58. DIM userName$, userColor%
  59. INPUT "Name: ", userName$
  60.     INPUT "Color (1-15): ", userColor%
  61. LOOP WHILE userColor% < 1 OR userColor% > 15
  62.  
  63.     COLOR 15
  64.     PRINT "-------------------------"
  65.     PRINT "(1) Free play"
  66.     PRINT "(2) Connect to server"
  67.  
  68.     DIM choice AS STRING
  69.     DO
  70.         choice = INKEY$
  71.         _LIMIT 30
  72.     LOOP UNTIL choice >= "1" AND choice <= "5"
  73.  
  74.     DIM SHARED server AS object, host AS LONG
  75.     DIM c AS INTEGER, attempt AS INTEGER
  76.     CONST maxAttempts = 100
  77.     SELECT CASE VAL(choice)
  78.         CASE 1
  79.             EXIT DO
  80.         CASE 2
  81.             COLOR 7
  82.             PRINT "Attempting to connect to local host... ";
  83.             r = CSRLIN: c = POS(1)
  84.             attempt = 0
  85.             DO
  86.                 server.handle = 0
  87.                 server.handle = _OPENCLIENT("TCP/IP:51512:98.29.249.134")
  88.                 IF server.handle THEN EXIT DO
  89.                 attempt = attempt + 1
  90.                 LOCATE r, c: PRINT USING "###%"; (attempt / maxAttempts) * 100;
  91.                 _LIMIT 30
  92.             LOOP WHILE attempt < 100
  93.             IF server.handle THEN serverPing = TIMER: mode = mode_localclient: EXIT DO
  94.             PRINT: COLOR 14: PRINT "/\ ";: COLOR 12
  95.             PRINT "Failed to connect to local host."
  96.             CLOSE server.handle
  97.     END SELECT
  98.  
  99. SCREEN _NEWIMAGE(800, 600, 32)
  100.  
  101. DIM SHARED playerSpeed AS SINGLE
  102. DIM SHARED camera AS object
  103.  
  104. map = _NEWIMAGE(_WIDTH * 3, _HEIGHT * 2, 32)
  105. _DEST map
  106. FOR i = 1 TO 50
  107.     CircleFill RND * _WIDTH, RND * _HEIGHT, RND * 1000, _RGB32(RND * 255, RND * 255, RND * 255, RND * 150)
  108.  
  109. CONST keyUP = 18432
  110. CONST keyDOWN = 20480
  111. CONST keyLEFT = 19200
  112. CONST keyRIGHT = 19712
  113. CONST keyLSHIFT = 100304
  114. CONST keyRSHIFT = 100303
  115.  
  116. CONST cameraWindow = 100
  117.  
  118. CONST minSpeed = 3
  119. CONST maxSpeed = 5
  120.  
  121. playerSpeed = maxSpeed
  122.  
  123. IF mode > 1 THEN
  124.     idSet = False
  125.     idSet = True
  126.     me = 1
  127.     player(me).name = userName$
  128.     player(me).x = _WIDTH / 2 + COS(RND * _PI) * (RND * 100)
  129.     player(me).y = _HEIGHT / 2 + SIN(RND * _PI) * (RND * 100)
  130.     player(me).state = True
  131.     player(me).color = userColor%
  132.     SELECT CASE mode
  133.         CASE mode_localhost
  134.             'check for new connections (unless already at max)
  135.             IF idSet = False THEN
  136.                 idSet = True
  137.                 me = 1
  138.                 player(me).name = userName$
  139.                 player(me).x = _WIDTH / 2 + COS(RND * _PI) * (RND * 100)
  140.                 player(me).y = _HEIGHT / 2 + SIN(RND * _PI) * (RND * 100)
  141.                 player(me).state = True
  142.                 player(me).color = userColor%
  143.             END IF
  144.  
  145.             IF totalClients < UBOUND(player) THEN
  146.                 newClient = 0
  147.                 newClient = _OPENCONNECTION(host)
  148.                 IF newClient THEN
  149.                     totalClients = totalClients + 1
  150.                     FOR i = 1 TO UBOUND(player)
  151.                         IF player(i).state = False THEN
  152.                             player(i).color = 0
  153.                             player(i).handle = newClient
  154.                             player(i).state = True
  155.                             sendData player(i), "ID", MKI$(i)
  156.                             player(i).ping = TIMER
  157.                             EXIT FOR
  158.                         END IF
  159.                     NEXT
  160.                 END IF
  161.             END IF
  162.  
  163.             FOR i = 1 TO UBOUND(player)
  164.                 IF player(i).state = False OR i = me THEN _CONTINUE
  165.                 IF TIMER - player(i).ping > timeout THEN
  166.                     'player inactive
  167.                     player(i).state = False
  168.                     CLOSE player(i).handle
  169.                     addWarning player(i).name + " lost connection."
  170.                     totalClients = totalClients - 1
  171.                     _CONTINUE
  172.                 END IF
  173.  
  174.                 getData player(i), playerStream(i)
  175.  
  176.                 DO WHILE parse(playerStream(i), key$, value$)
  177.                     player(i).ping = TIMER
  178.                     SELECT CASE key$
  179.                         CASE "NAME"
  180.                             player(i).name = value$
  181.                         CASE "COLOR" 'received once per player
  182.                             DIM newcolor AS INTEGER, changed AS _BYTE
  183.                             newcolor = CVI(value$)
  184.                             changed = False
  185.                             'check if this color is already in use, so a random one can be assigned
  186.                             FOR j = 1 TO UBOUND(player)
  187.                                 IF player(j).state = True AND player(j).color = newcolor THEN
  188.                                     newcolor = newcolor + 1
  189.                                     IF newcolor > UBOUND(colors) THEN newcolor = 1
  190.                                     changed = True
  191.                                     j = 0 'check again
  192.                                 END IF
  193.                             NEXT
  194.                             player(i).color = newcolor
  195.                             IF changed THEN
  196.                                 sendData player(i), "COLOR", MKI$(newcolor)
  197.                             END IF
  198.                         CASE "POS"
  199.                             player(i).x = CVI(LEFT$(value$, 2))
  200.                             player(i).y = CVI(RIGHT$(value$, 2))
  201.                     END SELECT
  202.                 LOOP
  203.  
  204.                 'send ping
  205.                 sendData player(i), "PING", ""
  206.  
  207.                 'send all players' data
  208.                 FOR j = 1 TO UBOUND(player)
  209.                     IF j = i THEN _CONTINUE
  210.                     IF player(j).state = True THEN
  211.                         sendData player(i), "PLAYERCOLOR", MKI$(j) + MKI$(player(j).color)
  212.                         sendData player(i), "PLAYERPOS", MKI$(j) + MKS$(player(j).x) + MKS$(player(j).y)
  213.                         sendData player(i), "PLAYERNAME", MKI$(j) + player(j).name
  214.                     ELSE
  215.                         sendData player(i), "PLAYEROFFLINE", MKI$(j)
  216.                     END IF
  217.                 NEXT
  218.             NEXT
  219.  
  220.         CASE mode_localclient, mode_onlineclient
  221.             IF idSet THEN
  222.                 IF player(me).basicInfoSent = False THEN
  223.                     player(me).basicInfoSent = True
  224.                     sendData server, "COLOR", MKI$(player(me).color)
  225.                     sendData server, "NAME", player(me).name
  226.                 END IF
  227.  
  228.                 sendData server, "POS", MKI$(player(me).x) + MKI$(player(me).y)
  229.             END IF
  230.  
  231.             getData server, serverStream
  232.             DO WHILE parse(serverStream, key$, value$)
  233.                 SELECT CASE key$
  234.                     CASE "ID" 'first info sent by server
  235.                         idSet = True
  236.                         me = CVI(value$)
  237.                         player(me).name = userName$
  238.                         player(me).x = _WIDTH / 2 + COS(RND * _PI) * (RND * 100)
  239.                         player(me).y = _HEIGHT / 2 + SIN(RND * _PI) * (RND * 100)
  240.                         player(me).state = True
  241.                         player(me).color = userColor%
  242.                     CASE "COLOR" 'server color changes must always be applied
  243.                         player(me).color = CVI(value$)
  244.                     CASE "PLAYERCOLOR"
  245.                         player(CVI(LEFT$(value$, 2))).color = CVI(RIGHT$(value$, 2))
  246.                     CASE "PLAYERPOS"
  247.                         player(CVI(LEFT$(value$, 2))).state = True
  248.                         player(CVI(LEFT$(value$, 2))).ping = TIMER
  249.                         player(CVI(LEFT$(value$, 2))).x = CVS(MID$(value$, 3, 4))
  250.                         player(CVI(LEFT$(value$, 2))).y = CVS(RIGHT$(value$, 4))
  251.                     CASE "PLAYERNAME"
  252.                         player(CVI(LEFT$(value$, 2))).name = MID$(value$, 3)
  253.                     CASE "PLAYEROFFLINE"
  254.                         IF player(CVI(value$)).state = True THEN
  255.                             player(CVI(value$)).state = False
  256.                             addWarning player(CVI(value$)).name + " left the game."
  257.                         END IF
  258.                     CASE "PING"
  259.                         serverPing = TIMER
  260.                 END SELECT
  261.             LOOP
  262.     END SELECT
  263.  
  264.     IF playerSpeed < minSpeed THEN playerSpeed = minSpeed
  265.     IF playerSpeed > maxSpeed THEN playerSpeed = maxSpeed
  266.  
  267.     IF idSet THEN
  268.         IF _KEYDOWN(keyUP) THEN player(me).y = player(me).y - playerSpeed
  269.         IF _KEYDOWN(keyDOWN) THEN player(me).y = player(me).y + playerSpeed
  270.         IF _KEYDOWN(keyLEFT) THEN player(me).x = player(me).x - playerSpeed
  271.         IF _KEYDOWN(keyRIGHT) THEN player(me).x = player(me).x + playerSpeed
  272.  
  273.         IF player(me).x < 0 THEN player(me).x = 0
  274.         IF player(me).y < 0 THEN player(me).y = 0
  275.         IF player(me).x > _WIDTH(map) THEN player(me).x = _WIDTH(map)
  276.         IF player(me).y > _HEIGHT(map) THEN player(me).y = _HEIGHT(map)
  277.  
  278.         adjustCamera
  279.     END IF
  280.  
  281.     CLS
  282.  
  283.     DIM shipFlotation AS SINGLE, shipFloatIntensity AS SINGLE
  284.     shipFlotation = shipFlotation + .05
  285.     IF shipFlotation > _PI(2) THEN shipFlotation = shipFlotation - _PI(2)
  286.     shipFloatIntensity = 1.5
  287.  
  288.     _PUTIMAGE (camera.x + COS(shipFlotation) * shipFloatIntensity, camera.y + SIN(shipFlotation) * shipFloatIntensity), map
  289.     _BLEND
  290.  
  291.     IF (mode = mode_localclient OR mode = mode_onlineclient) THEN
  292.         IF TIMER - serverPing > timeout THEN
  293.             SCREEN 0
  294.             PRINT: COLOR 14: PRINT "/\ ";: COLOR 12
  295.             PRINT "Disconnected from host."
  296.             END
  297.         ELSE
  298.             PRINT USING "###ms"; ((TIMER - serverPing) - FIX(TIMER - serverPing)) * 1000;
  299.         END IF
  300.     END IF
  301.  
  302.     DIM x AS SINGLE, y AS SINGLE
  303.     FOR i = 1 TO UBOUND(player)
  304.         IF player(i).state = False OR player(i).color = 0 THEN _CONTINUE
  305.         x = player(i).x + camera.x + COS(shipFlotation) * shipFloatIntensity
  306.         y = player(i).y + camera.y + SIN(shipFlotation) * shipFloatIntensity
  307.         CircleFill x, y + 6, 15, _RGB32(0, 50)
  308.         CircleFill x, y, 15, _RGB32(0)
  309.         CircleFill x, y, 10, colors(player(i).color)
  310.         COLOR _RGB32(0)
  311.         _PRINTSTRING (1 + x - _PRINTWIDTH(player(i).name) / 2, 1 + y - 20), player(i).name
  312.         COLOR _RGB32(255)
  313.         _PRINTSTRING (x - _PRINTWIDTH(player(i).name) / 2, y - 20), player(i).name
  314.     NEXT
  315.     'LINE (_WIDTH / 2 - cameraWindow, _HEIGHT / 2 - cameraWindow)-STEP(cameraWindow * 2, cameraWindow * 2), , B
  316.  
  317.     'display warnings
  318.     FOR i = 1 TO UBOUND(warning)
  319.         COLOR _RGB32(128, 50, 22)
  320.         IF warning(i).state = True THEN
  321.             _PRINTSTRING (10, _HEIGHT / 2 + _FONTHEIGHT * i), warning(i).name
  322.             IF TIMER - warning(i).ping > 2 THEN warning(i).state = False
  323.         END IF
  324.     NEXT
  325.  
  326.     _DISPLAY
  327.     _LIMIT 60
  328.  
  329. SUB addWarning (text$)
  330.     DIM i AS INTEGER
  331.     FOR i = 1 TO UBOUND(warning)
  332.         IF warning(i).state = False THEN
  333.             warning(i).state = True
  334.             warning(i).name = text$
  335.             warning(i).ping = TIMER
  336.             EXIT FOR
  337.         END IF
  338.     NEXT
  339.  
  340. SUB sendData (client AS object, id$, value$)
  341.     DIM key$
  342.     key$ = id$ + ">" + value$ + endSignal
  343.     PUT #client.handle, , key$
  344.  
  345. SUB getData (client AS object, buffer AS STRING)
  346.     DIM incoming$
  347.     GET #client.handle, , incoming$
  348.     buffer = buffer + incoming$
  349.  
  350. FUNCTION parse%% (buffer AS STRING, key$, value$)
  351.     DIM endMarker AS LONG
  352.     endMarker = INSTR(buffer, endSignal)
  353.     IF endMarker THEN
  354.         key$ = LEFT$(buffer, endMarker - 1)
  355.         buffer = MID$(buffer, endMarker + LEN(endSignal))
  356.         endMarker = INSTR(key$, ">")
  357.         value$ = MID$(key$, endMarker + 1)
  358.         key$ = LEFT$(key$, endMarker - 1)
  359.         parse%% = True
  360.     END IF
  361.  
  362. SUB adjustCamera
  363.     IF player(me).x + camera.x > _WIDTH / 2 + cameraWindow THEN
  364.         camera.x = _WIDTH / 2 - player(me).x + cameraWindow
  365.     ELSEIF player(me).x + camera.x < _WIDTH / 2 - cameraWindow THEN
  366.         camera.x = _WIDTH / 2 - player(me).x - cameraWindow
  367.     END IF
  368.     IF camera.x > 0 THEN camera.x = 0
  369.     IF camera.x < -(_WIDTH(map) - _WIDTH) THEN camera.x = -(_WIDTH(map) - _WIDTH)
  370.  
  371.     IF player(me).y + camera.y > _HEIGHT / 2 + cameraWindow THEN
  372.         camera.y = _HEIGHT / 2 - player(me).y + cameraWindow
  373.     ELSEIF player(me).y + camera.y < _HEIGHT / 2 - cameraWindow THEN
  374.         camera.y = _HEIGHT / 2 - player(me).y - cameraWindow
  375.     END IF
  376.     IF camera.y > 0 THEN camera.y = 0
  377.     IF camera.y < -(_HEIGHT(map) - _HEIGHT) THEN camera.y = -(_HEIGHT(map) - _HEIGHT)
  378.  
  379.  
  380. SUB CircleFill (CX AS INTEGER, CY AS INTEGER, R AS INTEGER, C AS _UNSIGNED LONG)
  381.     ' CX = center x coordinate
  382.     ' CY = center y coordinate
  383.     '  R = radius
  384.     '  C = fill color
  385.     DIM Radius AS INTEGER, RadiusError AS INTEGER
  386.     DIM X AS INTEGER, Y AS INTEGER
  387.     Radius = ABS(R)
  388.     RadiusError = -Radius
  389.     X = Radius
  390.     Y = 0
  391.     IF Radius = 0 THEN PSET (CX, CY), C: EXIT SUB
  392.     LINE (CX - X, CY)-(CX + X, CY), C, BF
  393.     WHILE X > Y
  394.         RadiusError = RadiusError + Y * 2 + 1
  395.         IF RadiusError >= 0 THEN
  396.             IF X <> Y + 1 THEN
  397.                 LINE (CX - Y, CY - X)-(CX + Y, CY - X), C, BF
  398.                 LINE (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
  399.             END IF
  400.             X = X - 1
  401.             RadiusError = RadiusError - X * 2
  402.         END IF
  403.         Y = Y + 1
  404.         LINE (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
  405.         LINE (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
  406.     WEND
  407.  
  408. SUB db (text$)
  409.     $IF DEBUGGING = TRUE THEN
  410.         _ECHO text$
  411.     $ELSE
  412.         DIM dummy$
  413.         dummy$ = text$
  414.     $END IF
« Last Edit: October 20, 2020, 12:55:16 pm by FellippeHeitor »

Offline Rubidium

  • Newbie
  • Posts: 10
    • View Profile
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #5 on: October 20, 2020, 05:16:44 pm »
Impressive! do you have the code for the server as well? I'd like to try playing around with it :D

FellippeHeitor

  • Guest
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #6 on: October 20, 2020, 05:29:17 pm »
It's all included above, actually!

Offline Rubidium

  • Newbie
  • Posts: 10
    • View Profile
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #7 on: October 20, 2020, 06:09:22 pm »
Really cool. With some messenger features and a few collision objects, a lot of kids could get so into this! -for getting into qb64- :D

Marked as best answer by on Today at 06:16:29 am

FellippeHeitor

  • Guest
Re: Pretentious not-really-a-clone clone of Among Us in QB64
« Reply #8 on: October 21, 2020, 01:08:11 pm »
  • Undo Best Answer
  • True! I'm hoping to turn it into a real game soon.

    If anyone decides to try the room and eventually finds no one currently logged in, just open two instances of the code above to see two instances of yourself running around.

    Offline SierraKen

    • Forum Resident
    • Posts: 1454
      • View Profile
    Re: Pretentious not-really-a-clone clone of Among Us in QB64
    « Reply #9 on: October 21, 2020, 04:04:11 pm »
    This is great Felippe! I've been wondering how to do this for awhile. I'll try to learn it. I might also drop the CHR$(0) and inkey$ I use for the arrow keys, yours probably works better. Someone could make a really great dungeon type game this way. Thanks!
    « Last Edit: October 21, 2020, 04:06:18 pm by SierraKen »

    FellippeHeitor

    • Guest
    Re: Pretentious not-really-a-clone clone of Among Us in QB64
    « Reply #10 on: October 21, 2020, 04:08:07 pm »
    Thanks, Ken! Glad you enjoyed it.

    Did you have luck joining either server? They've both been up since yesterday.

    The advantage of using _KEYDOWN for character movement is that all directions can coexist simultaneously and there's no buffer. Once released, the keys immediately stop coming.

    Offline SierraKen

    • Forum Resident
    • Posts: 1454
      • View Profile
    Re: Pretentious not-really-a-clone clone of Among Us in QB64
    « Reply #11 on: October 21, 2020, 05:33:55 pm »
    LOL I see you! I wonder if we can add chat to it? Like text over your nickname.

    FellippeHeitor

    • Guest
    Re: Pretentious not-really-a-clone clone of Among Us in QB64
    « Reply #12 on: October 21, 2020, 05:34:35 pm »
    I'll be implementing chat soon, but for now there's no length limit for player name - it's a rudimentary messaging system as is!

    Offline Dav

    • Forum Resident
    • Posts: 792
      • View Profile
    Re: Pretentious not-really-a-clone clone of Among Us in QB64
    « Reply #13 on: October 21, 2020, 05:55:40 pm »
    Works for me.  Connected as is.  Code is so easy to understand. What a great learning example. 

    - Dav 

    FellippeHeitor

    • Guest
    Re: Pretentious not-really-a-clone clone of Among Us in QB64
    « Reply #14 on: October 21, 2020, 05:57:39 pm »
    Damn, I missed you! Australia or US?