Log In  
Page:
1
2

Cart #tresorduparchemin-16 | 2024-03-10 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
7

Cart #tresorduparchemin-14 | 2024-02-28 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
7

Cart #tresorduparchemin-9 | 2024-02-10 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
7

Cart #tresorduparchemin-0 | 2024-02-09 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
7

Le tresor du parchemin

Jeu d'aventure

Introduction au jeu :

cela fait 8 ans que le dr.barns a entendu parler d'un trésor : Le trésor du parchemin.

Après de multiples recherches, le dr.barns a enfin réuni assez d'informations pour localiser le parchemin à l'est de la seine et marne, au scaab's museum. Le dr.barns est arrivé par avion lundi matin...tout commence ici !

Instructions :

C : pour valider le menu
Dans le jeu touche C pour l'inventaire

Flèches du clavier pour se déplacer / X : pour effacer le message

P#141368 2024-02-10 15:56 ( Edited 2024-03-10 10:31)

1

Salut @Mitch714, le jeu est principalement en francais avec quelques mots en anglais (Keys, Play ,Story).
Possibilité de softlock avec les clefs.
La clef noire derrière le chien ne semble pas utile : on peut obtenir les outils en passant par derrière. La pièce devant le personnage rose n'est pas ramassée à l'aller, seulement au retour.
Plutot que de demander au joueur de redémarrer pico-8, tu peux le faire dans ton code avec extcmd("reset")

P#142235 2024-02-29 23:58

salut @RealShadowCaster
merci pour ton soutien et ton aide.
Concernant le mélange français anglais je vais modifier.

