Questions pour le jeu.

Programmation avancée de jeux en PureBasic
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Questions pour le jeu.

Message par poshu »

Non, dans plusieurs cas sfml renvoie une structure et pas un pointer, pas de bricolage possible du coup.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Questions pour le jeu.

Message par G-Rom »

Exact, de mémoire, dans ma liste todo , je devais modifier le code C en ce sens, pour le moment il faut faire comme ca sans modifié le code source :

Code : Tout sélectionner

OpenLibrary(0,"csfml-graphics-2.dll")

PrototypeC.i sfColor_fromRGB(red.a,green.a,blue.a)
Global sfColor_fromRGB.sfColor_fromRGB = GetFunction(0,"sfColor_fromRGB")

*ptr = sfColor_fromRGB(255,128,64) 

Debug PeekA(@*ptr)
Debug PeekA(@*ptr+1)
Debug PeekA(@*ptr+2)
Par contre , c'est pas top... :cry:

Edit:

J'avais wrappé il y a quelques année en arrière la version 1.6
J'avais modifié toutes les sources ( le wrapper C )
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Questions pour le jeu.

Message par poshu »

Bah ouais, comme je l'ai dit plus haut, je me tâte à tout retoucher du coup... Mais ca doit représenter masse de boulot et mes compétences sont pas au top (CSFML 2.1, c'est mon premier wrapper en fait...)
A vrai dire, je pense qu'on pourrait tous profiter de SFML sous pure, donc j'envisageais aussi d'essayer de lancer un "projet commun" pour les gens d'ici (plutôt que d'avoir à coordonner une armée d'anglais, je me dis que la petite communauté française de pure est très compétente...); vous pensez que ça vaut le coup?
Avatar de l’utilisateur
Jenova
Messages : 96
Inscription : mar. 09/mars/2004 10:27

Re: Questions pour le jeu.

Message par Jenova »

Question bête, qu’apporte SFML selon vous par rapport à pure ?
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Questions pour le jeu.

Message par G-Rom »

Jenova a écrit :Question bête, qu’apporte SFML selon vous par rapport à pure ?
PB est completement has-been pour la 2D.
Dejà, le support des shaders, le rendu sur texture, les transformations, la modélisation hiéarchique ( rotation répercutée aux enfants ) , les vues , et la liste pourrais s'allonger
PB ne propose que des "sprites" , à toi de faire le reste.

quand j'avais wrappé la sfml , kelebrindae à rajouté des "blob monster" à mon background animé :
http://keleb.free.fr/codecorner/downloa ... erdemo.zip
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Questions pour le jeu.

Message par poshu »

Les vues. C'est LE truc indispensable qui manque à pure, le reste est complètement suffisant pour la plupart des jeux faisables à mon échelle (a condition de régler quelques bugounets ceci dit). Après, ouais, plein de features avancées super pratiques pour faire masse de jolies effets, et puis j'ajouterais aussi un support plus complet des joysticks/manettes ^^;

J'vais regarder ton archive la prochaine fois que je reboot sous windows.

De mon coté, j'ai les modules window (pas en entier à cause du problème cité ci dessus) et system de CSFML fonctionnel sous 5.21...
Dernière modification par poshu le jeu. 23/janv./2014 1:05, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Questions pour le jeu.

Message par Backup »

G-Rom a écrit : quand j'avais wrappé la sfml , kelebrindae à rajouté des "blob monster" à mon background animé :
http://keleb.free.fr/codecorner/downloa ... erdemo.zip
8O ça décoiffe !

lorsque je t'ai lu que tu disais que "PB est complétement has-been pour la 2D." , je me suis dis , ça y est il exagère encore ... :roll:

mais ... apres avoir vu la petit demo avec les zigouigoui qui file avec une fluidité sans nom , je suis sur le cul ! 8O
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Questions pour le jeu.

Message par poshu »

@Dobro : Le problème de Fred, je suppose, c'est que les sprites got to play nicely with the 3D engine, and still be able to perform right in standalone mode... I guess it's a lot of trouble for only half of his clients (assuming the application/game maker population is fifty fifty, of course)... Yet, with Spider Basic around the corner, my faith in PB is stronger than ever, and I need some 2D tools so I can continue to prototype games. CSFML is perfect for my needs, both fast and feature rich.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Questions pour le jeu.

Message par Backup »

G-rom :

j'ai refait ton archive, car j'ai Détypée tes pointeurs du PBI pour le rendre compatible 5.21 (il y en avait beaucoup ) :)

