Προς το περιεχόμενο

AI στρατιώτη σε RTS game...


desolatorXT

Προτεινόμενες αναρτήσεις

Δημοσ.

Ο κώδικας που έχουμε είναι είδη τεράστιος, και περιλαμβανει 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
}

Δημοσ.

Ο γνωστός ήρωας Θησέας, μπήκε και βγήκε απο τον Λαβίρυνθο, με την βοήθεια του "μίτου της Αριάδνης", δηλαδή με ένα μεγάλου μήκους σπάγκο (σχοινί).

 

 

 

δεν είμαι προγραμματιστής

δεν είμαι η Αριάδνη

δεν είμαι ο Θησέας (ο "φίλος" της, που την παράτησε στην επιστροφή σε κάποιο νησί !)

 

αφελής πρόταση

 

γράψε τη δομή αυτού του τμήματος κώδικα, σε μορφή επικεφαλίδων (procedures)

 

βάλε σε κάθε μία να γίνεται κάτι απλό, που ξέρεις ότι δουλεύει

όταν δουλέψει το σύνολο, άρχισε να αλλάζεις τις ρουτίνες, με αυτές που θέλεις

κάθε φορά που "σταματάς", φταίει το καινούργιο που άλλαξες

το διορθώνεις και πάς παρακάτω

 

(μέθοδος της σαλαμοποίησης) απο τώρα της Αριάδνης!:-)

 

desolatorXT

bravo για τις ακούραστες προσπάθειες

καλή επιτυχία, γενικά!

 

έχεις και πολλές αγκύλες, βγάζεις άκρη ?

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...