Page 1 sur 1
[R] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 12:23
par sozary
Bonjour!!
J'ai voulu après MinMax m'orienter vers la création d'un jeu 2D de type SandBox (bac à sable) se générant aléatoirement.
Le joueur évolue donc dans un monde 2D de type Terraria, où il peut casser des blocs, avancer dans le jeu pour découvrir de nouvelles choses. En effet, le monde se génère aléatoirement au fur et à mesure de l'avancée du joueur.
J'ai donc un monde comme cela:
Voir image 1
Qui génère donc une région centrale, avec des régions sur les côtés s'adaptant à celle centrale:
Voir image 2
Nous évitons donc que le joueur se retrouve d'un coup face à un falaise ou une montagne!
Seule la région sur laquelle est le joueur est visible, mais les régions adjacentes sont générées, afin de permettre une certaine fluidité (quand le joueur change de région):
Voir image 3
Ce que j'aimerais faire? Une grande image réunissant toutes les régions déjà explorées, réalisée à partir des régions générées, afin de pouvoir réaliser un scrolling avec _GDIPlus_BitmapCloneArea():
Voir image 4
De façon à pouvoir réaliser un zoom sur l'emplacement du joueur:
Voir image 5
Voici un exemple du rendu!!
Donc voilà!
Merci d'avance!
Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 12:44
par mikell
Le problème si tu construis une grande image réunissant toutes les régions déjà explorées c'est que tu risques de perdre en fluidité au fur et à mesure que l'image va grandir, surtout si le monde est infini
Si monde est limité, autant générer une grande image dès le départ (ce qui semble être le cas dans l'exemple youtube) et faire une matrix
S'il est infini, alors il vaudrait mieux faire en sorte que le joueur ne puisse pas revenir en arrière de plus de 2 ou 3 régions et supprimer les anciennes régions
Dans ce code (sommaire) on ne peut revenir en arrière (ou en avant) que d'une seule région
► Afficher le texte
Code : Tout sélectionner
#include "Variables.au3"
#include <GUIConstantsEx.au3>
#include "Algorithmes.au3"
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPICom.au3>
; ==========================================Initialisation
_GDIPlus_Startup()
$sImgCLSID = _GDIPlus_EncodersGetCLSID("jpg")
$tGUID = _WinAPI_GUIDFromString($sImgCLSID)
$pEncoder = DllStructGetPtr($tGUID)
$Grass=_GDIPlus_BitmapCreateFromFile ($GrassPath)
$Grass2=_GDIPlus_BitmapCreateFromFile ($Grass2Path)
$Grass3=_GDIPlus_BitmapCreateFromFile ($Grass3Path)
$Grass4=_GDIPlus_BitmapCreateFromFile ($Grass4Path)
$Dirt=_GDIPlus_BitmapCreateFromFile ($DirtPath)
$Ciel=_GDIPlus_BitmapCreateFromFile ($CielPath)
Global $pStream[4]
$Cck=_CreateChunck($Indice,1)
$pStream[1] = _CreateStream($Cck)
$Cck2=_CreateChunck($Indice,0,$Cck)
$pStream[2] = _CreateStream($Cck2)
$Cck3=_CreateChunck($Indice,2,$Cck)
$pStream[3] = _CreateStream($Cck3)
;=================================================
Global $Form1 = GUICreate("Terraria", 769, 741, 412, 205)
$left = GuiCtrlCreateButton("<", 50, 721, 50, 20)
$right = GuiCtrlCreateButton(">", 110, 721, 50, 20)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
GUISetState(@SW_SHOW)
_LoadStream($pStream[2] )
; ===================================================
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $left
_WinAPI_ReleaseStream($pStream[3])
$pStream[3] = $pStream[2]
$pStream[2] = $pStream[1]
_LoadStream($pStream[2] )
$Cck=_CreateChunck($Indice,1)
$pStream[1] = _CreateStream($Cck)
Case $right
_WinAPI_ReleaseStream($pStream[1])
$pStream[1] = $pStream[2]
$pStream[2] = $pStream[3]
_LoadStream($pStream[2] )
$Cck=_CreateChunck($Indice,2,$Cck)
$pStream[3] = _CreateStream($Cck)
EndSwitch
WEnd
_GDIPlus_GraphicsDispose($hGraphic)
_WinAPI_ReleaseStream ( $pStream[1] )
_WinAPI_ReleaseStream ( $pStream[2] )
_WinAPI_ReleaseStream ( $pStream[3] )
_GDIPlus_BitmapDispose ( $Grass )
_GDIPlus_BitmapDispose ( $Grass2 )
_GDIPlus_BitmapDispose ( $Grass3 )
_GDIPlus_BitmapDispose ( $Grass4 )
_GDIPlus_BitmapDispose ( $Dirt )
_GDIPlus_BitmapDispose ( $Ciel )
_GDIPlus_Shutdown()
Exit
;=================================================
Func _LoadStream($strim)
Local $hImage = _GDIPlus_ImageLoadFromStream($strim)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
_GDIPlus_ImageDispose($hImage)
EndFunc
Func _CreateStream($array)
Local $hBitmap = _WinAPI_CreateBitmap(770,720, 1, 32)
Local $hImageS = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
Local $graphicHdl = _GDIPlus_ImageGetGraphicsContext($hImageS)
_GDIPlus_GraphicsDrawImageRect($graphicHdl,$Ciel,0,0,770,720)
For $i=0 to UBound($array)-1
For $j=0 to UBound($array,2)-1
Switch $array[$i][$j]
Case 1
_GDIPlus_GraphicsDrawImage ( $graphicHdl, $Grass, $j*48, $i*48 )
Case 2
_GDIPlus_GraphicsDrawImage ( $graphicHdl, $Dirt, $j*48, $i*48 )
Case 3
_GDIPlus_GraphicsDrawImage ( $graphicHdl, $Grass2, $j*48, $i*48 )
Case 4
_GDIPlus_GraphicsDrawImage ( $graphicHdl, $Grass3, $j*48, $i*48 )
Case 5
_GDIPlus_GraphicsDrawImage ( $graphicHdl, $Grass4, $j*48, $i*48 )
EndSwitch
Next
Next
Local $pStream = _WinAPI_CreateStreamOnHGlobal()
_GDIPlus_ImageSaveToStream($hImageS, $pStream, $pEncoder)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImageS)
_GDIPlus_GraphicsDispose($graphicHdl)
Return $pStream
EndFunc
Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 13:12
par sozary
Merci!!
Juste une question, à quoi cela nous sert de créer un stream avec _WinAPI_CreateStreamOnHGlobal() (bon, en fait c'est quoi un stream

)?
Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 14:32
par mikell
_GDIPlus_ImageSaveToStream permet de stocker les données d'une image directement en mémoire (stream object), ça évite des manipulations donc ça permet lors de l'affichage de l'image suivante cette incomparable fluidité qui ne t'aura certainement pas échappé

Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 14:37
par sozary
En effet

