extends Node2D @onready var camera: Camera2D = $Camera2D @onready var countdown: Timer = $countdown @onready var countdown_label: Label = $hud/countdown_label @onready var cars: Node = $cars @onready var times_container: HFlowContainer = $hud/times_container const caroffset= 32+4 #space cars on start line var viewCarMargin=Vector2(0.1,0.1) #proportions of viewsize. 0,0 = adjust when cars are outside view, 1,1=infinite zoom out var viewCarMargin_zoomstart=viewCarMargin+Vector2(0.05,0.05) var zoomspeed=1.0 var zoomspeed_backup=0.2 var zoom_normal=2 const CAMERA_POSITION_SPEED=0.98 #0.0 - 1.0, higher=faster var running=false var rounds=3 # Called when the node enters the scene tree for the first time. func _ready() -> void: countdown.start() countdown_label.visible=true #Load Map #var num_checkpoints=0 var checkpoints :Array[String]=[] var mapscene=load("res://scenes/map_01.tscn") var mapsceneinstance=mapscene.instantiate() add_child(mapsceneinstance) for mapc in mapsceneinstance.get_children(): if mapc.name.begins_with("area_cp"): #num_checkpoints+=1 checkpoints.append(mapc.name) print(str(checkpoints.size())+" Checkpoints found") var i=0 #for playerkey in Gamestate.getPlayerkeys(): #create all players for player in Gamestate.getPlayers(): var newcarscene=load("res://scenes/car.tscn") var newcarinstance=newcarscene.instantiate() cars.add_child(newcarinstance) newcarinstance.setPlayerinformation(i,player.color) newcarinstance.setPosition(Vector2(0,ceil(i/2.0)*(fmod(i,2)-0.5)*2.0*caroffset)) newcarinstance.setCheckpoints(checkpoints,rounds) newcarinstance.getCharacterBody().car_finished.connect(_on_car_finished) #print("Position car "+str(i)+" = "+str(ceil(i/2.0)*(fmod(i,2)-0.5)*2.0*caroffset)) print("carpos is ="+str(newcarinstance.getPosition())+" instancepos="+str(newcarinstance.position)) i+=1 # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: if running: Gamestate.addTimeElapsed(delta) if !countdown.is_stopped(): countdown_label.text=str(round(countdown.time_left)) var cars=cars.get_children() var meanCarPosition=Vector2.ZERO var displayedCarCount=0 var maxCarSpeed=0 var minPos=Vector2.ZERO #min/max x and y position of all cars var maxPos=Vector2.ZERO var oneDriving=false for c in cars: #check if any one car is still driving if !c.hasFinished(): oneDriving=true for c in cars: if !c.hasFinished() or !oneDriving: var carpos = c.getPosition() meanCarPosition+=carpos maxCarSpeed=max(maxCarSpeed,c.getSpeed()) if displayedCarCount==0: minPos.x=carpos.x minPos.y=carpos.y maxPos.x=carpos.x maxPos.y=carpos.y else: minPos.x=min(minPos.x,carpos.x) minPos.y=min(minPos.y,carpos.y) maxPos.x=max(maxPos.x,carpos.x) maxPos.y=max(maxPos.y,carpos.y) displayedCarCount+=1 meanCarPosition/=displayedCarCount #camera.position=car.getPosition() camera.position=lerp(camera.position,meanCarPosition,CAMERA_POSITION_SPEED*delta) #rint("zoom = "+str(camera.zoom)) #camera.zoom=Vector2(1.5,1.5) '''var allCarsInView=checkPositionInsideView(minPos) and checkPositionInsideView(maxPos) if not allCarsInView: camera.zoom-=Vector2(0.1*delta,0.1*delta) else: if camera.zoom(viewCarMargin_zoombackup.x*viewsize.x) and calculatedViewCarMargin.y>(viewCarMargin_zoombackup.y*viewsize.y): #cars in view again if camera.zoom.x bool: var viewsize = camera.get_viewport_rect().size var canvas_pos = camera.get_viewport().get_canvas_transform().affine_inverse() * -checkpos print("cp="+str(canvas_pos) + " viewsize="+str(viewsize)) if canvas_pos.x < 0 and canvas_pos.x > -viewsize.x: if canvas_pos.y < 0 and canvas_pos.y > -viewsize.y: return true return false func constrain(val,a,b): var vmin=min(a,b) var vmax=max(a,b) return min(vmax,max(vmin,val)) func _on_countdown_timeout() -> void: running=true var cars=cars.get_children() for c in cars: c.setRunning(true) countdown_label.visible=false func _on_car_finished(playerid,finalTime) -> void: print("Finished "+str(playerid)+" final time="+str(finalTime)) var place=times_container.get_child_count()+1 print("New Label. Place "+str(place)) var newlabel= Label.new() times_container.add_child(newlabel) newlabel.set("theme_override_font_sizes/font_size",40) newlabel.text=str(place)+": "+str(round(finalTime*1000)/1000.0)+"s" newlabel.set("theme_override_colors/font_color",Gamestate.getPlayers()[playerid].color)