Salut,
Ton jeu est vraiment génial je ne savais pas qu'on pouvait faire quelque chose d'aussi bien avec DB Pro. Félicitation et bonne continuation pour ton projet. Seulement combien de temps ta t-il falu pour arriver ou tu en est?
merci.
Pour la partie Prog ça fait 1 an que j'ai DBpro donc 1 an sinon entre le scenar, les quêtes, les model, etc... ça va faire bientot 3 ans
pour limiter le nombre d'objet à l'ecran je fais comme ceci :
tout mes objets sont referencé dans un tableau
autour de mon perso principal je cré une sphere de x de diametre qui represente la zone visible.
ensuite je passe tout mes objet en revue et test une colision entre eux et la sphere si ils sont en colision je les montre (show object) sinon je les caches (hide object) pour les gros gros objets (genre ville entiere) je les supprime carement et les recrés quand ils sont dans la zone visible.
Pour le FPS je l'ai bloqué à 30 afin que le jeu soit jouable sur un max de machine
autre petit truc important pour la viesse tout les objets multiples qui ne sont pas soumis à colision ou mouvement sont des instances, pour les autres c'est des clones, je ne sais pas trop comment tu as fais tes arbres par exemple, mais il n'est pas utile de tester une colision avec le feuillage par exemple, donc tu peux diviser ton arbres en deux parti le tronc qui sera un clone et le feuillage une instance.
pour les colisions c'est pareil je cré une sphere de colision autour du perso, puis je test une colision grossiere entre les objets et cette sphere et si il y a colision je teste alors une colision plus poussée.
Voilà le principe
pour la carte elle est faite en une seule fois, enfin pour cette version, pour l'autre version il y aura 12 carte de la taille de celle-ci qui seront chargées independament.
Pour ton systeme, dbpro le fait automatiquement. Il ne supprime pas les objets mais ne les affiches pas quand il sont en dehors de l'ecran.
Si tu n'es pas sur la version 5.8, tu peux faire un petit test : crée une sphere et scale la de 200. Tournes la camera de facon a avoir la sphere dans un coin et surprise ! elle disparait alors qu'elle devrait etre affichée. Ce bug vient du fait que la boite englobante des objets n'est pas mise a jour avec scale object. Il met bien en evidence le fait que les objets se cachent quand ils n'ont plus besoin d'etre affichés.
Sinon, quelques conseils pour ameliorer le jeu :
- Ne pas calculer pick object (je pense que c comme ca que tu fais la selection des personnages) a chaque boucle, fais le juste a chaque click.
If mouseclick()=1
if mouse=0
mouse=1
pick object()
endif
else
mouse=0
endif
Ce petit code oblige a lacher la souris avant de pouvoir recommencer a selectionner.
- Je sais pas si ca a été fait, mais le must pour un jeu, c'est la temporisation : au lieu de baser la vitesse jeu sur le sync rate, base le sur le timer. Tu pourras avoir un fps beaucoup plus haut sans alterer la vitesse du jeu.
Voila un petit exemple de jeu basé sur le timer. Ce genre de jeu aurai été impossible a jouer s'il etait basé sur les boucles : 1 joueur + 9 alliés contre 100 ennemis avec 80 de fps ;)
randomize timer()
sync on
set display mode 640,480,32
rem sync rate
rate#=100
rem frequence
s#=(1000.0/rate#)
global delta#
rem texture des bombes
for x=0 to 32
for y=0 to 32
ink rgb(255,128+rnd(127),0),0 : dot x,y
next y
next x
get image 1,0,0,32,32
rem texture du sol
for x=0 to 32
for y=0 to 32
ink rgb(0,32+rnd(64),0),0 : dot x,y
next y
next x
get image 2,0,0,32,32
make matrix 1,10000,10000,50,50 : prepare matrix texture 1,2,1,1
randomize matrix 1,100 : update matrix 1
tours=10
global bullets:global delai:global life
bullets=10
delai=750
life=bullets*delai
rem Tours
dim tour(tours)
dim x(tours)
dim y(tours)
dim z(tours)
dim ax#(tours):dim ay#(tours)
dim delai#(tours)
dim current(tours)
dim vies(tours)
dim target(tours)
dim time(tours)
dim bullet(tours,bullets)
dim life#(tours,bullets)
rem Ennemis
ennemis=100
dim ennemi(ennemis)
dim ex(ennemis)
dim ey(ennemis)
dim ez(ennemis)
dim vitesse(ennemis)
dim bombe(ennemis)
dim explode(ennemis)
dim mort(ennemis)
dim fini(ennemis)
for o=1 to tours
vies(o)=100
tour(o)=free_obj()
make object sphere tour(o),100
x(o)=rnd(8000)+1000:z(o)=rnd(8000)+1000:y(o)=get ground height(1,x(o),z(o))+50
position object tour(o),x(o),y(o),z(o)
ay#(o)=rnd(360)
current(o)=1
for b=1 to bullets
bullet(o,b)=free_obj()
make object cube bullet(o,b),10 : color object bullet(o,b),rgb(0,0,255) : set object light bullet(o,b),0
next b
next o
for e=1 to ennemis
ennemi(e)=free_obj()
make object box ennemi(e),100,80,180
ex(e)=rnd(8000)+1000:ez(e)=-2000-rnd(8000):ey(e)=350+rnd(450)
position object ennemi(e),ex(e),ey(e),ez(e)
vitesse(e)=rnd(500)+800
bombe(e)=free_obj()
make object sphere bombe(e),40,6,6
next e
tour=1
start=timer():oldtime=start
fog on : fog distance 3500 : fog color 0 : set camera range 1,4000
ink rgb(192,192,192),0
set text font "arial",1
rem code pas con du tout trouvé sur le forum anglais
make memblock 1, 640*480*4+12
write memblock dword 1, 0, 640
write memblock dword 1, 4, 480
write memblock dword 1, 8, 32
for i=12 to (640*480*4+11) step 4
write memblock byte 1, i, 0 :`Blue
write memblock byte 1, i+1, 0 :`Green
write memblock byte 1, i+2, 0 :`Red
write memblock byte 1, i+3, 85 :`Alpha
next i
make image from memblock 100, 1
backdrop off
do
fps=screen fps()
mx#=mousemovex()+mx#
my#=mousemovey()+my#
mc=mouseclick()
tabu=keystate(15)
time=timer()
if time=>start+s#
paste image 100,0,0,1
set cursor 0,0 : print "fps : ",fps,"/",int(rate#)
delta#=(time-oldtime)/1000.0
oldtime=timer()
dist=(x#-x(tour))^2+(z#-z(tour))^2+(y#-y(tour))^2
x#=curvevalue(x#,x(tour),1.2):y#=curvevalue(y#,y(tour),1.2):z#=curvevalue(z#,z(tour),1.2)
ax#=curveangle(ax#,ax#(tour),1.5)
ay#=curveangle(ay#,ay#(tour),1.5)
amorts=0
rem si on est a l'interieur
if dist<10000
if vies(tour)>0
ax#(tour)=wrapvalue(ax#(tour)+my#*0.2)
ay#(tour)=wrapvalue(ay#(tour)+mx#*0.2)
if mc=1
shoot(tour)
endif
print "vies : ",vies(tour)
else
for b=1 to 20
y=rnd(480)
box 0,y,640,y+1
next b
endif
endif
rem TOURS
for t=1 to tours
rem IA des alliés
if vies(t)>0
if t<>tour
if time>time(t)+1000+rnd(1000)
value=rnd(1):time(t)=time
for en=1 to ennemis-1 step 2
e=en+value
dist#=(x(t)-ex(e))^2+(z(t)-ez(e))^2
if dist#<300000
target(t)=en : exit
else
target(t)=0
endif
next en
endif
if target(t)>0
point object tour(t),ex(target(t)),ey(target(t)),ez(target(t))+rnd(vitesse(target(t)))
ax#(t)=wrapvalue(object angle x(tour(t)))
ay#(t)=wrapvalue(object angle y(tour(t)))
shoot(t)
endif
endif
else
inc amorts
endif
rem Gestion des tirs
delai#(t)=delai#(t)-delta#*1000
for b=1 to bullets
if life#(t,b)>0
bu=bullet(t,b)
dec life#(t,b),delta#
for p=1 to 10
move object bu,delta#*100
bx=object position x(bu):by=object position y(bu):bz=object position z(bu)
for e=1 to ennemis
if fini(e)=0
if bx=>ex(e)-60 then if bx<=ex(e)+60
if by=>ey(e)-45 then if by<=ey(e)+45
if bz=>ez(e)-100 then if bz<=ez(e)+100
life#(t,b)=0 : mort(e)=1 :hide object bu : exit
endif
endif
endif
endif
next en
next p
endif
next b
next t
rem changement de tourelle
if tabu=1
if tab=0
tab=1 : inc tour
if tour>tours then tour=1
endif
else
tab=0
endif
position camera x#,y#,z# : rotate camera ax#,ay#,0
rem ENNEMIS
emorts=0
for e=1 to ennemis
if fini(e)=0
move object ennemi(e),delta#*vitesse(e)
ex(e)=object position x(ennemi(e)):ey(e)=object position y(ennemi(e))-mort(e)*delta#*450:ez(e)=object position z(ennemi(e))
if mort(e)>0 then roll object right ennemi(e),(-1)^(e)
if ez(e)=>12000 then ez(e)=0-rnd(2000)
if ey(e)<get ground height(1,ex(e),ey(e)) then ey(e)=get ground height(1,ex(e),ey(e)) : fini(e)=1 : hide object bombe(e)
position object ennemi(e),ex(e),ey(e),ez(e)
px=object position x(bombe(e)):pz=object position z(bombe(e))
py=object position y(bombe(e))
if py<=get ground height(1,px,pz)
if explode(e)<=400
if explode(e)=0
ghost object on bombe(e) : texture object bombe(e),1 : set object light bombe(e),0
for t=1 to tours
bdist=(x(t)-px)^2+(z(t)-pz)^2
if bdist<=30000
dec vies(t),30+rnd(25)
if vies(t)<=0 then color object tour(t),0
endif
next t
scale object bombe(e),400,400,400
else
if explode(e)=>380 then if object visible(bombe(e))=1 then hide object bombe(e)
endif
inc explode(e),delta#*1250
else
if rnd(100)=0
position object bombe(e),ex(e),ey(e),ez(e):scale object bombe(e),100,100,100
ghost object off bombe(e):color object bombe(e),rgb(255,255,255) : set object light bombe(e),1
explode(e)=0:show object bombe(e)
endif
endif
else
position object bombe(e),px,py-delta#*750,pz+delta#*vitesse(e)
endif
else
inc emorts
endif
next e
print emorts," ennemi(s) ont été tués"
print amorts, " allié(s) sont morts"
rem fin de la boucle
mx#=0 : my#=0
sync
start=time
endif
loop
function shoot(tour)
if delai#(tour)<=0
delai#(tour)=delai
b=bullet(tour,current(tour))
position object b,x(tour),y(tour),z(tour):rotate object b,ax#(tour),ay#(tour),0
move object down b,5 : move object b,20
life#(tour,current(tour))=life
delai#(tour)=delai:show object b
inc current(tour)
if current(tour)>bullets then current(tour)=1
endif
endfunction
function free_obj()
for o=1 to 65535
if object exist(o)=0 then exit
next o
endfunction o
Enfin voila, bonne chance et bonne continuation pour ton projet :)
non non, je l'avais pas utilisé, je connaissait pas encore trop cette methode. Pour l'impletner maintenant, il faudrait presque tout recommencer :(.
c'est ce que je me disait pour GOO, celui - ci étant casi fini il reste juste la 3D à terminée et certains perso, mais pour la version II je vais essayer voir
skorpio640
22/05/2005, 13h46
Salut steph, :00000023:
je travaille moi aussi sur un projet en ce moment (un MMORPG) avec un autre moteur qu'Ogre, mais je suis bon en orthographe et sa me désole de voir des fautes d'orthographes ^^
Ce que je te propose, c'est de corriger les dialogues ; tu me les fournis sous .doc ou .txt, tu organises tout, je corrige les fautes, et je te renvoie le fichier :00000025:
Tu peux me l'envoyer à l'adresse dragonlords@hotmail.fr, cette adresse fait aussi office de messagerie MSN (mais je suis un peu surbooké en ce moment)
Sinon, je te félicites pour le travail accompli, les screens rendent très bien, je me demandais si sa existait des projets en darkbasic aussi abouti, et c'est le seul que j'ai vu :00000001: pratiquement...
PS : moi aussi je programmais en darkbasic, et je n'ai jamais réussi à faire un ciel potable, lol ^^
PS2 : tu en es ou actuellement de ton jeu ? Et sinon pourrais tu mettre en plein écran ^^ ? Le perso marche trop leentement, je trouve... Par contre il court très vite ^^
Amicalement,
Skorpio640, le correcteur ambulant ^^
skorpio640
22/05/2005, 18h42
Sinon je suis aussi intéressé par les animations des persos, j'ai tout le matos et l'envie de me tester dessus (je suis débutant en la matière, mais avec les modèles déjà fait, pas de probs à animer...), donc si les modèles sont différents de "l'ancienne" version de GOO, dis le moi rapidement... ^^ :00000015:
pour les dialogues des npc ils ne sont pas encore finalisés , mais je pense que dés que cela sera fait ton aide seras la bienvenue :). Là je viens de refaire tout l'editeur pour tout gérer depuis celui-ci (décors, npc, monstres, objets, effets, quêtes, etc...) donc la partie n'a pas évolué, mais l'éditeur étant casi fini (juste une bricole à droite à gauche) ça va repartir à fond, le temps de créer quelques décors en 3D.
Par contre de nombreuses modif sont déjà en place mais pas dispo en téléchargement (le jeu est en plein écran, les effets de magies sont là, le jeu est plus fuilde, et les colisions meilleures)
vBulletin® v.3.6.5, Copyright ©2000-2009, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org