j'ai aussi fait une petite modif (Windows ONLY),sur le code de Demo, qui ne corrige pas ton bug de fin
mais qui supprime automatiquement de la liste des process ...
a condition que le prg s’appel "blobMonster-Demo.exe" (donc ça ne marchera que Si compilé en EXe )

Merci encore pour ton partage :)

a recuperer ici :
http://michel.dobro.free.fr/Forum_pb/sf ... o_5_21.zip

Code : Tout sélectionner

; Include SFML 2.0
XIncludeFile "SFML-2.pbi"

;-Ajout Dobro
; ************* pour le PID *****************
Structure PROCESSENTRY33
	dwSize.L
	cntUsage.L
	th32ProcessID.L
	th32DefaultHeapID.L
	th32ModuleID.L
	cntThreads.L
	th32ParentProcessID.L
	pcPriClassBase.L
	dwFlags.L
	szExeFile.b[#MAX_PATH]
EndStructure

Declare.L cheater_pid_return(gamewindowtext.s)
Declare  cheater_KillProcess (pid)
Declare  Fin(gamewindowtext.s)

;**************************************


; ---------------------------------------------------------------------------
;- SCREEN INIT
; ---------------------------------------------------------------------------
; Set video mode; 
ExamineDesktops()
Global VideoMode.sfVideoMode
VideoMode\Width        = DesktopWidth(0)
VideoMode\Height       = DesktopHeight(0)
VideoMode\BitsPerPixel = DesktopDepth(0)

; Set hardware settings
Global Settings.sfContextSettings         
Settings\DepthBits         = 24     ; ZBuffer de 24 bits
Settings\AntialiasingLevel = 2      ; Niveau d'antialiasing
SettingsMajorVersion       = 2      ; Version OpenGL (2.1) pour la 3 , mettre 3.0
Settings\MinorVersion      = 0

Global ClearScreen.sfColor
ClearScreen\r = 0
ClearScreen\g = 0
ClearScreen\b = 0

; Open screen
Global window = sfRenderWindow_Create(@VideoMode, "Blobmonster with SFML",#sfFullscreen, @Settings)
sfRenderWindow_ShowMouseCursor(window, #False)

; ---------------------------------------------------------------------------
;-STRUCTURES INIT
; ---------------------------------------------------------------------------
#NB_BUBBLE = 50
Structure bubble
	x.f
	y.f
	scale.f
	speed.f
EndStructure
Global Dim bubble.bubble(#NB_BUBBLE-1)

Structure ray
	width.f
	height.f
	color.i
	angle.f
	period.f
	ptimer.l
	sizePeriod.f
	sizeTimer.l
EndStructure

RayOfGodPosX = DesktopWidth(0)/2 
RayOfGodPosY = -512
NbRay        = 100

Global Dim rog.ray(NbRay)

; Simple class (Structure in Pure Basic) to hold a 2d coordinate
Structure  point_struct
	x.f
	y.f
EndStructure 

; Here's the blob monster type
#NB_MONSTERS = 10
#BLOBSIZE = 32
Structure blobMonster_struct
	
	;x and y coords
	x.f
	y.f
	
	redVal.a
	greenVal.a
	blueVal.a
	
	size.f
	
	; Speed, try changing it
	speed.f
	
	; Number of nodes along the body, try changing it to 100
	segments.i
	
	; Array to hold the points along the body
	tail.point_struct[100]
	
	time.f
	
EndStructure
Global NewList blobMonster.blobMonster_struct()

Global music,rayOfGod_img,bubble_img,background_img,gradient_img,blob_img
Global bubble_sprite,background_sprite,gradient_sprite,rog_sprite,blob_sprite

Global OffScreenSurface,ImageOffScreen,SpriteOffScreen 
Global Shader,ImageWave
Global SFX.a
Global i.i

EnableExplicit
;********************************************************
;- --- Macros ---
;********************************************************

;This macro calculates and returns the angle between two 2d coordinates, in degrees
Macro  calculateAngle(x1,y1,x2,y2)
	Degree(-ATan2(x1 - x2,y1 - y2))
EndMacro

;********************************************************
;- --- Procedures ---
;********************************************************

; The methods used to create / update / draw a blob monster are here because we can't put them
; in the blobMonster structure (PB isn't object oriented)

; Procedure that returns a pointer to a new blob monster object. Pure Basic equivalent (kind of)
; of a constructor in C++/Java
Procedure blobMonsterCreate(inX.f, inY.f)
	Protected i.i
	Protected *n.blobMonster_struct = AddElement(blobMonster())
	
	;starting point of the blob monster
	*n\x = inX
	*n\y = iny
	
	*n\segments = 5+Random(10)
	*n\size = #BLOBSIZE*0.75 + Random(#BLOBSIZE)
	*n\speed = 0.25 + Random(100)/100.0
	If Random(100) >= 50
		*n\speed = -*n\speed
	EndIf
	
	*n\time = Random(10000)
	
	Select Random(4)
		Case 0
		*n\redVal = 0
		*n\greenVal = 255
		*n\blueVal = 255
		Case 1
		*n\redVal = 255
		*n\greenVal = 0
		*n\blueVal = 255
		Case 2
		*n\redVal = 0
		*n\greenVal = 255
		*n\blueVal = 0
		Case 3
		*n\redVal = 255
		*n\greenVal = 127
		*n\blueVal = 0
		Case 4
		*n\redVal = 0
		*n\greenVal = 0
		*n\blueVal = 255
	EndSelect
	
	;give the tail some coordinates, just make them the same as the main x and y for now
	For i = 0 To *n\segments - 1
		*n\tail[i]\x = inX
		*n\tail[i]\y = iny
	Next i
	
	ProcedureReturn *n
EndProcedure


Procedure blobMonsterUpdate(*ptrMonster.blobMonster_struct)
	Protected i.i
	Protected distX.f,distY.f,dist.f
	
	;time is a bit misleading, it's used for all sorts of things
	*ptrMonster\time + *ptrMonster\speed
	
	;here the x and y coordinates are updated.
	;this uses the following as a basic rule for moving things
	;around a point in 2d space:
	;x=radius*cos(angle)+xOrigin
	;y=raduis*sin(angle)+yOrigin
	;this basically is the basis for anything that moves in this example
	;
	;the 2 lines of code below make the monster move around, but
	;you can change this to anything you like, try setting x and y to the mouse
	;coordinates for example
	*ptrMonster\y = (15 * Cos(Radian(*ptrMonster\time * -6))) + (VideoMode\Height / 2 + ((VideoMode\Height / 2 - 60) * Sin(Radian(*ptrMonster\time * 1.3))))
	*ptrMonster\x = (15 * Sin(Radian(*ptrMonster\time * -6))) + (VideoMode\Width / 2 + ((VideoMode\Width / 2 - 120) * Cos(Radian(*ptrMonster\time / 1.5))))
	
	
	;put the head of the tail at x,y coords
	*ptrMonster\tail[0]\x = *ptrMonster\x
	*ptrMonster\tail[0]\y = *ptrMonster\y
	
	;update the tail
	;basically, the points don't move unless they're further that 7 pixels 
	;from the previous point. this gives the kind of springy effect as the 
	;body stretches
	For i = 1 To *ptrMonster\segments - 1
		
		;calculate distance between the current point and the previous
		distX = (*ptrMonster\tail[i - 1]\x - *ptrMonster\tail[i]\x)
		distY = (*ptrMonster\tail[i - 1]\y - *ptrMonster\tail[i]\y)
		dist = Sqr(distX * distX + distY * distY)
		
		;move if too far away
		If dist >= *ptrMonster\size*0.5
			;the (distX*0.2) bit makes the point move 
			;just 20% of the distance. this makes the 
			;movement smoother, and the point decelerate
			;as it gets closer to the target point.
			;try changing it to 1 (i.e 100%) to see what happens
			*ptrMonster\tail[i]\x = *ptrMonster\tail[i]\x + (distX * 0.25)
			*ptrMonster\tail[i]\y = *ptrMonster\tail[i]\y + (distY * 0.25)
		EndIf
		
	Next i
	
EndProcedure


Procedure blobMonsterDraw(*ptrMonster.blobMonster_struct,targetSurface)
	Protected i.i
	Protected ang.f, scale.f
	;time to draw stuff!
	
	;this sets the blend mode to LIGHTBLEND, or additive blending, which makes
	;the images progressively more bright as they overlap
	sfSprite_SetBlendMode(blob_sprite, #sfBlendAdd)
	
	;SetColor 0, 200, 150
	
	;###########
	;draw the main bit of the body
	;start by setting the images handle (i.e the origin of the image) to it's center
	;MidHandleImage blob
	sfSprite_SetOrigin(blob_sprite,sfImage_GetWidth(blob_img)*0.5,sfImage_GetHeight(blob_img)*0.5)
	
	;begin looping through the segments of the body
	For i = 0 To *ptrMonster\segments - 1
		;set the alpha transparency vaue to 0.15, pretty transparent
		;SetAlpha 0.15
		sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(*ptrMonster\redVal, *ptrMonster\greenVal, *ptrMonster\blueVal, 40))
		
		;the  (0.5*sin(i*35)) bit basically bulges the size of the images being
		;drawn as it gets closer to the center of the monsters body, and tapers off in size as it gets 
		;to the end. try changing the 0.5 to a higher number to see the effect.
		;SetScale 1 + (0.5 * Sin(i * 35)), 1 + (0.5 * Sin(i * 35))
		scale = 1 + (0.5 * Sin(Radian(i * 35)))
		sfSprite_Resize(blob_sprite,*ptrMonster\size*scale,*ptrMonster\size*scale)
		
		;draw the image
		sfSprite_SetPosition(blob_Sprite,*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y)
		sfRenderWindow_DrawSprite(targetSurface,blob_sprite)  
		
		;this next chunk just draws smaller dots in the center of each segment of the body
		;SetAlpha 0.8
		sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(*ptrMonster\redVal, *ptrMonster\greenVal, *ptrMonster\blueVal, 204))
		;SetScale 0.1, 0.1
		sfSprite_Resize(blob_sprite,*ptrMonster\size*0.1,*ptrMonster\size*0.1)
		
		;draw the image
		sfSprite_SetPosition(blob_Sprite,*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y)
		sfRenderWindow_DrawSprite(targetSurface,blob_sprite)  
	Next i
	
	;#########################
	;draw little spikes on tail
	;SetColor 255, 255, 255
	sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(255, 255, 255, 204))
	
	;note that the x and y scales are different
	;SetScale 0.6, 0.1
	sfSprite_Resize(blob_sprite,*ptrMonster\size*0.6,*ptrMonster\size*0.1)
	
	;move the image handle to halfway down the left edge, this'll make the image
	;appear to the side of the coordinate it is drawn too, rather than the 
	;center as we had for the body sections
	;SetImageHandle blob, 0, ImageHeight(blob) / 2
	sfSprite_SetOrigin(blob_sprite,0,sfImage_GetHeight(blob_img)*0.5)
	
	;rotate the 1st tail image. basically, we're calculating the angle between
	;the last 2 points of the tail, and then adding an extra wobble (the 10*sin(time*10) bit)
	;to make the pincer type effect.
	;SetRotation 10 * Sin(time * 10) + calculateAngle(*ptrMonster\tail[segments - 1]\x, *ptrMonster\tail[segments - 1]\y, *ptrMonster\tail[segments - 5]\x, *ptrMonster\tail[segments - 5]\y) + 90
	sfSprite_SetRotation(blob_sprite,10 * Sin(Radian(*ptrMonster\time * 10)) + calculateAngle(*ptrMonster\tail[*ptrMonster\segments - 1]\x, *ptrMonster\tail[*ptrMonster\segments - 1]\y, *ptrMonster\tail[*ptrMonster\segments - 2]\x, *ptrMonster\tail[*ptrMonster\segments - 2]\y) )
	
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\tail[*ptrMonster\segments - 1]\x, *ptrMonster\tail[*ptrMonster\segments - 1]\y)
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	
	;second tail image uses negative time to make it move in the opposite direction
	;SetRotation 10 * Sin(-time * 10) + calculateAngle(*ptrMonster\tail[segments - 1]\x, *ptrMonster\tail[segments - 1]\y, *ptrMonster\tail[segments - 5]\x, *ptrMonster\tail[segments - 5]\y) + 90
	sfSprite_SetRotation(blob_sprite,10 * Sin(Radian(-*ptrMonster\time * 10)) + calculateAngle(*ptrMonster\tail[*ptrMonster\segments - 1]\x, *ptrMonster\tail[*ptrMonster\segments - 1]\y, *ptrMonster\tail[*ptrMonster\segments - 2]\x, *ptrMonster\tail[*ptrMonster\segments - 2]\y) )
	
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\tail[*ptrMonster\segments - 1]\x, *ptrMonster\tail[*ptrMonster\segments - 1]\y)
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	
	
	
	;#####################
	;draw little fins/arms
	;SetAlpha 1
	sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(255, 255, 255, 255))
	
	;begin looping through the body sections again. Note that we don't want fins
	;on the first and last section because we want other things at those coords.
	For i = 1 To *ptrMonster\segments - 2
		;like the bulging body, we want the fins to grow larger in the center, and smaller
		;at the end, so the same sort of thing is used here.
		;SetScale 0.1 + (0.6 * Sin(i * 30)), 0.05
		scale = 0.1 + (0.6 * Sin(Radian(i * 30)))
		sfSprite_Resize(blob_sprite,*ptrMonster\size*scale,*ptrMonster\size*0.05)
		
		;rotate the image. We want the fins to stick out sideways from the body (the calculateangle() bit)
		;and also to move a little on their own. the 33 * Sin(time * 5 + i * 30) makes the 
		;fin rotate based in the i index variable, so that all the fins look like they're moving 
		;one after the other.
		;SetRotation 33 * Sin(time * 5 + i * 30) + calculateAngle(*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y, *ptrMonster\tail[i - 1]\x, *ptrMonster\tail[i - 1]\y)
		sfSprite_SetRotation(blob_sprite,33 * Sin(Radian(*ptrMonster\time * 5 + i * 30)) + calculateAngle(*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y, *ptrMonster\tail[i - 1]\x, *ptrMonster\tail[i - 1]\y) - 90 )
		
		sfSprite_SetPosition(blob_Sprite,*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y)
		sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
		
		;rotate the opposte fin, note that the signs have changes (-time and -i*30)
		;to reflect the rotations of the other fin
		;SetRotation 33 * Sin(-time * 5 - i * 30) + calculateAngle(*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y, *ptrMonster\tail[i - 1]\x, *ptrMonster\tail[i - 1]\y) + 180
		sfSprite_SetRotation(blob_sprite,33 * Sin(Radian(-*ptrMonster\time * 5 - i * 30)) + calculateAngle(*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y, *ptrMonster\tail[i - 1]\x, *ptrMonster\tail[i - 1]\y) + 90 )
		
		sfSprite_SetPosition(blob_Sprite,*ptrMonster\tail[i]\x, *ptrMonster\tail[i]\y)
		sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
		
	Next i
	
	; 
	;###################
	;center the image handle
	; MidHandleImage blob
	sfSprite_SetOrigin(blob_sprite,sfImage_GetWidth(blob_img)*0.5,sfImage_Getheight(blob_img)*0.5)
	
	;Draw the eyes. These are just at 90 degrees to the head of the tail.
	; SetScale 0.6, 0.6
	sfSprite_Resize(blob_sprite,*ptrMonster\size*0.6,*ptrMonster\size*0.6)
	; SetColor 255, 0, 0
	; SetAlpha 0.3
	sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(255, 0, 0, 77))
	
	ang = calculateangle(*ptrMonster\tail[0]\x, *ptrMonster\tail[0]\y, *ptrMonster\tail[1]\x, *ptrMonster\tail[1]\y)
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\x + (7 * Cos(-Radian(ang - 45))), *ptrMonster\y + (7 * Sin(-Radian(ang - 45))))
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\x + (7 * Cos(-Radian(ang + 45))), *ptrMonster\y + (7 * Sin(-Radian(ang + 45))))
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	
	
	;SetScale 0.1, 0.1
	sfSprite_Resize(blob_sprite,*ptrMonster\size*0.1,*ptrMonster\size*0.1)
	;SetColor 255, 255, 255
	;SetAlpha 0.5
	sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(255, 0, 0, 128))
	
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\x + (7 * Cos(-Radian(ang - 45))), *ptrMonster\y + (7 * Sin(-Radian(ang - 45))))
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\x + (7 * Cos(-Radian(ang + 45))), *ptrMonster\y + (7 * Sin(-Radian(ang + 45))))
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	
	
	;draw beaky thing
	;SetImageHandle blob, 0, ImageWidth(blob) / 2
	sfSprite_SetOrigin(blob_sprite,0,sfImage_Getheight(blob_img)*0.5)
	;SetScale 0.3, 0.1
	sfSprite_Resize(blob_sprite,*ptrMonster\size*0.3,*ptrMonster\size*0.1)
	;SetColor 0, 200, 155
	;SetAlpha 0.8
	sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(200,155,0,204))
	;SetRotation ang + 90
	sfSprite_SetRotation(blob_sprite,ang)
	
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\x, *ptrMonster\y)
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	
	
	;yellow light
	;MidHandleImage blob
	sfSprite_SetOrigin(blob_sprite,sfImage_GetWidth(blob_img)*0.5,sfImage_Getheight(blob_img)*0.5)
	;SetScale 4, 4
	sfSprite_Resize(blob_sprite,*ptrMonster\size*4,*ptrMonster\size*4)
	;SetColor 255, 255, 0
	;SetAlpha 0.2
	sfSprite_SetColor(blob_sprite,sfColor_FromRGBA(255,255,0,51))
	
	sfSprite_SetPosition(blob_Sprite,*ptrMonster\x, *ptrMonster\y)
	sfRenderWindow_DrawSprite(targetSurface,blob_sprite)
	
	;Finished!
