la 3d avec 3dgc c'est pas de la 3d...beauregard a écrit :non, je ne compte pas me mettre à la vrai 3D, car j'ai déjà essayé avec 3dgc, et j'en est conclu que c'était encore trop tôt. Et puis, quand je vois le succès de jeu gameboy, certains à peine relifté avec le mot "new" placer devant le titre ( et se vendant comme des petits pains)... Je me suis dit que finalement, on pouvait faire des choses intéressantes en 2D.Cpl.Bator a écrit :Beauregard , tu veut de la 3D :
http://www.purebasic.fr/french/viewtopi ... 9&start=15
Et c'est pourquoi je développe un jeu de plate-forme 2D, comme eric chahi ( seul dans ma chambre), sauf que manque de pot, je ne suis pas un surdoué. Alors ça me prendra encore beaucoup de temps pour le terminer... dans l'espoir par la suite que mon jeu soit suffisamment amusant, et fasse ainsi le tour du monde afin d'intéresser les sociétés ( droit console = plein de sous = faire ce que j'aime).
Comme les sprite3Ds sont à la mode...
Re: un jeu, un grand
ah flicCpl.Bator a écrit :oui, j'ai eu l'examen , j'ai réussi à faire un crédit de 140.000e pour acheter une licence, mais le gars qui devait me la vendre à eu des problèmes, donc je poirote... j'vais p'tete faire flic en attendantdjes a écrit :C'est bien tout çaCpl.Bator a écrit :je bosse pas mal , je retape une ruine , entre deux, je code un peu avec TmykeTon travail c'est toujours taxi? J'ai en projet d'utiliser la lib de tmyke pour un vrai projet un de ces 4. Elle est où ta ruine?
Sinon ma ruine est en haute normandie dans une p'tite ville médivale près du Havre, à Harfleur.
tout cela reste très subjectif..beauregard a écrit : Ensuite, il y a le délicat problème de la colorisation dans vos production: au lieu de proposer un objet "tout rouge", mais y donc du blanc avec, afin de casser l'uniformité.
Quelques exemples:
blanc + rouge ; blanc + vert ; blanc + bleu
jaune + noir
et si possible, évitez tout ce qui est gris ou marron.
ouiPolux a écrit :tout cela reste très subjectif..beauregard a écrit : Ensuite, il y a le délicat problème de la colorisation dans vos production: au lieu de proposer un objet "tout rouge", mais y donc du blanc avec, afin de casser l'uniformité.
Quelques exemples:
blanc + rouge ; blanc + vert ; blanc + bleu
jaune + noir
et si possible, évitez tout ce qui est gris ou marron.

