noob question: Godot engine capabilities before starting project

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By bluekicker1

Noob here.

I want to develop a game idea I have, would like to know if I can achieve it with Godot before I invest a lot of time into learning Godot.

MINECRAFT CLONE…
Most important thing: The game is a FPS style, like minecraft, where the player can place standard sized “blank” blocks (voxels) in a large open world, creating landscapes and simple structures.

THE DIFFERENCE: IN-GAME TEXTURE CREATION
However, all of the textures ON these blocks are ALSO created by the player: by “hitting” the face of any block after it’s been placed, the player can either choose from any texture already available (located in some specified folder in their game directory) OR open a simple in-game painting-program window and draw (and then save to a specified folder for possible future use) a new texture using standard tools like varying thickness pencil, straight line, fill-bucket, erase, import image and select RGB color etc. The image created or selected will only become the texture of the face which was “hit”: so one block could have maximum 6 different textures on it.

In this manner, the player could create a blockworld and then draw on any and every block, combining sculpture and painting.

I started creating my own game engine using Python and then Lua (for better speed), but ran into enough difficulties (especially with cross-platform deployment down the road) to realize I should just find a suitable game engine already made and learn that.

I understand that creating lots of images in-game this way could create problems with storage and rendering, and some limits on maximum number and resolution of images should be set to prevent problems (however, there should still be the possibility for HUNDREDS of custom painted images), BUT…

CAN IT BE DONE USING GODOT?
Is this minecraft + painting mechanic something that Godot could do out of the box? If not, are there any particular plugins that could be used in conjunction with Godot to achieve this?

Thank you and best hopes, forgive the textwall, i tried to keep it as short as possible w/o being rude

edit: moved this to Projects because it seems possibly innappropriately wide/vague for Engine…

:bust_in_silhouette: Reply From: lacethespace

Good question. Obviously the texture drawing tools would have to be custom-built. The drawing is described here Custom drawing in 2D, and to update 3D world you’d have to extract texture and maybe blit it over texture atlas used across all blocks.

For hundred of textures there might be performance issues, depending on size of each texture and the GPU memory. This is not related to Godot, just basic limitations of 3D hardware. If you use separate textures, you’ll need too many draw calls. If you use texture atlas, you are limited to fewer textures. You could come up with some hybrid technique where you build atlas on the fly depending on what textures are present in single chunk. Maybe best to take an existing voxel engine and see how many different textures you can cram in before it starts falling apart.

Regarding gameplay, few things to consider:

  • it will be hard to build structures using blank canvas blocks, because of lack of depth perception and no variaty of building materials
  • being able to modify all 6 faces of cube makes it x6 more effort to place single block
  • offer only about 30 colors from nice palette instead of full RGB picker, this will make user paintings look so much nicer (this is great resource)
  • decide early if you are going to support drawing over multiple faces at once because everyone will want it, but it would be very tricky to actually implement

Thanks for your reply lacethespace! Good points to consider…

Regarding the risk of having too many separate textures and thus too many draw calls, do you think I could mitigate that by using some kind of view-distance fog to limit how far a player could see (and thus how much would have to be loaded and rendered at any given time)? I know, it’d have a super-obvious aesthetic impact, but…think that would be a step in the right direction regarding keeping performance good? Or some kind of “pause the game in order to load up new textures as required” thing…could be annoying, but…in any sense that’s a very good point you made that must be sorted out properly :slight_smile:

Drawing over multiple faces at once? I was just thinking of a pop-up drawing program, which would be a square drawing area, like the face of the cube you wish to texture, and then when you finished drawing, you’d hit SAVE button, the pop-up window would vanish, and the face of the cube would THEN be updated to feature the texture you just created…BUT…drawing over multiple faces at once sounds friggin awesome…like some kind of graffiti minecraft…hmmmmm…would be cool to add police and angry home/business owners as enemies you’d need to evade…that’s a cool idea man, and i agree: I think everyone would want that… :smiley: especially if you add a skateboard as a vehicle and the ability to surf on public transit trains…

bluekicker1 | 2020-03-04 14:53

:bust_in_silhouette: Reply From: Magso

Well the Minecraft part is certainly possible. The painting is also possible out of the box by using the Line2D node and adding points at the mouse position when the mouse moves. A screenshot can then be took and stored in the user:// directory and then loaded as a resource for use. Here’s a simple example of how the painting and saving can be done.

extends Node2D

export var image_name = "Picture.png"
var current_line2D

func _input(event: InputEvent) -> void:
	if Input.is_mouse_button_pressed(BUTTON_LEFT):
		if !current_line2D:
			current_line2D = Line2D.new()
			add_child(current_line2D)
		
		if event is InputEventMouseMotion:
			current_line2D.add_point(event.position)
	else:
		current_line2D = null

func _process(delta: float) -> void:
	if Input.is_action_just_pressed("ui_accept"):
		var image = get_viewport().get_texture().get_data()
		image.flip_y()
		image.save_png("user://" + image_name)

Thanks for the info Magso!

Well, it totally sounds like it’s possible to make this game with Godot then! I’m gonna get cracking and dive into the tutorials, many thanks and two thumbs up!

bluekicker1 | 2020-03-04 14:56

:bust_in_silhouette: Reply From: Merlin1846

Yes You can.
I actually made a very bad clone then deleted all the files. The tile map can easly be used for the cubes, things like set_cell() and get_cell() can be used for interaction.