EndProcedure


; ---------------------------------------------------------------------------
;-LOAD MEDIAS
; ---------------------------------------------------------------------------
music = sfMusic_CreateFromFile("./Medias/Gameplay4.ogg")
sfMusic_Play(music)
sfMusic_SetLoop(music,1)

rayOfGod_img     = sfImage_CreateFromFile("./Medias/rayOfGod.png")
bubble_img       = sfImage_CreateFromFile("./Medias/bubble.png")
background_img   = sfImage_CreateFromFile("./Medias/background.png")
gradient_img     = sfImage_CreateFromFile("./Medias/gradient.png")
blob_img         = sfImage_CreateFromFile("./Medias/blob.png")

bubble_sprite = sfSprite_Create()
sfSprite_SetImage(bubble_sprite,bubble_img,1)

background_sprite = sfSprite_Create()
sfSprite_SetImage(background_sprite,background_img,1)
sfSprite_Resize(background_sprite,DesktopWidth(0),DesktopHeight(0))

gradient_sprite = sfSprite_Create()
sfSprite_SetImage(gradient_sprite,gradient_img,1)
sfSprite_Resize(gradient_sprite,DesktopWidth(0),DesktopHeight(0))

rog_sprite = sfSprite_Create()
sfSprite_SetImage(rog_sprite,rayOfGod_img,1)
sfSprite_SetOrigin(rog_sprite,64,0)
sfSprite_SetBlendMode(rog_sprite,#sfBlendAdd)

blob_sprite = sfSprite_Create()
sfSprite_SetImage(blob_sprite,blob_img,1)
sfSprite_SetBlendMode(blob_sprite,#sfBlendAdd)
sfSprite_SetOrigin(blob_sprite,sfImage_GetWidth(blob_img)*0.5,sfImage_GetWidth(blob_img)*0.5)


For i = 0 To #NB_BUBBLE-1
	With bubble(i)
		\x = Random(DesktopWidth(0))
		\y = Random(DesktopHeight(0))
		\scale = 0.1 + (Random(10)/30)
		\speed = 0.5 + Random(3)
	EndWith
Next 


For i = 0 To NbRay-1
	With rog(i)
		\color  = RGBA(255,255,255,255)
		\width  = 16  + Random(32)
		\height = 512 + Random(1024)
		\angle  = Random(130)
		\period = Random(20)-Random(20)
		\ptimer = 250 + Random(1000)
		
		\sizePeriod = Random(1024)-Random(1024)
		\sizeTimer  = 250 + Random(1000)
	EndWith
Next


If sfRenderImage_IsAvailable()
	OffScreenSurface = sfRenderImage_Create(DesktopWidth(0), DesktopHeight(0) , #False)   ; On crée l'image
	ImageOffScreen   = sfRenderImage_GetImage(OffScreenSurface)                   ; on va la lié à un sprite
	SpriteOffScreen  = sfSprite_Create()                                          ; on créer un sprite , qui sera le resultats des opérations
	sfSprite_SetImage(SpriteOffScreen,ImageOffScreen,#True)
	
	
	SFX.a = #False
	
	If sfShader_IsAvailable()
		
		Shader     = sfShader_CreateFromFile("./Medias/wave.glsl")
		ImageWave  = sfImage_CreateFromFile("./Medias/wave.jpg")
		
		sfShader_SetTexture(Shader,"texture",ImageOffScreen)
		sfShader_SetTexture(Shader,"wave",ImageWave)
		
		SFX = #True
	EndIf  
	
	
EndIf 

; Create a blobMonster object
For i = 1 To #NB_MONSTERS
	blobMonsterCreate(VideoMode\Width / 2,VideoMode\height / 2)
Next i

DisableExplicit

;- Main loop
TextIndex=-1
Quit = #False
Repeat
	
	If sfRenderWindow_GetEvent(window,@event)    
		input = sfRenderWindow_GetInput(window)
		
		If sfInput_IsKeyDown(input,#sf_key_Escape)
			Quit = #True 
		EndIf 
	EndIf 
	
	
	
	
	If SFX = #False
		sfRenderWindow_Clear(window,@ClearScreen)
		
		;-draw background
		sfRenderWindow_DrawSprite(window,background_sprite)
		
		;-Draw bubble
		For i = 0 To #NB_BUBBLE-1
			With bubble(i)
				
				\y - \speed
				
				If \y+(\scale*128)<0
					\x = Random(DesktopWidth(0))-Random(128)
					\y = DesktopHeight(0)
					\scale = 0.1 + (Random(10)/30)
					\speed = 0.5 + Random(3)
				EndIf         
				
				sfSprite_SetScale(bubble_sprite,\scale,\scale)
				sfSprite_SetPosition(bubble_sprite, \x, \y)
				sfRenderWindow_DrawSprite(window,bubble_sprite)   
				
			EndWith
		Next 
		
		;-Draw ray of god
		For i = 0 To NbRay-1
			With rog(i)
				
				px.f = RayOfGodPosX
				py.f = RayOfGodPosY
				
				An.f = \angle + \period * Cos(ElapsedMilliseconds()/\ptimer)
				Ht.f = \height + \sizePeriod * Cos(ElapsedMilliseconds()/\sizeTimer)
				
				
				sfSprite_Resize(rog_sprite,\width, Ht)
				sfSprite_SetPosition(rog_sprite,px,py)
				sfSprite_SetRotation(rog_sprite,An-90)
				
				sfRenderWindow_DrawSprite(window,rog_sprite)             
				
			EndWith
		Next
		
		;-Draw gradient
		sfRenderWindow_DrawSprite(window,gradient_sprite)
		
		sfRenderWindow_Display(window)
		Else ; SFX = #true
		
		
		wx.f = (DesktopWidth(0)  /2) + 500 * Cos(ElapsedMilliseconds()/2000)
		wy.f = (DesktopHeight(0) /2) + 500 * Sin(ElapsedMilliseconds()/2000)
		
		sfShader_SetParameter2(shader,"offset",wx/DesktopWidth(0),wy/DesktopHeight(0))
		
		sfRenderImage_Clear(OffScreenSurface,@ClearScreen)
		
		;Background
		sfRenderImage_DrawSprite(OffScreenSurface,background_sprite)
		
		;-Draw bubble
		For i = 0 To #NB_BUBBLE-1
			With bubble(i)
				
				\y - \speed
				
				If \y+(\scale*128)<0
					\x = Random(DesktopWidth(0))-Random(128)
					\y = DesktopHeight(0)
					\scale = 0.1 + (Random(10)/30)
					\speed = 0.5 + Random(3)
				EndIf         
				
				sfSprite_SetScale(bubble_sprite,\scale,\scale)
				sfSprite_SetPosition(bubble_sprite, \x, \y)
				sfRenderImage_DrawSprite(OffScreenSurface,bubble_sprite)   
				
			EndWith
		Next    
		
		sfRenderImage_Display(OffScreenSurface)
		
		sfRenderWindow_Clear(window,@ClearScreen)
		sfRenderWindow_DrawSpriteWithShader(window,SpriteOffScreen,Shader)
		
		
		;-Draw ray of god
		For i = 0 To NbRay-1
			With rog(i)
				
				px.f = RayOfGodPosX
				py.f = RayOfGodPosY
				
				An.f = \angle + \period * Cos(ElapsedMilliseconds()/\ptimer)
				Ht.f = \height + \sizePeriod * Cos(ElapsedMilliseconds()/\sizeTimer)
				
				
				sfSprite_Resize(rog_sprite,\width, Ht)
				sfSprite_SetPosition(rog_sprite,px,py)
				sfSprite_SetRotation(rog_sprite,An-90)
				
				sfRenderWindow_DrawSprite(window,rog_sprite)             
				
			EndWith
		Next
		
		
		;-Draw gradient
		sfRenderWindow_DrawSprite(window,gradient_sprite)
		
		ForEach blobMonster()
			;update the blobmonster
			blobMonsterUpdate(@blobMonster())
			;- Draw the monster
			blobMonsterDraw(@blobMonster(),window)
		Next blobMonster()
		
		sfRenderWindow_Display(window)
		
	EndIf
	
	
	sfSleep(0.01)
Until Quit=#True 



sfMusic_stop(music)
sfMusic_Destroy(music)
sfRenderWindow_Close(window)
sfRenderWindow_Destroy(window)


;--- Ajout Dobro
Fin("blobMonster-Demo")

;MessageRequester("Bug"," le programme bug à cause d'openAL , faut que je trouve pourquoi , merci de me killer dans le gestionnaire de process.")




;--- Ajout Dobro
Procedure.L cheater_pid_return(gamewindowtext.s)
	; Laisse cette procedure au dessus des autres, car elle est appelé par les autres
	Name.s=UCase(gamewindowtext.s)
	Recherche=0
	If OpenLibrary(0, "Kernel32.dll")
		CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot")
		ProcessFirst           = GetFunction(0, "Process32First")
		ProcessNext            = GetFunction(0, "Process32Next")
		If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found
			Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)
			Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0)
			If Snapshot
				ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process)
				While ProcessFound
					Nom.s=UCase(PeekS(@Process\szExeFile, -1, #PB_Ascii))
					Debug Nom.s
					Nom=GetFilePart(Nom)
					If FindString(Nom,Name.s,1);;=Name
						Recherche =1
						pid=Process\th32ProcessID
					EndIf
					ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)
				Wend
			EndIf
			CloseHandle_(Snapshot)
		EndIf
		CloseLibrary(0)
	EndIf
	ProcedureReturn pid
EndProcedure
Procedure cheater_KillProcess (pid)
	#PROCESS_TERMINATE = $1
	#PROCESS_CREATE_THREAD = $2
	#PROCESS_VM_OPERATION = $8
	#PROCESS_VM_READ = $10
	#PROCESS_VM_WRITE = $20
	#PROCESS_DUP_HANDLE = $40
	#PROCESS_CREATE_PROCESS = $80
	#PROCESS_SET_QUOTA = $100
	#PROCESS_SET_INFORMATION = $200
	#PROCESS_QUERY_INFORMATION = $400
	#PROCESS_ALL_ACCESS = #STANDARD_RIGHTS_REQUIRED | #SYNCHRONIZE | $FFF
	phandle = OpenProcess_ (#PROCESS_TERMINATE, #False, pid)
	If phandle <> #Null
		If TerminateProcess_ (phandle, 1)
			Result = #True
		EndIf
		CloseHandle_ (phandle)
	EndIf
	ProcedureReturn Result
EndProcedure
Procedure Fin(gamewindowtext.s)
	pid=cheater_pid_return(gamewindowtext.s)
	cheater_KillProcess (pid)
EndProcedure
; ----------------------------------------
; EPB
Dernière modification par Backup le sam. 25/janv./2014 1:17, modifié 1 fois.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Questions pour le jeu.

Message par G-Rom »

Merci Dobro, le bug est du à OpenAL et non au Wrapp ou la SFML elle même.
ce wrapp était basé sur une version 2.0 de la SFML lors du passage de la 1.6 à la 2.0, version non stable donc.
ce wrapping n'est donc pas à utilisé pour de la production.
La SFML en est à la version 2.1 en stable.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Questions pour le jeu.

Message par Backup »

G-Rom a écrit :Merci Dobro, le bug est du à OpenAL et non au Wrapp ou la SFML elle même.
ce wrapp était basé sur une version 2.0 de la SFML lors du passage de la 1.6 à la 2.0, version non stable donc.
ce wrapping n'est donc pas à utilisé pour de la production.
La SFML en est à la version 2.1 en stable.
en partant de ton travail deja énorme , ça devrai pas etre trop long a adapter en Version 2.1 non ?
je supose qu'il n'y a pas trop d'ajout.. et ce qui existe ne dois pas etre bien different de la version Stable .. ?

je n'y connais rien en Wrapping de lib ...

j'ai bien utilisé Dll Viewer, ça affiche le nom des fonctions ... mais pas les Parametres ..
en regardant la Doc, je trouve les parametres , .... mais ça doit etre super long de faire correspondre le tout :roll:
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Questions pour le jeu.

Message par G-Rom »

La SFML comporte 5/6 dll , j'avais tout réuni en une seule en intégrant directement la SFML source dans le wrapp.
Le code est très gros, ca ne s'adapte pas comme ca. :D
je vais le refaire pour la 2.1
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Questions pour le jeu.

Message par Backup »

G-Rom a écrit :je vais le refaire pour la 2.1
Excellent ....

moi je suis bon , pour la Réedition et corriger les pointeurs Typés ... :lol:
alors si il faut passer 2 heures a faire une modif , compte sur moi :) (bon je me mouille pas trop là :mrgreen: )

je ne comprends pas que Fred n'ai pas integré cette lib a Purebasic ...
des problemes de droits ??
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Questions pour le jeu.

Message par G-Rom »

non, pas directx , exclusivement OpenGL. surement pour cela.
C'est pour cela que je pense que si j'avais été à la place de Fred, je me serais concentré uniquement sur le compilateur et les cibles de ce dernier, des lib comme cela il y en a partout sur le net et pour tout les types d'application.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: Questions pour le jeu.

Message par Fred »

Y'en a partout maintenant, avant ca n'était pas le cas. De plus intégrer une lib C++ comme celle là ca fairait un exe plutot balèze et je vois deja venir les raleurs ! ;)
Répondre