AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
-40%
Le deal à ne pas rater :
Tefal Ingenio Emotion – Batterie de cuisine 10 pièces (induction, ...
59.99 € 99.99 €
Voir le deal

 

 Namcap

Aller en bas 
2 participants
AuteurMessage
Shrom
Débutant



Messages : 18

Namcap Empty
MessageSujet: Namcap   Namcap EmptyLun 26 Déc 2011 - 15:12

Bonjour tous le monde,

Il y a quelque temps, j'ai posté sur ce forum pour avoir de l'aide quand a la création d'un moteur de déplacement de type Pacman et "onilink_" m'avait bien dépanné et je l'en remercie.

Voici mon script :

Code:

// #############################################
// #### Script de déplacement de Namcap V 1 ####
// ####      Made By Shrom & Doyou        ####
// ####    Special thanks to : onilink_    ####
// #############################################


//Gestion de déplacement de Nampac en dehors de la room
if (bbox_left>room_width) or (bbox_right<0) or (bbox_top>room_height) or (bbox_bottom<0) // si l'objet sors de la room alors il rentre de l'autre coté de la room

    move_wrap(true,true,32)
}

// Déplacement si il n'y a pas de collision
for(i=0; i<4; i+=1) // Pour i allant de 1 à 4 en fonction de la direction choisit
{
  if(keyboard_check(key[i]) && place_snapped(32,32)) // Si l'on a appuyé sur une touche et que Namcap est placé dans une grille de 32*32
  {   
    if(place_free(x+lx[i], y+ly[i])) // Si il y a de la place entre Namcap et un objet de type "solid" en position X et Y calculé dans l'evénement "Create"   
        {
            Coll = 0 // Variables de debug affichant si il y a une collision ou non ( 1 = oui 0 = non )
            place_free_X= x+lx[i]  // Variable de Debug
            place_free_Y =y+ly[i] // Variable de Debug
            switch(i) // On fonction de la direction, on choisit le sprite à afficher.
            {
                case 0:
                    sprite_index = Namcap_R_spr // Sprite Droite
                    break
                case 2:
                    sprite_index = Namcap_L_spr // Sprite Gauche
                    break
                case 1:
                    sprite_index = Namcap_H_spr // Sprite Haut
                    break
                case 3:
                    sprite_index = Namcap_B_spr // Sprite Bas
                    break
            }                                       
            direction = i*90 // on va dans la direction choisit en fonction de la touche préssée.
            speed = 2 // On fixe la vitesse
            break
        }
  }
}

//Si il y a une collision, donc si il n'y a pas de place, on arrete Namcap
if(place_snapped(32,32) && !place_free(x+lx[direction div 90], y + ly[direction div 90]))
 
    {
        speed = 0
        Coll = 1 // Variables de debug affichant si il y a une collision ou non ( 1 = oui 0 = non )
        not_place_free_X =x+lx[direction div 90] // Variable de Debug
        not_place_free_Y = y + ly[direction div 90] // Variable de Debug
    }

//Gestion du fait que Namcap rentre en collision avec des "Balles"
//Lors il rencontre l'objet Namcap_dot_obj alors on execute ce code dans l'instance rencontréé( grâce a son ID)
//et on détruit l'instance en rajoutant des point a chaque fois.
with (Namcap_dot_obj)
    {
        if place_meeting(x,y, Namcap_obj)
            {
                instance_destroy()
            }
    }

Mon problème est le suivant, ;

Si je l'aisse la valeur de la variable "speed" a "2", tout va bien, mais lorsque je veut la passé a 3, ou plus, je passe à travers certain mur, mais déplacement ne sont plus correctement géré, etc...


J'ai bien sur chercher avant de posté ici, mais je ne comprends pas...


Someone can help me ?
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

Namcap Empty
MessageSujet: Re: Namcap   Namcap EmptyLun 26 Déc 2011 - 16:09

Le problème est simple,
avec speed = 1, ta position s'incrémente de 1 en 1, donc si ton x=0 tu passeras de 0, a 1, puis 1 a 2, jusqu'a la taille de la case.
Avec 2 pareil si la taille de ta case est paire.
Mais imagine, si ta case fait 16, bah 16 n'étant pas multiple de 3, si t'incrémente de 3 en 3 tu va dépasser avant les tests de collisions.

C'est pour ça qu'on fait toujours les tests de collisions de 1 en 1, répétés 'speed' fois.

Code:
repeat(mySpeed) {
  if(free(x+incr_x, y+incr_y)) {
    x += incr_x
    y += incr_y
  }
}


_________________
Namcap Runningpotato1Namcap TvF6GED Namcap MdetltS
Revenir en haut Aller en bas
Shrom
Débutant



Messages : 18

Namcap Empty
MessageSujet: Re: Namcap   Namcap EmptyLun 26 Déc 2011 - 18:35