!
Seulement, j'aimerais bien utiliser l'idée des matrices avec les stream, pour juxtaposer les différentes régions!
Comment procéder svp?

Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 19:16
par sozary
Oula! Je viens réaliser un scrolling (le fichier est téléchargeable en dessous), avec une image assez grande (2882x1934), et niveau fluidité........ On est loin du compte. Tu crois que ce projet est réalisable sur AutoIt du coup? (Ou alors j'ai vraiment mal codé et y a mieux!

)
Télécharger le projet
Merci d'avance!
Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 22:29
par mikell
Effectivement ya mieux, en bufferisant (et en corrigeant les éléments dyslexiques)
Maintenant savoir si le projet complet est réalisable sur AutoIt, aucune idée
Tu le sauras pas sans avoir essayé
► Afficher le texte
Code : Tout sélectionner
#include <GDIPlus.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $x = 0, $y = 0
Global $Form1 = GUICreate("Bonhomme avançant", 800, 700, 379, 217)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
$bitmap = _GDIPlus_BitmapCreateFromFile("zoom.jpg")
$W = _GDIPlus_ImageGetWidth($bitmap)
$H = _GDIPlus_ImageGetHeight($bitmap)
$graphicHdl = _GDIPlus_GraphicsCreateFromHWND($Form1)
$g_hBmp_Buffer = _GDIPlus_BitmapCreateFromGraphics(800, 700, $graphicHdl)
$g_hGfx_Buffer = _GDIPlus_ImageGetGraphicsContext($g_hBmp_Buffer)
_GDIPlus_GraphicsClear($g_hGfx_Buffer)
_GDIPlus_GraphicsDrawImageRect($g_hGfx_Buffer, $bitmap, 0, 0, $W, $H)
_GDIPlus_GraphicsDrawImage($graphicHdl, $g_hBmp_Buffer, 0, 0)
While 1
If _IsPressed("27") Then _Droite()
If _IsPressed("28") Then _Bas()
If _IsPressed("26") Then _Haut()
If _IsPressed("25") Then _Gauche()
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
_GDIPlus_GraphicsDispose($g_hGfx_Buffer)
_GDIPlus_BitmapDispose($g_hBmp_Buffer)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_GraphicsDispose($graphicHdl)
_GDIPlus_Shutdown()
;===============================================
Func _trace()
_GDIPlus_GraphicsClear($g_hGfx_Buffer)
_GDIPlus_GraphicsDrawImageRect($g_hGfx_Buffer, $bitmap, 0, 0, $W, $H)
_GDIPlus_GraphicsDrawImage($graphicHdl, $g_hBmp_Buffer, 0, 0)
EndFunc
Func _Droite()
$x += 25
If $x > $W-800 Then
$x = $W-800
Return
EndIf
_GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, -25, 0)
_trace()
EndFunc ;==>_Droite
Func _Bas()
$y += 25
If $y > $H-700 Then
$y = $H-700
Return
EndIf
_GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, 0, -25)
_trace()
EndFunc ;==>_Bas
Func _Gauche()
$x -= 25
If $x < 0 Then
$x = 0
Return
EndIf
_GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, 25, 0)
_trace()
EndFunc ;==>_Gauche
Func _Haut()
$y -= 25
If $y < 0 Then
$y = 0
Return
EndIf
_GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, 0, 25)
_trace()
EndFunc ;==>_Haut
Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 22:34
par sozary
Ah! Oui c'est mieux

