desolatorXT Δημοσ. 28 Νοεμβρίου 2007 Δημοσ. 28 Νοεμβρίου 2007 Ο κώδικας που έχουμε είναι είδη τεράστιος, και περιλαμβανει 3 λειτουργίες, επιλογή Unit, pathing, μάχη με τον εχθρό και μερικές άλλες λεπτομέρειες, αλλα μαντέψτε... Δεν δουλεύει Όταν ένας στρατιώτης του παίκτη, βρεί στο Line of sight του, έναν αντίπαλο στρατιώτη, τότε το object "κολάει, και δεν κάνει τίποτα... Ο κώδικας είναι σε GML, αν κάποιος έχει κουράγιο να ρίξει μια ματια και να μας βοηθήσει... Βδομάδες ασχολούμαστε με το συγκεκριμένο κώδικα αλλά τίποτα... > ADD_event(CREATE) { can_fire = 0 stepcounter = 0 g = 0 k = 0 l = 0 spritecount=0 childbullet = 0 recognizeself = self.id target = 0 HP = 2 bulletcount = 0 //select and move initx = 0 inity = 0 click = 0 ADD_event(STEP){ //CALCULATE NEW POSITION { var dir_old, xold, yold, dir_offset, new_spe, new_spe2, i1, i2, dir1, dir2, xtar1, ytar2; // Turning dir_old = direction; if keyboard_check(vk_left) then direction += dir_spe; if keyboard_check(vk_right) then direction -= dir_spe; image_angle = direction; if !place_free(x,y) { direction = dir_old; image_angle = direction; } // Longitudinal motion spe = 0; if keyboard_check(vk_up) then spe += max_spe; if keyboard_check(vk_down) then spe -= max_spe; // Calculate new position if spe != 0 { loops1 = max(abs(spe)/max_dist); for (i1 = 0; i1 < loops1; i1 += 1) { xold = x; yold = y; new_spe = min(spe,max_dist); spe -= new_spe; for (i2 = 0; i2 < loops2; i2 += 1) { dir_offset = i2*dir_inc; new_spe2 = new_spe; new_spe2 *= 1 - (dir_offset/90); // Slow down when set off course dir1 = direction + dir_offset; xtar1 = x + lengthdir_x(new_spe2,dir1); ytar1 = y + lengthdir_y(new_spe2,dir1); if i2 > 0 { dir2 = direction - dir_offset; xtar2 = x + lengthdir_x(new_spe2,dir2); ytar2 = y + lengthdir_y(new_spe2,dir2); } if place_free(xtar1,ytar1) { x = xtar1; y = ytar1; break; } else if i2 > 0 { if place_free(xtar2,ytar2) { x = xtar2; y = ytar2; break; } } } } } } //if path exists if (instance_exists(pathpoint)) then { l = instance_nearest(recognizeself.x,recognizeself.y,pathpoint) //if enemies exist nearby if (instance_exists(enemy_main)) then { //calculate firerate if (recognizeself.can_fire = 1) then { recognizeself.stepcounter = recognizeself.stepcounter + 1 } //calculate firerate //test recognizeself.g = instance_nearest(recognizeself.x,recognizeself.y,enemy_main) recognizeself.k = point_distance(recognizeself.x,recognizeself.y,g.x,g.y) //test if (point_distance(recognizeself.x,recognizeself.y,g.x,g.y)<45) then { //stop until every enemy with distance smaller than 45 is dead recognizeself.can_fire = 1 if (not(click = 1)) then{ recognizeself.hspeed = 0 recognizeself.vspeed = 0 } recognizeself.direction = point_direction(x,y,g.x,g.y) //calculate firerate if (stepcounter = 20) then { if (bulletcount < 6) then { childbullet = instance_create(recognizeself.x,recognizeself.y,alliedbullet) childbullet.direction = recognizeself.direction bulletcount = bulletcount + 2 } bulletcount = bulletcount - 1 if (g.HP < 0) then { bulletcount = 0 } recognizeself.stepcounter = 0 } //calculate firerate } if (not(point_distance(recognizeself.x,recognizeself.y,g.x,g.y)<45)) then { recognizeself.can_fire = 0 move_towards_point(l.x,l.y,1) } } //if there are no enemies if (not(instance_exists(enemy_main))) then { recognizeself.can_fire = 0 if (not((recognizeself.x=l.x)&&(recognizeself.y=l.y))) then { move_towards_point(l.x,l.y,1) } } } //---------------------------------------------------- //--------------------------------------------------- //if there is no path if (not(instance_exists(pathpoint))) then { if (instance_exists(enemy_main)) then { //calculate firerate if (recognizeself.can_fire = 1) then { recognizeself.stepcounter = recognizeself.stepcounter + 1 } //calculate firerate //test recognizeself.g = instance_nearest(recognizeself.x,recognizeself.y,enemy_main) recognizeself.k = point_distance(recognizeself.x,recognizeself.y,g.x,g.y) //test if (point_distance(recognizeself.x,recognizeself.y,g.x,g.y)<45) then { //stop until every enemy with distance smaller than 50 is dead recognizeself.can_fire = 1 if (not(click = 1)) then{ recognizeself.hspeed = 0 recognizeself.vspeed = 0 } recognizeself.direction = point_direction(x,y,g.x,g.y) //calculate firerate if (stepcounter = 20) then { if (bulletcount < 6) then { childbullet = instance_create(recognizeself.x,recognizeself.y,alliedbullet) childbullet.direction = recognizeself.direction bulletcount = bulletcount + 2 } bulletcount = bulletcount - 1 if (g.HP < 0) then { bulletcount = 0 } recognizeself.stepcounter = 0 } recognizeself.speed = 0 } }} //select and move if (point_distance(x,y,initx,inity)<10) then { speed = 0 } ADD_event(COLISION(enbullet)) { HP = HP - 1 instance_deactivate_object(other) if (HP<0) then { instance_deactivate_object(self) } ADD_event(GLOBAL_MOUSE(left_button_press)) { click = 1 } ADD_event(GLOBAL_MOUSE(left_button)) { if (click = 1) then { initx = mouse_x inity = mouse_y move_towards_point(initx,inity,1) move_outside_solid(direction,999) } ADD_event(GLOBAL_MOUSE(right_button)) { click = 0 } ADD_event(PATH_END) { speed = 0 }
gtroza Δημοσ. 30 Νοεμβρίου 2007 Δημοσ. 30 Νοεμβρίου 2007 Ο γνωστός ήρωας Θησέας, μπήκε και βγήκε απο τον Λαβίρυνθο, με την βοήθεια του "μίτου της Αριάδνης", δηλαδή με ένα μεγάλου μήκους σπάγκο (σχοινί). δεν είμαι προγραμματιστής δεν είμαι η Αριάδνη δεν είμαι ο Θησέας (ο "φίλος" της, που την παράτησε στην επιστροφή σε κάποιο νησί !) αφελής πρόταση γράψε τη δομή αυτού του τμήματος κώδικα, σε μορφή επικεφαλίδων (procedures) βάλε σε κάθε μία να γίνεται κάτι απλό, που ξέρεις ότι δουλεύει όταν δουλέψει το σύνολο, άρχισε να αλλάζεις τις ρουτίνες, με αυτές που θέλεις κάθε φορά που "σταματάς", φταίει το καινούργιο που άλλαξες το διορθώνεις και πάς παρακάτω (μέθοδος της σαλαμοποίησης) απο τώρα της Αριάδνης! desolatorXT bravo για τις ακούραστες προσπάθειες καλή επιτυχία, γενικά! έχεις και πολλές αγκύλες, βγάζεις άκρη ?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.