Concdernant le softlock (je ne sais pas ce que c'est) peux tu m'aiguiller.

Concernant les outils, as tu utilisé la dernière version ? car on ne peut pas passer par derrière pour récupérer les outils.

Concernant la pièces effectivement j'ai un problème, il va falloir que je regarde.

Concernant le code pour faire le run, je le met comment dans le code ? et à quel endroit ?

Merci pour tes futurs réponses.

P#142254 2024-03-01 08:32 ( Edited 2024-03-01 08:33)

Un hard lock, c'est quand le jeu ne réponds, plus, par exemple, tu apelle une fonction inexistante à cause d'une faute de frappe, et pico-8 plante. Un soft lock, c'est quand le code est bon et continue à fonctionner comme prévu, mais le joueur se retrouve sans moyen de progresser dans le jeu. Il s'agit en général d'une erreur de design.
Par exemple, dans les RPG, certains objets sont "de quête" et ne peuvent pas être jettés (genre la clé du donjon du boss final), et d'autres peuvent l'être (genre potions de soin ou armes, mais pas l'épée spéciale unique qui est la seule à pourvoir faire du dégat sur le boss final) pour faire de la place dans l'inventaire. Si tu oublie de mettre le flag "objet de quête" sur la clé du donjon, le joueur qui s'en débarasse et n'a pas de moyen d'en trouver une autre et est soft-lock.

Dans ton jeu :
Prendre les 2 clés de départ (+2 clés)
Aller 2 fois à droite (-2 clés)
prendre la clé en haut (+1)
ouvrir la pièce du bas (-1)
prendre la corde
utiliser la corde (+1)
ouvrir la 2eme pièce du bas (-1)
On a accès à la planche, au marteau, aux outils (par en haut, ça marche dans la version du 28/2/2024), mais il n'y a plus de clé accessible, elles sont toutes derrière des portes fermées à clé, on est softlock.

L'appel à extcmd("reset") fait exactement la même chose que de redémarrer manuellement le jeu. Change le texte du game over, genre "GAME OVER press X to go back to menu" et appelle la commande une fois que le joueur a appuyé.
Pareil pour quand tu as gagné.

P#142257 2024-03-01 10:47

Réponse claire, merci bcp pour ton aide

P#142258 2024-03-01 10:54

Oh, une nouvelle version, cool. La camera saccadée dans la zone noire est assez désagréable. J'imagine que tu apelle map sur un carré de 5x5?

A la place, utilise clip(joueur_x-16,joueur_y-16,40,40) centré au pixel sur le joueur, suivi de map() sans paramètres, et fini par clip() pour une lumière scrollant au pixel avec le joueur.
Tu peux aussi rajouter du noir pour une lumière plus ronde.

P#142753 2024-03-11 10:26

Salut,
Effectivement j appelle MAP sur un carré de 5x5.
Ouaaaww j ai longtemps cherché un code pour éviter le saccadement.
Je n ai que quelques semaines d apprentissages et autodidacte. J essaie je tâtonne... bref !
Clip() connais pas du tout. Heureusement que tu es là.
Je vais essayer c à m a l air top.
Je me permettrais de revenir vers toi si je n y arrive pas.
Merci bcp

P#142755 2024-03-11 10:47

RealShadowCaster
Avec clip() la fluidité est présente, mais mon carré de lumière avance plus rapidement que le mouvement du joueur.

En fait, je me suis appuyé sur la technique de mouvement de personnage du RPG d'aurelien (game dev alliance). Et je bidouille avec ces mouvements là... J'ai bien compris les mouvements d'un personnage, mais pour la fluidité, sa méthode est top. Même si je ne la maîtrise pas.
Du coup je me retrouve avec des (P.x8+P.ox), des (start_ox=0, des ox=p.start_oyp.anim_t)etc , etc, ce n'est pas une simple animation. Je n'ai pas voulu modifier, et donc je pense que c'est pour cette raison que mon carré de lumière avance plus vite. Pourrais tu m'aider, en regardant mon code, ou m'orienter ?

P#142763 2024-03-11 17:04

Tu n'as pas mis en ligne ta version avec le problème de lumière qui va trop vite, du coup je ne peux pas corriger. La prochaine fois met la directement en message pour que je puisse regarder.
clip(x,y,w,h) fonctionne en pixels écran.
du coup joueur_x du code mentionné précédemment doit être la coordonné x en pixel du joueur sur l'écran. J'ai regardé le code, on a p.x qui est la coordonnée x en cases du joueur, p.ox qui est l'offset x en pixel d'un déplacement en cours entre deux cases, et camx qui est l'offset x de la caméra.
Du coup, on a joueur_x=8*p.x+p.ox-camx

ça donne

function map_noire_allumee()
 if m.x>=49 and m.x<=95 and p.lampe_torche>0
 then 
    local joueur_x,joueur_y
    joueur_x=p.x*8+p.ox-camx
    joueur_y=p.y*8+p.oy-camy
    clip(joueur_x-16,joueur_y-16,40,40)
    map() 
    clip()
 end
end

Si jamais ça ramme, il y a des optimisations possible : ne pas appeler map si la partie gauche est complètement hors champ.

P#142780 2024-03-12 05:38

Bon ! ton code marche à merveille. (il manquait le = après lampe_torche>)

Je n'étais pas loin, sauf que je mettais des codes à rallonge avec des parenthèses et je me perdais, pour essayer de faire la même chose que toi.
Tout cela parce que je n'ai pas pensé au code "local" pour éviter les longues phrases et modifier en locale.

Grâce à toi, j'ai un peu mieux analyser les mouvements du personnage, de l'offset et de la cam.
Je n'aime pas copier bêtement sans comprendre.

d'autre part, tu as éveillé ma curiosité lorsque tu as écrit :

"Tu peux aussi rajouter du noir pour une lumière plus ronde."

J'aimerais comprendre, j'ajoute du noir à quel endroit... avec pal ou palt ?

J'espère ne pas prendre trop de temps.

En tout les cas, encore merci...

P#142782 2024-03-12 07:16 ( Edited 2024-03-12 07:34)

Ou ça ? Dans map_noire_allumee(), entre map qui affiche ton carré de lumière et clip() qui remet à tout l'écran la zone dans laquelle on peut dessiner.
Tu peux rajouter du noir pour faire l'effet que tu veux.
Par ordre de difficulté :

Tu pourrais rajouter 4 carrés de 8x8 dans les coins pour une lumière "retro square".

tu pourrais utiliser circle (avec le paramètre pour colorier en noir l'extérieur du cercle) pour une lumière ronde.

Tu peux avoir un sprite de 5x5 (voire 2 pour une lumière animée) avec du noir et du transparent à afficher par dessus ton carré (palt pour que ton noir soit opaque et ton autre couleur transparente)

Tu peux colorier en noir les pixels en aléatoire avec une probabilité croissante en s'éloignant du centre du joueur pour un effet moderne
de lumière scintillante.

Tu peux faire du ray tracing pour que ta lampe n'éclaire pas derrière les murs....

P#142784 2024-03-12 08:03

Ouaaww j'adorerais pouvoir faire tout çà.

Bon, je vais essayer de résoudre les énigmes par étape. Mais ce n'est pas gagné vu mon niveau.

  • Si je résume = clip() peut être affiché en carré en cercle en retro square.

  • Si je comprends bien je peux mettre 2 fois clip() avec 2 carrés de couleurs différentes qui se supperposent.

Pour les 2 derniers cas... ça va être chaud !

P#142785 2024-03-12 08:26

Clip, ça définit un rectangle d’affichage dans l’écran. Tout ce que tu fait ensuite à l’écran n’affecte que le rectangle sélectionné.
Pour ton carré de lumière, tu fais un clip carré autour du joueur , et après tu affiche toute la map, mais du coup seule la zone autour du joueur est affectée.
Une fois que tu as fini de dessiner autour du joueur et que tu as ajouté les zones noires supplémentaires, clip sans paramètre remet la zone affectée par les affichages à tout l’écran pour que le reste des affichages fonctionnent correctement.
Pour afficher tes carrés noirs 8x8,
C’est rectfill() ou bien spr() et +palt() qu’il faut utiliser.

P#142788 2024-03-12 08:49

Désolé, mais je ne comprends pas : "pour afficher mes carrés noirs 8x8"
En fait c'est quoi l'idée.

P#142789 2024-03-12 10:01

En fait quelle que soit la modification ou l'ajout entre map() et clip(), et que ce soit en rectfill() ou en spr(), rien ne change.
Le résultat final c'est que la map (lorsque je suis dans le labyrinthe) s'assombrit (change d'ambiance), et que le carré de lumière soit plus rond, voir orienté vers la lampe. Et le top au final, faire comme dans le jeu "DARK TOMB", ou au moins s'y rapprocher, mais je n'ai pas le niveau. Donc y aller petit à petit.

Bon ! je ne t'embête pas plus,
je continue à chercher

P#142793 2024-03-12 11:07

par exemple : (je voulais par exemple modifier le contour du rectangle en ajoutant le contour en jaune)

local joueur_x,joueur_y
joueur_x=p.x8+p.ox-camx
joueur_y=p.y
8+p.oy-camy
clip(joueur_x-21,joueur_y-21,50,50)
map()
rectfill(joueur_x-21,20,joueur_y-21,20,10)
clip()

P#142794 2024-03-12 11:10 ( Edited 2024-03-12 11:11)

Vite fait sous paint, le cercle et le rayon de lumière ne serait pas aussi fin en 128x128?
C'est plus clair avec le noir ? ;)
Pas fait de preview des deux options animées.

P#142795 2024-03-12 11:23

C'est exactement ce que j'avais en tête.
J'ai beau modifier ça ne fonctionne pas. Je modifie comme ceci :

local ...
joueur_x...
joueur_y...
clip(...)
map()
je fais mes essais d'ajout de rectfill() ou spr() ici
clip()

P.S : tu me dis si je pose trop de questions, je comprendrais.

P#142796 2024-03-12 11:27 ( Edited 2024-03-12 11:28)

rectfill( x0, y0, x1, y1, [col] ) , pas w h mais x y
Donc
rectfill(joueur_x-21,joueur_y-21,joueur_x+28,joueur_y+28,10)
par exemple.

Sauf que ça va écraser ta map avec du jaune.
rect( x0, y0, x1, y1, [col] ) si tu veux juste un cadre.

Edit: ça ne marchera pas : rect et rectfill, c'est influencé par la caméra donc c'est

rectfill(8*p.x+p.ox-21,8*p.y+p.oy-21,8*p.x+p.ox+28,8*p.y+p.oy+28,10)

P#142797 2024-03-12 11:32 ( Edited 2024-03-12 11:40)

quel est le paramètre pour colorier en noir l'extérieur du cercle ?

edit : je me rapproche mais pas encore çà pour un éclairage circulaire "ambiancé".

P#142798 2024-03-12 12:16 ( Edited 2024-03-12 12:48)

Pour éliminer le coté "ambiancé", fait deux cecles noirs décalés d'un pixel, ça couvrira les pixels manquants entre deux cercles ayant le même centre et un de rayon de décalage.
Si le noir qui déborde sur le mur lumineux de l'estérieur te dérange, il faut ajuster le clip.

Le paramètre pour noircir l'extérieur du cercle est super planqué et nécessite de triturer la mémoire mappée sur le pseudo hardware :
poke(0x5f34,0x2) arme le remplissage inversé pour le prochain appel à une fonction fill, suivi de
circfill(x,y,rayon,couleur | 0x1800)

Ta solution est beaucoup plus lisible.

P#142802 2024-03-12 13:14

J'ai dû m'absenter me voila de retour.

Merci pour : "ta solution est bcp plus lisible", venus de toi, c'est flatteur.
Voilà ou j'en suis :

Je tente maintenant d'ajuster le clip, pour ajuster le débordement de la lumière.

Je testerais le poke une fois réussi

P#142805 2024-03-12 14:26

Je trouve le résultat bien mieux, j'ai pris le problème à l'envers.
D'un côté la partie gauche s'éteint et de l'autre la partie droite s'allume et inversement. Cela évite de voir les cercles noirs et de triturer la mémoire avec les pokes.

J'aimerais maintenant, faire un effet ray casting, où la lumière s'arrête au niveau des murs.
Mais alors là aucune idée, si ce n'est d'utiliser les fonctions mset() ou fpeg() et de jouer avec clip().
Pas évident

P#142810 2024-03-12 15:18

Tu peux faire du faux ray casting en te limitant à un carré de 5x5 cases autour du joueur et cherchant toutes les cases atteignables en restant dans le carré. Après tu colorie en noir les cases non atteintes. Cumule au rond, ça donne un résultat pas mal sans soir à faire de calcul de rayon lumineux.
Si tu veux faire du vrai ray casting 2D, il y a un chouette tutorial, je peux le rechercher
Edit : je l’avais en favoris
https://www.lexaloffle.com/bbs/?tid=55119

P#142822 2024-03-12 17:37 ( Edited 2024-03-12 17:42)

Yes merci
Je vais essayer ...

P#142848 2024-03-13 09:04
1

Besoin d'aide ?
Quelques indices : pour le faux ray casting, faire du 4-way flood fill sur une grille de 5x5 autour du joueur.
Pour du vrai ray casting, tu as 12 rayons à calculer pour couvrir un 5x5 autour du joueur.

P#142922 2024-03-14 14:46

Salut,
je n'étais pas dispo hier.
Mais j'ai tout de même essayer de réaliser du faux ray casting.
Et je n'y arrive pas,

J'étais partie sur la logique suivante :

coordonnées X et Y du joueur c'est le centre.
Autour de ces coordonnées il y a des cases : les cases du sol et les cases du mur.
Lorsque le joueur se déplace le clip() ici en 50,50 diminue si il touche ou non un mur.
Le problème c'est que je n'y arrive pas parce que le code complet du clip, n'est pas une lettre ou un chiffre... Difficile à expliquer.

Ensuite je suis partie sur le mget du style :

--allumer la lumiere
function map_noire_allumee()
local ray_lu=mget(m.x,m.y-1)==59 (59 étant le mur)
if m.x>=49 and m.x<=95 and p.lampe_torche>=0
and ray_lu
then clip(joueur_x-21,joueur_y-21,40,40)

mais je n'y arrive pas non plus...
Peux tu m'aiguiller ?

P#143070 2024-03-15 08:40

Pour ta réponse au dessus, on est dans les mathématiques pures...
Je comprend le principe mais pour le mettre sur le papier, c'est autre chose. Diviser le cercle, c'est chaud

P#143071 2024-03-15 08:42

Le problème se trouve ici :

P#143073 2024-03-15 08:59

Clip déinit un rectangle d'affichage, tout ce que tu dessines hors du rectangle actif est sans effet. Le clip est déjà en place autur du joueur, il n'y a rien de plus à faire de ce coté là.
Ce qu'il reste à faire, c'est dessiner du noir par dessus le carré autour du joueur, ce que tu a déjà fait avec tes cercles par exemple.
Pour le faux ray casting :

Avec fget, tu te fabrique un tableau 5x5 en regardant quelle tuile a le flag "solide"
Pour un meilleur rendu, tu peux rajouter un flag "bloque la lumière".
Comme ca donald peut avoir le flag "solide" mais quand même ne pas bloquer la lumière, histoire de pouvoir voir les murs derrière lui quand tu lui fait face.

00011
11011
01010
01010
11010

Avec 4-way flood fill tu trouves les case visibles

11110
11110
01110
01110
01110

Avec ça tu noircis les case non visibles. (2eme image)
Puis tu rajoute les cercles noirs (3eme image)

C'est pas aussi classe que du vrai ray casting, mais ça rend déjà pas mal.

P#143075 2024-03-15 09:27

Je vais faire une course,
et j'essayerais à mon retour de traduire en code ce que tu m'expliques.

P#143077 2024-03-15 09:35

Avec fget, tu te fabrique un tableau 5x5 en regardant quelle tuile a le flag "solide"

Je t'avoue que déjà à ce niveau je suis bloqué. Je comprend bien les 1 et les 0 dans ton explication mais fabriquer un tableau avec fget, je ne comprends pas.

de ce type :
RAY_LUM = {
{0,0,0,1,1},
{1,1,0,1,1},
etc...
}

du coup, je ne peux pas m'amuser à faire le labyrinthe entier...

P#143103 2024-03-15 13:07 ( Edited 2024-03-15 13:09)

Dans ton jeu, le flag 0 est celui qui dit si une tuile est solide.
Dans un premier temps, tu peux utiliser ça pour savoir si la tuile bloque la lumière (mais du coup donald bloquera aussi la lumière)
le joueur est en p.x p.y sur la map.
Le joueur est en 3 3 (au milieu) dans le tableau RAY_LUM
pour mettre à jour la case du tableu à droite du joueur, ça serait
flag=0
RAY_LUM[3][4]=fget(mget(p.x+1,p.y),flag)

Tu prends le numéro de tuile de la map avec mget, et tu lis le flag 0 de la tuile avec fget.
Il me semble même que tu a déja quelque part une fonction pour récupérer un flag à partir des coordonnées en tuiles dans la map.
Pour mettre tout ça dans un tableau, il faut faire deux boucles imbriquées.

P#143108 2024-03-15 13:22 ( Edited 2024-03-15 13:23)

Dans ton jeu, le flag 0 est celui qui dit si une tuile est solide : COMPRIS

Dans un premier temps, tu peux utiliser ça pour savoir si la tuile bloque la lumière (mais du coup donald bloquera aussi la lumière) : COMPRIS

le joueur est en p.x p.y sur la map : COMPRIS
Le joueur est en 3 3 (au milieu) dans le tableau RAY_LUM : COMPRIS la position du joueur en 3 3 sur un carré de 5 X 5. Tu veux dire que le carré allumé se modifie à chaque mouvement du joueur ?

pour mettre à jour la case du tableu à droite du joueur, ça serait
flag=0 : COMPRIS

RAY_LUM[3][4]=fget(mget(p.x+1,p.y),flag) : Donc là, tu écris que la case à droite du joueur est un flag 0 si je comprends bien

Tu prends le numéro de tuile de la map avec mget, et tu lis le flag 0 de la tuile avec mget : COMPRIS

Il me semble même que tu a déja quelque part une fonction pour récupérer un flag à partir des coordonnées en tuiles dans la map : oui effectivement, c'est FUNCTION INTERACT(X,Y)

Pour mettre tout ça dans un tableau, il faut faire deux boucles imbriquées : PAS COMPRIS

P#143115 2024-03-15 13:53

A chaque frame, il faut recalculer les cases à noircir, donc reconstruire le tableau de 5x5.

mget(p.x+1,p.y) ca renvoie le numéro de tuile à droite du joueur, ici c'est un mur dans l'exemple.
fget(mur,0) renvoie 1, la tuile à droite est solide et va arrêter la lumière.
RAY_LUM[3][4]=1
on a rempli une des 25 cases du tableau.

La fonction de ton jeu qui récupére un flag à partir de coordonnées sur la map, c'est check_flag(flag,x,y)
ça renvoie true ou false.

Comme on veut remplir toutes les cases ça donne

for ligne=1,5 do
  RAY_LUM[ligne]={}
  for colonne=1,5 do
    RAY_LUM[ligne][colonne]=check_flag(0,p.x+colonne-3,p.y+ligne-3)
  end
end

Apres ça il te faut un autre tableau de 5x5 dans lequel tu marque les cases à éclairer. (4-way flood fill.)
Les cases no solides éclairées propagent la lumière, les case solides peuvent être éclairées mais ne propagent pas.

P#143119 2024-03-15 14:30

Tu vas me prendre pour un idiot, mais je pige le sens en gros mais je ne sais pas dans quel ordre.
Pour essayer, j'ai fait ça. Je sais que ça ne peut pas marcher, puisque je ne dessine pas les carrés, mais avec quoi je doit dessiner ?

function map_noire_allumee()
   ray_lum = {
{0,0,0,1,1},
{1,1,0,1,1},
{0,1,0,1,0},
{0,1,0,1,0},
{1,1,0,1,0}
}  
 if m.x>=49 and m.x<=95
  then
   for ligne=1,5 do
    ray_lum[ligne]={}
     for colonne=1,5 do
      ray_lum[ligne][colonne]=check_flag(0,p.x+colonne-3,p.y+ligne-3)
     end
   end

    local joueur_x,joueur_y
    joueur_x=p.x*8+p.ox-camx
    joueur_y=p.y*8+p.oy-camy 
    clip(joueur_x-21,joueur_y-21,50,50)
    map()   
    map(0,0,0,0,0,0)
    clip() 
 end 
end
P#143127 2024-03-15 15:14 ( Edited 2024-03-15 17:14)

J'ai tellement tenté de choses différentes que je suis perdu...

P#143161 2024-03-15 17:09

Tu as sauté l'étape 1, ce que j'avais appelé "retro square" où on mettait juste en noir les 4 cases des coins.
Je l'ai déja mentionné, mais pour dessiner un rectangle noir, c'est rectfill(), regarde dans les messages précédants, j'avais mis un exemple.
Commence par mettre "en dur" 2-3 carrés dont au moins un pas sur la diagonale pour être sur que tu as bien compris les paramètres (met une autre couleur que du noir pour mieux voir ce qui se passe pour commencer) , et après essaie de colorier en fonction du tableu 5x5, par exemple colorie en bleu tous les solides.Tu peux aussi les encadrer avec rect() pour mieux voir si tu encadre bien ce que tu voulais.

la ligne map(0,0,0,0,0,0) ne fait rien du tout, ça affiche zéro lignes et zéro colonnes de la map...
https://pico-8.fandom.com/wiki/Map

Un truc très utile : printh() te permet d'afficher des variables dans une fenêtre texte ou dans un fichier.

Une fois que tu as ça qui marche, l'etape suivante de fabriquer le tableau 5x5 des cases eclairées est plus difficile, on en reparle quand tu arrivera à colorier des cases en fonction de ray_lum.

pour rappel, check_flag renvoie un booléen (true/false)
tu peux faire
if (check_flag(......)) then
-- code pour tuile solide
else
-- code pour tuile non solide
end

P#143168 2024-03-15 17:40

ok super de me réorienter, je me suis perdu...
Je reprends et je rebosse dessus
Mille merci

P#143184 2024-03-15 19:18

Salut,

je reprends là ou je m'étais arrêté.
J'ai dessiné les 4 carrés avec rectfill (jaune) dans un premier temps.

je vais maintenant essayer de colorier en fonction du tableau 5x5, colorier en bleu tous les solides

P#143332 2024-03-16 16:53 ( Edited 2024-03-16 16:54)

Trop trop content,
j'ai compris
j'en suis à l'étape 2

C'est bon pour toi ?

mon code :

--allumer la lumiere 
function map_noire_allumee()
 if p.x>=49 and p.x<=95 and p.lampe_torche>=0
  then 
    local joueur_x,joueur_y
    joueur_x=p.x*8+p.ox-camx
    joueur_y=p.y*8+p.oy-camy
    clip(joueur_x-21,joueur_y-21,50,50)
    map()   
--dessiner carres
if check_flag(0,p.x+1,p.y)
 then --droite
 rectfill(p.x*8+(1*8)+p.ox,p.y*8+p.oy,p.x*8+(2*8)+p.ox,p.y*8+(8*1)+p.oy,10)
end
if check_flag(0,p.x-1,p.y)
 then --gauche
 rectfill(p.x*8-(1*8)+p.ox,p.y*8+p.oy,p.x*8+p.ox,p.y*8+(8*1)+p.oy,10)
 end  
if check_flag(0,p.x,p.y-1)
 then --haut
 rectfill(p.x*8+p.ox,p.y*8-(8*1)+p.oy,p.x*8+(1*8)+p.ox,p.y*8+p.oy,10)
end
if check_flag(0,p.x,p.y+1)
 then --bas
 rectfill(p.x*8+p.ox,p.y*8+(8*2)+p.oy,p.x*8+(8*1)+p.ox,p.y*8+(8*1)+p.oy,10)
end
   clip() 
 end
end
P#143343 2024-03-16 17:29 ( Edited 2024-03-16 17:33)

Je sais que ce n'est pas çà

mais je pense, avoir rempli le contrat.
J'attends de tes nouvelles pour continuer...

Je ne maîtrise pas le tableau 5X5, en fait, je ne comprends pas le principe.

P#143351 2024-03-16 17:57

Bon début mais regarde attentivement ce qui se passe :
On cherche à surligner des cases. Tes carrés semblent avoir un pixel de coté de trop. On voit aussi que le surlignage suit le joueur au pixel. Essaye de surligner avec rect, tu verra mieux. Tu ajoute probablement p.ox et p.oy aux coordonnées des carrés, on veut rester au pixel sur les cases même si le joueur se déplace, au final on traitera tout son entourage de toute manière.

Normalement, le tableau 5x5 (7x7 si tu garde le carré actuel) doit pouvoir te servir pour surligner tout les solides autour du joueur.
Une fois que tu aura résussi ça (c'est juste pour s'entrainer et mieux comprendre), on pourra voir comment obtenir le tableau des case à noircir à partir de ce premier tableau.
Ensuite, il restera à colorier en noir les cases à noircir, ce qui sera très similaire au coloriage en jaune des solides de l'étape d'avant.
N'hésite pas à poser des questions, de poster du code, voir même ton WIP (work in progress): tu peux faire save @clip et poster direct ta version de test dans ton message.

P#143361 2024-03-16 19:20

Salut,

j'ai corrigé les petites erreurs, oté les p.ox et p.oy et utilisé des boucles for pour ne pas écrire chaque ligne. Je l'ai réalisé en rect pour plus de compréhension, est ce que c'est ok ?

voici le code :

--allumer la lumiere 
function map_noire_allumee()
 if p.x>=49 and p.x<=95 and p.lampe_torche>=0
  then 
    local joueur_x,joueur_y
    joueur_x=p.x*8+p.ox-camx
    joueur_y=p.y*8+p.oy-camy
    clip(joueur_x-21,joueur_y-21,50,50)
    map()   
  for droite=1,5 do
   if check_flag(0,p.x+1,p.y)
    then --droite
     rect(p.x*8+8,p.y*8,p.x*8+(droite*8),p.y*8+8,10)
   end
  end
  for gauche=1,5 do
   if check_flag(0,p.x-1,p.y)
    then --gauche
     rect(p.x*8-(gauche*8),p.y*8,p.x*8,p.y*8+8,10)
   end 
  end
  for haut=1,5 do
   if check_flag(0,p.x,p.y-1)
    then --haut
     rect(p.x*8,p.y*8-(haut*8),p.x*8+(1*8),p.y*8,10)
   end 
  end
  for bas=1,5 do
   if check_flag(0,p.x,p.y+1)
    then --bas
     rect(p.x*8,p.y*8+(bas*8),p.x*8+(8*1),p.y*8+(8*1),10)
   end 
  end
  clip()
 end
end
P#143464 2024-03-17 09:24 ( Edited 2024-03-17 09:24)

Presque, tu vois sur le gif animé que le sac à dos cache un bout du cadre, ça confirme que t’es carrés sont un pixel trop gros.

Maintenant il four faire le remplissage de ton tableau 5x5 ou 7x7, puis te parcourir le tableau pour surligneur les solides.
Un fous que tu auras ça, il restera la construction du tableau des cases à éclairer

P#143467 2024-03-17 09:49

Effectivement un pixel de trop à gauche et en haut, c'est rectifié :

Maintenant comment faire le remplissage du tableau ?

avec la même méthode et ligne par ligne ?

P#143473 2024-03-17 10:07 ( Edited 2024-03-17 10:08)

Regarde le gif, quand le personnage est en haut à gauche du panneau, les surlignages devraient se toucher par le coin.
Ecrit une fonction surligner_tuile(tuile_x,tuile_y) et utilise la dans tes appels, comme ça une fois que c'est OK, c'est bon partout.

Pour le tableau, tu as déja un code qui te remplis ray_lum.
écrit une fonction
surligner_tableau(t,tuile_x,tuile_y,valeur_a_surligner)
qui reçois un tableau 5x5 (7x7?), les coordonnées en tuiles du centre, et la valeur v à surligner, et surligne les cases.

Vérifie que
surligner_tableau(ray_lum,p.x,p.y,true) marche,
ainsi que
surligner_tableau(ray_lum,p.x,p.y,false)
marchent.

Ensuite écrit
cases_a_eclairer(t)
qui recoit un tableau et en renvoie un autre avec les cases à éclairer.

Dans un premier temps, fait des transformations simples, genre miroir horizontal,
et vérifie que
surligner_tableau(cases_a_eclairer(ray_lum),p.x,p.y,true)
te surligne bien les cases en miroir des vrais solides.
Une fois que tu as ça, on passera ensemble à un vrai cases_a_eclairer(t)

Il y a 2 methodes très différente pour cases_a_eclairer : itératives 3 boucles et récursive, on en reparle après.

P#143545 2024-03-17 17:53

@Mitch714, j'espère que ça va et que je ne t'ai pas découragé. Comme d'hab, n'hésite pas à demander des clarifications ou de l'aide.
Si tu en as marre des éclairages et que tu veux passer à autre chose, pas de souci non plus. ( La version en rond lumineux est déjà pas mal )

P#144028 2024-03-21 11:42

Salut
C est juste que je n ai pas le temps. Je suis en travaux en même temps
Mais je n heusiterais pas
Tk merci

P#144031 2024-03-21 12:06

@RealShadowCaster

J'espère que tu vas bien.
Quelques news, toujours en plein travaux... Montage atelier, serre et puit... Bref ! Tout çà pour dire que je n'ai pas encore de temps pour mettre à jour mon jeu. Mais je serais toujours friand d'aides une fois terminé.
À bientôt

P#146141 2024-04-09 09:29 ( Edited 2024-04-09 09:30)
Page:

[Please log in to post a comment]