!
Et donc comment on juxtapose deux images svp ?
Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 22:44
par mikell
Je te donne juste 2 exemples simples que j'ai sous la main
Normalement avec les codes précédents tu devrais y arriver

► Afficher le texte
Code : Tout sélectionner
#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <GuiConstantsEx.au3>
#Include <WinAPI.au3>
Global $iI, $hBitmap, $hGraphic, $hGUI, $hImage, $aSlice[4]
$hBitmap = _ScreenCapture_Capture("", 0, 0, 400, 400)
$hGUI = GUICreate("Slicer", 800, 200)
GUISetState()
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
$aSlice[0] = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 200, 200)
$aSlice[1] = _GDIPlus_BitmapCloneArea($hImage, 200, 0, 200, 200)
$aSlice[2] = _GDIPlus_BitmapCloneArea($hImage, 0, 200, 200, 200)
$aSlice[3] = _GDIPlus_BitmapCloneArea($hImage, 200, 200, 200, 200)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
For $i = 0 To 3
_GDIPlus_GraphicsDrawImage($hGraphic, $aSlice[$i], $i*200, 0)
Next
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($aSlice[0])
_GDIPlus_ImageDispose($aSlice[1])
_GDIPlus_ImageDispose($aSlice[2])
_GDIPlus_ImageDispose($aSlice[3])
_GDIPlus_GraphicsDispose($hImage)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_Shutdown()
► Afficher le texte
Code : Tout sélectionner
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
Global $w = 200, $c[3] = [50, $w+50, $w*2+50]
$gui = GUICreate("GDI+ Example", 300, 200)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
$hBitmap = _WinAPI_CreateBitmap($w*3, 200, 1, 32)
$g_hBmp_Buffer = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
$g_hGfx_Buffer = _GDIPlus_ImageGetGraphicsContext($g_hBmp_Buffer)
$hPen = _GDIPlus_PenCreate(0xFF00FF00, 10)
$hPen2 = _GDIPlus_PenCreate(0xFFFF0000, 10)
$hPen3 = _GDIPlus_PenCreate(0xFF0000FF, 10)
$hGraphics1 = _GDIPlus_GraphicsCreateFromHWND($gui)
_trace()
Sleep(500)
AdlibRegister("_go", 30)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_GDIPlus_PenDispose($hPen)
_GDIPlus_PenDispose($hPen2)
_GDIPlus_PenDispose($hPen3)
_GDIPlus_GraphicsDispose($hGraphics1)
_GDIPlus_GraphicsDispose($g_hGfx_Buffer)
_GDIPlus_BitmapDispose($g_hBmp_Buffer)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_Shutdown()
;=============================================
Func _trace()
_GDIPlus_GraphicsClear($g_hGfx_Buffer)
_GDIPlus_GraphicsDrawRect($g_hGfx_Buffer, $c[0], 50, 100, 100, $hPen)
_GDIPlus_GraphicsDrawRect($g_hGfx_Buffer, $c[1], 50, 100, 100, $hPen2)
_GDIPlus_GraphicsDrawRect($g_hGfx_Buffer, $c[2], 50, 100, 100, $hPen3)
_GDIPlus_GraphicsDrawImage($hGraphics1, $g_hBmp_Buffer, 0, 0)
EndFunc
Func _go()
Local Static $x = 0
$x -= 2
If $x = -$w Then
$x = 0
$tmp = $c[2]
$c[2] = $c[1]
$c[1] = $c[0]
$c[0] = $tmp
_GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, $w, 0)
Else
_GDIPlus_GraphicsTranslateTransform($g_hGfx_Buffer, -2, 0)
EndIf
_trace()
EndFunc
Re: [..] Patchwork d'image puis scrool
Posté : lun. 25 mai 2015 22:48
par sozary
Aaaaaah!! C'est bon c'est rentré!
Merci beaucoup Mikell!