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
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")
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.
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é.
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.
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
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 ?
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.
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...
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....
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 !
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.
Désolé, mais je ne comprends pas : "pour afficher mes carrés noirs 8x8"
En fait c'est quoi l'idée.
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
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.y8+p.oy-camy
clip(joueur_x-21,joueur_y-21,50,50)
map()
rectfill(joueur_x-21,20,joueur_y-21,20,10)
clip()
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.
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.
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)
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é".
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.
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
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
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
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.
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 ?
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
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.
Je vais faire une course,
et j'essayerais à mon retour de traduire en code ce que tu m'expliques.
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...
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.
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
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.
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 |
J'ai tellement tenté de choses différentes que je suis perdu...
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
ok super de me réorienter, je me suis perdu...
Je reprends et je rebosse dessus
Mille merci
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
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 |
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.
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.
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 |
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
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 ?
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.
@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 )
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
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
[Please log in to post a comment]