Ma soeur est flic sur Paris, c'est plutôt calme en fait! Mais tu gagnerais quand même beaucoup moins que taxi... La haute Normandie ce n'est pas loin de chez moi, on pourra se voir un de ces 4. Je dois quand même me calmer car depuis que j'ai acheté ma voiture (moins de 2 mois), j'ai déjà fait 10000 kms...Cpl.Bator a écrit :oui, j'ai eu l'examen , j'ai réussi à faire un crédit de 140.000e pour acheter une licence, mais le gars qui devait me la vendre à eu des problèmes, donc je poirote... j'vais p'tete faire flic en attendantdjes a écrit :C'est bien tout çaCpl.Bator a écrit :je bosse pas mal , je retape une ruine , entre deux, je code un peu avec TmykeTon travail c'est toujours taxi? J'ai en projet d'utiliser la lib de tmyke pour un vrai projet un de ces 4. Elle est où ta ruine?
Sinon ma ruine est en haute normandie dans une p'tite ville médivale près du Havre, à Harfleur.
+1Dobro a écrit :ouiPolux a écrit :tout cela reste très subjectif..beauregard a écrit : Ensuite, il y a le délicat problème de la colorisation dans vos production: au lieu de proposer un objet "tout rouge", mais y donc du blanc avec, afin de casser l'uniformité.
Quelques exemples:
blanc + rouge ; blanc + vert ; blanc + bleu
jaune + noir
et si possible, évitez tout ce qui est gris ou marron.moi j'aime bien l'effet NEXT ! (interface tout gris !
)
Polux a écrit :ah flicCpl.Bator a écrit :oui, j'ai eu l'examen , j'ai réussi à faire un crédit de 140.000e pour acheter une licence, mais le gars qui devait me la vendre à eu des problèmes, donc je poirote... j'vais p'tete faire flic en attendantdjes a écrit : C'est bien tout çaTon travail c'est toujours taxi? J'ai en projet d'utiliser la lib de tmyke pour un vrai projet un de ces 4. Elle est où ta ruine?
Sinon ma ruine est en haute normandie dans une p'tite ville médivale près du Havre, à Harfleur.mon boulot d'avant
( véridique )
+1Polux a écrit :tout cela reste très subjectif..beauregard a écrit : Ensuite, il y a le délicat problème de la colorisation dans vos production: au lieu de proposer un objet "tout rouge", mais y donc du blanc avec, afin de casser l'uniformité.
Quelques exemples:
blanc + rouge ; blanc + vert ; blanc + bleu
jaune + noir
et si possible, évitez tout ce qui est gris ou marron.
J'ai un peu avancé le projet de la page précédente : on peut maintenant gérer un scrolling et plusieurs boite indépendante.
Baladez vous avec la souris et cliquez de temps en temps pour voir un effet interdit au moins de 16 ans
Question : à votre avis, de quel genre sera ce jeu 
Baladez vous avec la souris et cliquez de temps en temps pour voir un effet interdit au moins de 16 ans
Code : Tout sélectionner
; © ATHOW
; Au-Delà Project
;{- Global Variables, Constants & Enumeration
; sprites, sound effects, musics...
Enumeration
#SPR_WHITESQUARE
#SPR_GRAYSQUARE
EndEnumeration
;Others
; screen size
#SCREEN_WIDTH = 1024
#SCREEN_HEIGHT = 768
; gravity
#Gravity = 10
; depth of the platforms
#K = 10
; global variables for the scrolling
Global firstX.w
Global firstY.w
Global worldWidth.w
Global worldHeight.w
Global heroPosX.w
Global heroPosY.w
;}
;{- Structures
Structure blood
diam.f
x.f
y.f
dx.f
dy.f
depth.b
EndStructure
Structure box3D
x.w
y.w
width.w
height.w
spriteLeft.l
spriteRight.l
spriteTop.l
spriteFace.l
k.w
EndStructure
Structure level
levelFileName.s
enemyFileName.s
width.w
height.w
EndStructure
;}
;{- Global Lists & Dims
Global NewList bloodList.blood()
Global NewList boxes3DList.box3D()
;}
;{- Windows
UsePNGImageDecoder()
If InitSprite()=0 Or InitKeyboard()=0 Or InitSprite3D()=0 Or InitMouse() = 0
MessageRequester("Error", "Au-Delà was unable to launch. Verify that DirectX is installed correctly.", 0)
End
EndIf
;If OpenWindowedScreen(OpenWindow(0,0,0,#SCREEN_WIDTH, #SCREEN_HEIGHT,"Au-Delà",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget),0,0,#SCREEN_WIDTH, #SCREEN_HEIGHT,0,0,0) = 0
If OpenScreen(#SCREEN_WIDTH,#SCREEN_HEIGHT,32,"Au-Delà") = 0
MessageRequester("Error", "Unable to open a 800x600 screen", 0)
End
EndIf
KeyboardMode(1)
;}
;{- Sprites
CreateSprite(#SPR_WHITESQUARE,256,256,#PB_Sprite_Texture)
TransparentSpriteColor(#SPR_WHITESQUARE, RGB(255,0,255))
CreateSprite(#SPR_GRAYSQUARE,256,256,#PB_Sprite_Texture)
TransparentSpriteColor(#SPR_GRAYSQUARE, RGB(255,0,255))
StartDrawing(SpriteOutput(#SPR_WHITESQUARE))
For i.w = 0 To 127
color.w = 170+Int(i/2)
If(color > 255)
color = 255
EndIf
Box(i,i,256-i,256-i,RGB(color,color,color))
Next
StopDrawing()
StartDrawing(SpriteOutput(#SPR_GRAYSQUARE))
For i.w = 0 To 255
color.w = 130+Int(i/4)
If(color > 255)
color = 255
EndIf
Line(0,i,256,0,RGB(color,color,color))
Next
StopDrawing()
;}
;{- Tools
Procedure.w Max(Value1.f,Value2.f)
If Value1 > Value2
ProcedureReturn Value1
Else
ProcedureReturn Value2
EndIf
EndProcedure
Procedure.w randInt(max.w)
ProcedureReturn Int(Random(max))
EndProcedure
;}
;{- Graphical Effects
Procedure addBlood(x.f,y.f,powerX.f,powerY.f)
nbBlood.b = Int(50+Abs(powerX*powerY))
For i.b = 0 To nbBlood
AddElement(bloodList())
bloodList()\diam = Max(1,Random(4))
bloodList()\x = x + Random(10)
bloodList()\y = y + Random(10)
bloodList()\dx = (Random(bloodList()\diam))*powerX+(Random(bloodList()\diam))
bloodList()\dy = (Random(bloodList()\diam))*powerY+(Random(bloodList()\diam))
Next
EndProcedure
Procedure displayBlood()
ResetList(bloodList())
StartDrawing(ScreenOutput())
While NextElement(bloodList())
Ellipse(Int(bloodList()\x) - firstX,Int(bloodList()\y) - firstY,Int(bloodList()\diam),Int(bloodList()\diam)+randInt(2),RGB(160,0,0))
Wend
StopDrawing()
EndProcedure
Procedure updateBlood()
ResetList(bloodList())
While NextElement(bloodList())
bloodList()\x = bloodList()\x + bloodList()\dx
bloodList()\y = bloodList()\y + bloodList()\dy
bloodList()\dy = bloodList()\dy + #Gravity/10
bloodList()\dx = bloodList()\dx
If bloodList()\x - firstX<0 Or bloodList()\x - firstX>worldWidth Or bloodList()\y - firstY>worldHeight
DeleteElement(bloodList())
Else ; collision with the Boxes ?
ResetList(boxes3DList())
While(NextElement(boxes3DList()))
; collision with the left face :
If (bloodList()\x - bloodList()\dx < boxes3DList()\x) And (bloodList()\x >= boxes3DList()\x) And (bloodList()\y >= boxes3DList()\y) And (bloodList()\y <= boxes3DList()\y + boxes3DList()\height) And (randInt(10) > 4)
StartDrawing(SpriteOutput(boxes3DList()\spriteLeft))
argX.w = randInt(256)
argY.w = Int(256 * (bloodList()\y - boxes3DList()\y) / boxes3DList()\height)
argRadiusX.w = 3*Int(bloodList()\diam)
argRadiusY.w = Int(512 / boxes3DList()\height) * Int(bloodList()\diam) + randInt(3)
Ellipse(argX,argY,argRadiusX,argRadiusY,RGB(140,0,0))
StopDrawing()
DeleteElement(bloodList())
Break
EndIf
; collision with the right face :
If (bloodList()\x - bloodList()\dx >= boxes3DList()\x + boxes3DList()\width) And (bloodList()\x < boxes3DList()\x + boxes3DList()\width) And (bloodList()\y >= boxes3DList()\y) And (bloodList()\y <= boxes3DList()\y + boxes3DList()\height) And (randInt(10) > 4)
StartDrawing(SpriteOutput(boxes3DList()\spriteRight))
argX.w = randInt(256)
argY.w = Int(256 * (bloodList()\y - boxes3DList()\y) / boxes3DList()\height)
argRadiusX.w = 3*Int(bloodList()\diam)
argRadiusY.w = Int(512 / boxes3DList()\height) * Int(bloodList()\diam) + randInt(3)
Ellipse(argX,argY,argRadiusX,argRadiusY,RGB(140,0,0))
StopDrawing()
DeleteElement(bloodList())
Break
EndIf
; collision with the top face :
If (bloodList()\y + bloodList()\dy >= boxes3DList()\y) And (bloodList()\y < boxes3DList()\y) And (bloodList()\x >= boxes3DList()\x) And (bloodList()\x <= boxes3DList()\x + boxes3DList()\width) And (randInt(10) > 4)
StartDrawing(SpriteOutput(boxes3DList()\spriteTop))
argX.w = Int(256 * (bloodList()\x - boxes3DList()\x) / boxes3DList()\width)
argY.w = randInt(256)
argRadiusX.w = Int(768 / boxes3DList()\width) * Int(bloodList()\diam) + randInt(3)
argRadiusY.w = 3*Int(bloodList()\diam)
Ellipse(argX,argY,argRadiusX,argRadiusY,RGB(140,0,0))
StopDrawing()
DeleteElement(bloodList())
Break
EndIf
; collision with the bottom face (no blood paint):
If (bloodList()\y + bloodList()\dy < boxes3DList()\y + boxes3DList()\height) And (bloodList()\y >= boxes3DList()\y + boxes3DList()\height) And (bloodList()\x >= boxes3DList()\x) And (bloodList()\x <= boxes3DList()\x + boxes3DList()\width) And (randInt(10) > 3)
DeleteElement(bloodList())
Break
EndIf
; collision with the front face :
If (bloodList()\y >= boxes3DList()\y) And (bloodList()\y <= boxes3DList()\y + boxes3DList()\height) And (bloodList()\x >= boxes3DList()\x) And (bloodList()\x <= boxes3DList()\x + boxes3DList()\width) And (randInt(10) > 5)
StartDrawing(SpriteOutput(boxes3DList()\spriteFace))
argX.w = Int(256 * (bloodList()\x - boxes3DList()\x) / boxes3DList()\width)
argY.w = Int(256 * (bloodList()\y - boxes3DList()\y) / boxes3DList()\height)
argRadiusX.w = Int(512 / boxes3DList()\width) * Int(bloodList()\diam) + randInt(3)
argRadiusY.w = Int(768 / boxes3DList()\height) * Int(bloodList()\diam) + randInt(5)
Ellipse(argX,argY,argRadiusX,argRadiusY,RGB(140,0,0))
StopDrawing()
DeleteElement(bloodList())
Break
EndIf
Wend
EndIf
Wend
EndProcedure
Procedure displayBox3D(x.w,y.w,width.w,height.w, spriteLeft,spriteRight,spriteTop,spriteFace)
CreateSprite3D(0,spriteLeft)
CreateSprite3D(1,spriteRight)
CreateSprite3D(2,spriteTop)
CreateSprite3D(3,spriteFace)
ex.w = ((#SCREEN_WIDTH/2) / #K) - (x / #K) + x
ey.w = -((#SCREEN_HEIGHT/10) / #K + y / #K - y)
bx.w = (((#SCREEN_WIDTH/2) - x - width) / - #K) + x + width
by.w = 2 * y - ey
ax.w = 2 * x - ex
ay.w = by
cx.w = bx
cy.w = by + height
dx.w = ax
dy.w = cy
fx.w = 2 * x + 2 * width - bx
fy.w = ey
gx.w = fx
gy.w = fy + height
hx.w = ex
hy.w = gy
; display the left face
TransformSprite3D(0,ex,ey,ax,ay,dx,dy,hx,hy)
DisplaySprite3D(0,0,0,230)
; display the right face
TransformSprite3D(1,bx,by,fx,fy,gx,gy,cx,cy)
DisplaySprite3D(1,0,0,230)
; display the top face
TransformSprite3D(2,ex,ey,fx,fy,bx,by,ax,ay)
DisplaySprite3D(2,0,0)
; display the front face
TransformSprite3D(3,ax,ay,bx,by,cx,cy,dx,dy)
DisplaySprite3D(3,0,0,230)
EndProcedure
Procedure addBox3D(x.w,y.w,width.w,height.w)
AddElement(boxes3DList())
boxes3DList()\x = x
boxes3DList()\y = y
boxes3DList()\width = width
boxes3DList()\height = height
boxes3DList()\spriteLeft = CopySprite(#SPR_GRAYSQUARE,#PB_Any,#PB_Sprite_Texture)
boxes3DList()\spriteRight = CopySprite(#SPR_GRAYSQUARE,#PB_Any,#PB_Sprite_Texture)
boxes3DList()\spriteTop = CopySprite(#SPR_WHITESQUARE,#PB_Any,#PB_Sprite_Texture)
boxes3DList()\spriteFace = CopySprite(#SPR_GRAYSQUARE,#PB_Any,#PB_Sprite_Texture)
EndProcedure
Procedure displayAllBoxes3D()
Start3D()
ResetList(boxes3DList())
While NextElement(boxes3DList())
displayBox3D(boxes3DList()\x - firstX,boxes3DList()\y - firstY,boxes3DList()\width,boxes3DList()\height,boxes3DList()\spriteLeft,boxes3DList()\spriteRight,boxes3DList()\spriteTop,boxes3DList()\spriteFace)
Wend
Stop3D()
StartDrawing(ScreenOutput())
Circle(heroPosX - firstX, heroPosY - firstY, 10, RGB(255,0,0))
StopDrawing()
EndProcedure
;}
;-{ Game Procedures
Procedure updateScroll()
firstX = heroPosX - Int(#SCREEN_WIDTH / 2)
If firstX < 0
firstX = 0
EndIf
If firstX > worldWidth - Int(#SCREEN_WIDTH)
firstX = worldWidth - Int(#SCREEN_WIDTH)
EndIf
firstY = heroPosY - Int(#SCREEN_HEIGHT / 2)
If firstY < 0
firstY = 0
EndIf
If firstY > worldHeight - Int(#SCREEN_HEIGHT)
firstY = worldHeight - Int(#SCREEN_HEIGHT)
EndIf
EndProcedure
Procedure createWorld()
worldWidth = 1600
worldHeight = 1000
heroPosX = 30
heroPosY = 500
addBox3D(20,500,400,50)
addBox3D(1000,300,300,100)
addBox3D(100,100,20,200)
EndProcedure
;{- Menus and screens
Procedure Test()
createWorld()
click.b = 0
Repeat
FlipBuffers()
ClearScreen(RGB(255,255,255))
ExamineKeyboard()
ExamineMouse()
heroPosX + MouseDeltaX()
If heroPosX < 0
heroPosX = 0
EndIf
If heroPosX > worldWidth
heroPosX = worldWidth
EndIf
heroPosY + MouseDeltaY()
If heroPosY < 0
heroPosY = 0
EndIf
If heroPosY > worldHeight
heroPosY = worldHeight
EndIf
updateScroll()
If MouseButton(1)
If click = 1
click = 2
EndIf
If click = 0
click = 1
EndIf
Else
If click <> 0
click = 0
EndIf
EndIf
If click = 1
addBlood(heroPosX,heroPosY,randInt(20) - 10,randInt(20) - 10)
EndIf
displayAllBoxes3D()
displayBlood()
updateBlood()
Delay(20)
Until KeyboardPushed(#PB_Key_Escape)
EndProcedure
;}
;{- Main routine
Test()
;}
J'avais pas eu qu'il y avait un challenge! C'est excellent tout ça! Je vois qu'on essaie de s'en sortir 'façon maison' !
Le code allemand n'est pas mal non plus. Il ne manque plus qu'une bonne accélération et un peu de rangement dans le code.
Je vais regarder le code de Cpl, voir si on peut ajouter toutes les rotations aussi.
Le code allemand n'est pas mal non plus. Il ne manque plus qu'une bonne accélération et un peu de rangement dans le code.
Je vais regarder le code de Cpl, voir si on peut ajouter toutes les rotations aussi.
J'avais commencé à faire ce petit code peu significatif pour tenter de pénétrer la vrai 3d 'façon maison' suite à la création de ce sujet.
Est-ce qu'un matheux peut me dire si je fais fausse route?
Est-ce qu'un matheux peut me dire si je fais fausse route?
Code : Tout sélectionner
Global Xtheta.F
Global Ytheta.F
Global Ztheta.F
InitSprite()
InitKeyboard()
OpenScreen(1024, 768, 32, "x")
;***********
R.F = 100.0
Xtheta = 0.0
Ytheta = 0.0
Ztheta = 0.0
;***********
Repeat
StartDrawing(ScreenOutput() )
Box(0, 0, 1024, 768, #Black)
For i = 0 To 359
Xtheta = #PI * i / 180.0
;**********
Ax.F = R * Cos(Xtheta) * Cos(Ytheta)
Ay.F = R * Sin(Xtheta) ; On pourra la descendre plus bas
Re.F = Sqr(Pow(Ax, 2) + Pow(Ay, 2) )
If Re = 0.0
Bx.F = Ax
By.F = Ay
Else
Ga.F = ACos(Ax / Re)
If Ay < 0.0
Ga = 0.0 - Ga
EndIf
Bx = Re * Cos(Ga + Ztheta)
By = Re * Sin(Ga + Ztheta)
EndIf
;**********
Plot(512 + Bx, 384 + By, ( ((i + XOffset) / 36) % 2) * 255)
Next
Xtmp = Xoffset
Xtmp % 180
DrawText(0, 0, Str(Xtmp), #White, #Black)
Ytmp = Ytheta * 180 / #PI
Ytmp % 180
DrawText(0, 16, Str(Ytmp), #White, #Black)
ZTmp = (Ztheta * 180 / #PI)
Ztmp % 180
DrawText(0, 32, Str(Ztmp), #White, #Black)
DrawText(0, 48, "Utilisez les 4 flèches de direction et PageUp, PageDown pour modifier x, y, et z")
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_PageUp)
XOffset + 4
EndIf
If KeyboardPushed(#PB_Key_PageDown)
XOffset - 4
EndIf
If KeyboardPushed(#PB_Key_Up)
Ytheta + 0.04
EndIf
If KeyboardPushed(#PB_Key_Down)
Ytheta - 0.04
EndIf
If KeyboardPushed(#PB_Key_Left)
Ztheta + 0.04
EndIf
If KeyboardPushed(#PB_Key_Right)
Ztheta - 0.04
EndIf
Until KeyboardPushed(#PB_Key_Escape)- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07