Merci encore de ton aide onilink_,

Voici mon script :

Code:
if (bbox_left>room_width) or (bbox_right<0) or (bbox_top>room_height) or (bbox_bottom<0) // si l'objet sors de la room alors il rentre de l'autre coté de la room

    move_wrap(true,true,32)
}

// Déplacement si il n'y a pas de collision
for(i=0; i<4; i+=1) // Pour i allant de 1 à 4 en fonction de la direction choisit
{
  if(keyboard_check(key[i]) && place_snapped(32,32)) // Si l'on a appuyé sur une touche et que Namcap est placé dans une grille de 32*32
      {   
        if(place_free(x+lx[i], y+ly[i])) // Si il y a de la place entre Namcap et un objet de type "solid" en position X et Y calculé dans l'evénement "Create"   
            {
                Coll = 0 // Variables de debug affichant si il y a une collision ou non ( 1 = oui 0 = non )
                place_free_X= x+lx[i]
                place_free_Y =y+ly[i]
           
                switch(i) // On fonction de la direction, on choisit le sprite à afficher.
                {
                    case 0:
                        sprite_index = Namcap_R_spr // Sprite Droite
                        break
                    case 2:
                        sprite_index = Namcap_L_spr // Sprite Gauche
                        break
                    case 1:
                        sprite_index = Namcap_H_spr // Sprite Haut
                        break
                    case 3:
                        sprite_index = Namcap_B_spr // Sprite Bas
                        break
                }
                direction = i*90 // on va dans la direction choisit en fonction de la touche préssée.
                speed = Myspeed // On fixe la vitesse
                break
            }
      }
       
}

//Si il y a une collision, donc si il n'y a pas de place, on arrete Namcap
repeat (Myspeed)
    { 
        if(place_snapped(32,32) && !place_free(x+lx[direction div 90], y + ly[direction div 90]))
        {           
                speed = 0
                Coll = 1 // Variables de debug affichant si il y a une collision ou non ( 1 = oui 0 = non )
                not_place_free_X =x+lx[direction div 90]
                not_place_free_Y = y + ly[direction div 90]     
                x += lx[direction div 90]
                y += ly[direction div 90]
        } 
    }       
//Gestion du fait que Namcap rentre en collision avec des "Balles"
//Lors il rencontre l'objet Namcap_dot_obj alors on execute ce code dans l'instance rencontréé( grâce a son ID)
//et on détruit l'instance en rajoutant des point a chaque fois.
with (Namcap_dot_obj)
    {
        if place_meeting(x,y, Namcap_obj)
            {
                instance_destroy()
            }
    }


Malheusement, mon problème persiste, peut tu me guider quand au placement de cette fonction dans mon code ?

PS : la valeur de la variable 'Myspeed' est égal a 3 est incorporé dans l'événement create de l'objet Namcap.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

Namcap Empty
MessageSujet: Re: Namcap   Namcap EmptyLun 26 Déc 2011 - 20:40

Bon voila ce que j'aurais fait :

#create
Code:
key[0]=vk_right  key[1]=vk_up
key[2]=vk_left  key[3]=vk_down
for(i=0; i<4; i+=1) {
    lx[i]=lengthdir_x(1, i*90)
    ly[i]=lengthdir_y(1, i*90)
}
myspeed = 0
SPEED = 3
dir = 3

sprite[0] = Namcap_R_spr
sprite[1] = Namcap_H_spr
sprite[2] = Namcap_L_spr
sprite[3] = Namcap_B_spr

#step
Code:
getdir()

repeat(myspeed) {
  getdir()
  if(place_free(x+lx[dir], y+ly[dir])) {
    x += lx[dir]
    y += ly[dir]
  }
}

if(place_snapped(16, 16) && !place_free(x+lx[dir], y+ly[dir]))
    myspeed = 0

#script getdir
Code:
for(i=0; i<4; i+=1) {
  if(keyboard_check(key[i]) && place_snapped(16, 16)) {
    if(place_free(x+lx[i], y+ly[i])) {
        dir = i
        myspeed = SPEED
        sprite_index = sprite[i]
        break
    }
  }
}

De tête ça devrais marcher Wink

_________________
Namcap Runningpotato1Namcap TvF6GED Namcap MdetltS
Revenir en haut Aller en bas
Shrom
Débutant



Messages : 18

Namcap Empty
MessageSujet: Re: Namcap   Namcap EmptyMar 27 Déc 2011 - 13:18

Merci onilink_ !!!

J'ai adapter ta solution a mon contexte, et cela fonctionne parfaitement ! Smile

désolé du dérangement...
Revenir en haut Aller en bas
Contenu sponsorisé





Namcap Empty
MessageSujet: Re: Namcap   Namcap Empty

Revenir en haut Aller en bas
 
Namcap
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Entraide débutants-
Sauter vers: