Hello, 🙂

I created a new language called FuncSug. Its purpose is to make GUI programming in the browser easier and so game programming. The facility consists on eliminating asynchronism: In FuncSug, the code is no longer managed by an implicit/explicit global loop (I don’t speak about implementation).

I intend, if I have time, to implement it for Godot as well. In FuncSug, the first tutorial of Godot would be roughly coded as this:

func showMessage(p_message):
	parallel exitWith branch 2 ||
		showIn(p_message, $MessageLabel)
	||
		waitSeconds(2)

parallel ||
	while true:
		# Start of game
		parallel exitWith branch 2 ||
			showMessage('Dodge the\nCreeps')
		||
			waitSeconds(1)
			awaitPressed($StartButton)
		get_tree().call_group(&"mobs", &"queue_free")
		score := 0
		$Player.start($StartPosition.position)
		
		# Middle of game
		parallel exitWith branch 1 ||
			awaitSignal('hit')
		||
			while true:
				playSoundFile('House In a Forest Loop.ogg')
		||
			showMessage('Get Ready')
			parallel ||
				while true:
					waitSeconds(1)
					score += 1
			||
				while true:
					waitSeconds(0.5)
					callgd spawnMob()
		
		# End of game
		parallel ||
			showMessage('Game Over')
		||
			playSoundFile('gameover.wav')
||
	while true:
		await score
		$ScoreLabel.text := score

The ‘player.gd’ and ‘mob.gd’ files would be keeped as they are. The “_on_MobTimer_timeout” function would be renamed as “spawnMob” and moved to ‘mob.gd’. The timers wouldn’t be needed any more.

Can you tell me what you think about it?

  • cli345OP
    link
    fedilink
    arrow-up
    2
    ·
    2 days ago

    Here, for example, is how the showMessage function would work:

    • $MessageLabel is a field defined by the programmer in Godot.
    • The showIn(p_message, p_place) function shows the message p_message in the field p_place.
    • waitSeconds(2) waits 2 seconds.
    • When the 2 seconds are elapsed, the second branch waitSeconds(2) is finished and so the parallel block is exited (because of exitWith branch 2) and the other branch (the first one) is definitely interrupted (because my parallel exitWith branch N does so).
    • The interruption of the first branch showIn(p_message, $MessageLabel) makes the $MessageLabel invisible.