Colocar un sprite o algo en el fondo background

Previous topic - Next topic

Catoct

Alguien puede decirme como debo hacer  dibujar o clocar un sprite  o  linea en el background y que quede fijo?

Estoy haciendo un mapa conectado por sus bordes y no acabo de ver como hacer esto. 

¡Gracias!  :)

Code (glbasic) Select

// --------------------------------- //
// Project: JacquardScroll1
// Start: Wednesday, March 23, 2016
// IDE Version: 12.308

// SETCURRENTDIR("Media") // go to media files


GLOBAL gwidth ,gheight
gwidth = 800
gheight = 600
SETSCREEN gwidth ,gheight,0

GLOBAL sprite, VistaGrandx1, VistaGrandy1, VistaGrandx2, VistaGrandy2 // Zone to view
VistaGrandx1 = 1 ; VistaGrandy1 = 1 ; VistaGrandx2 = 600 ; VistaGrandy2 = 430
GLOBAL speedH, speedW, imgX, scrW, imgWide, imgY, scrH, imgHeight
GLOBAL worldX, worldY ,MundoX, MundoY

GLOBAL mx,my, b1,b2 ,phi
GLOBAL tile
LOADFONT "smalfont2.png",1
SETFONT 1
GLOBAL map = GENSPRITE()
SYSTEMPOINTER TRUE
map=1 //  sprite 1
LOADSPRITE "cachemir01.jpg", map //actualmente el tamaño es 1200*920. La imagen tiene que ser mas grande que lo que aparece en pantalla.
                        //  salen 80 tiles X 60 de 16 pinxels
GETSPRITESIZE map, imgWide, imgHeight

scrW=imgWide ; scrH= imgHeight // <-------I do this solution, even it is was the best it works FOR my purpose.


imgX=0 ; imgY=0 ; speedW=4 ; speedH=4

//Esto seria para hacer un array de los tiles poniendo zonas
GLOBAL tilex,tiley
tilex= MOD (MundoX/16,imgWide)
tiley= MOD (MundoY/16,imgHeight)



//-------------------------------------------------------------------------
//                           inicio

LIMITFPS 60
//Un sprite A
//DRAWRECT 0,0,64,32,RGB(255,255,0)
//DRAWRECT 7,23,4,4,RGB(255,0,0)
//GRABSPRITE 0, 0,0,64,32

GLOBAL id =0

main:

VIEWPORT VistaGrandx1, VistaGrandy1, VistaGrandx2, VistaGrandy2

DRAWLINE VistaGrandx1-1,VistaGrandy1-1,VistaGrandx2+1,VistaGrandy1-1, RGB(0,0,255)    // horizontal - arriba - derecha
    DRAWLINE VistaGrandx2+1,VistaGrandy1-1,VistaGrandx2+1,VistaGrandy2+1, RGB(0,0,255)    //vertical - derecha -abajo
    DRAWLINE VistaGrandx2+1,VistaGrandy2+1,VistaGrandx1-1,VistaGrandy2+1, RGB(0,0,255)    //horizontal -abajo izquiuierda
    DRAWLINE VistaGrandx1-1,VistaGrandy2+1,VistaGrandx1-1,VistaGrandy1-1, RGB(0,0,255)    //Vertical-arriba-izquierda

IF KEY(200) THEN imgY=imgY-speedH ; IF (imgY+scrH)<0 THEN imgY=imgY+scrH
IF KEY(208) THEN imgY=imgY+speedH ; IF imgY>0 THEN imgY=imgY-scrH
IF KEY(203) THEN imgX=imgX-speedW ; IF (imgX+scrW)<0 THEN imgX=imgX+scrW
IF KEY(205) THEN imgX=imgX+speedW ; IF imgX>0 THEN imgX=imgX-scrW

// Convert world coordinates into imgX AND imgY (the IF makes it handles POSITIVE world coordinates too)
MundoX = MOD (worldX,imgWide) ;MundoX = -imgX ; IF worldX < 0 THEN MundoX = imgX - imgWide
MundoY = MOD (worldX,imgHeight) ; MundoY = -imgY ; IF worldY < 0 THEN MundoY = imgY - imgHeight
GENSPRITE()
DRAWSPRITE map, imgX, imgY
DRAWSPRITE map, imgX, imgY+scrH
    DRAWSPRITE map, imgX+scrW, imgY
DRAWSPRITE map, imgX+scrW, imgY+scrH

//-------------------
PRINT " imgX = "+imgX + " imgY = "+imgY,1,384 // no se ve el texto fuera del viewport
PRINT " worldX = "+MundoX + " worldY = "+MundoY,1,400
PRINT " tilex = "+tilex + " tiley = "+tiley+ "bla-bla-bla---bla"+map,1,416
//Cambiar el middlehandle del sprite
MOUSESTATE mx,my,b1,b2

IF b1=1

// DRAWRECT mx-1,my-1,20,20, RGB(0,255,0)
       GRABSPRITE id,  mx-1,my-1, 20,20
       //  USESCREEN 1  // con esto se cuelga
         DRAWSPRITE id, mx-20,my                   // <-- ¿Como pongo esto en el fondo o blaground?
         USEASBMP
     //    ¡USESCREEN -1 // con esto se cuelga
         SHOWSCREEN

ENDIF



SHOWSCREEN

GOTO main





mentalthink

Bienvenido al foro, aunque me parece que Spanish peope somos poquitos ya...  :P

Pues es sencillo para hacer un background , supongo que es a lo que te refieres, es cargar la imagen y mostrarla.
Tienes que tener cuidado porque normalmente GLbasic usa una carpeta llamada media para que pongas todo lo referente a los gráficos y el audio o lo que quieres.

Esto lo haces asi.
Setcurrentdir ("media"), que te sale por defecto como un comentario.

Y luego el programa sería algo asi.

Code (glbasic) Select

Loadsprite "lo que sea, jpg, png, bmp" , un numero entero por ejemplo 100
while true (Bucle infinito, que lo cortas con la tecla ESC)
drawsprite 100, 0,0  (0,0 son las coordenas x e y de la pantalla en esté caso es la esquina izquierda superior)
showscreen   (Esto es el Update de los FPS)
wend


Y con esto tienes un background fijo, si lo quieres mover es ponerle variables a las X o las Y.

Catoct

No no me refiero a poner la imagen en el buffer de la pantalla.
Me refiero a pegar la imagen en el background o fondo. Que quede impresa o dibujada en el fondo y cuando se haga el scroll del fondo forme parte del fondo.

Si testeas mi programa, veras que la imagen no queda pegada al fondo o a la  imagen que se cargó de fondo. La imagen "cachemir01.jpg" es la que carga de fondo como SCREEN 1 y ahí quiero que el sprite quede impreso.

Alex_R

Hola Catoct!

Bienvenido al foro. Como dice mentalthink antes éramos más hablantes de español pero aún quedamos alguno.

El problema que te dice mental de tu código es que no haces un loop que lo ejecute de forma ininterrumpida hasta que le des a la tecla escape o ejecutes un END.

Tu código lo ejecuta una vez y lo pinta una sola vez y luego acaba el programa (cuando se acaba la ejecución del programa ya no se pinta más). Entonces debes poner tu función MAIN dentro de un loop y al final de cada ciclo del loop ejecutar siempre un showscreen porque si no no pintará nada. Así que tu código, que no he probado, debería tener este aspecto:

Code (glbasic) Select

// --------------------------------- //
// Project: JacquardScroll1
// Start: Wednesday, March 23, 2016
// IDE Version: 12.308

// SETCURRENTDIR("Media") // go to media files


GLOBAL gwidth ,gheight
gwidth = 800
gheight = 600
SETSCREEN gwidth ,gheight,0

GLOBAL sprite, VistaGrandx1, VistaGrandy1, VistaGrandx2, VistaGrandy2 // Zone to view
VistaGrandx1 = 1 ; VistaGrandy1 = 1 ; VistaGrandx2 = 600 ; VistaGrandy2 = 430
GLOBAL speedH, speedW, imgX, scrW, imgWide, imgY, scrH, imgHeight
GLOBAL worldX, worldY ,MundoX, MundoY

GLOBAL mx,my, b1,b2 ,phi
GLOBAL tile
LOADFONT "smalfont2.png",1
SETFONT 1
GLOBAL map = GENSPRITE()
SYSTEMPOINTER TRUE
map=1 //  sprite 1
LOADSPRITE "cachemir01.jpg", map //actualmente el tamaño es 1200*920. La imagen tiene que ser mas grande que lo que aparece en pantalla.
                        //  salen 80 tiles X 60 de 16 pinxels
GETSPRITESIZE map, imgWide, imgHeight

scrW=imgWide ; scrH= imgHeight // <-------I do this solution, even it is was the best it works FOR my purpose.


imgX=0 ; imgY=0 ; speedW=4 ; speedH=4

//Esto seria para hacer un array de los tiles poniendo zonas
GLOBAL tilex,tiley
tilex= MOD (MundoX/16,imgWide)
tiley= MOD (MundoY/16,imgHeight)



//-------------------------------------------------------------------------
//                           inicio

LIMITFPS 60
//Un sprite A
//DRAWRECT 0,0,64,32,RGB(255,255,0)
//DRAWRECT 7,23,4,4,RGB(255,0,0)
//GRABSPRITE 0, 0,0,64,32

GLOBAL id =0

FUNCTION main:

VIEWPORT VistaGrandx1, VistaGrandy1, VistaGrandx2, VistaGrandy2

        DRAWLINE VistaGrandx1-1,VistaGrandy1-1,VistaGrandx2+1,VistaGrandy1-1, RGB(0,0,255)    // horizontal - arriba - derecha
    DRAWLINE VistaGrandx2+1,VistaGrandy1-1,VistaGrandx2+1,VistaGrandy2+1, RGB(0,0,255)    //vertical - derecha -abajo
    DRAWLINE VistaGrandx2+1,VistaGrandy2+1,VistaGrandx1-1,VistaGrandy2+1, RGB(0,0,255)    //horizontal -abajo izquiuierda
    DRAWLINE VistaGrandx1-1,VistaGrandy2+1,VistaGrandx1-1,VistaGrandy1-1, RGB(0,0,255)    //Vertical-arriba-izquierda

        IF KEY(200) THEN imgY=imgY-speedH ; IF (imgY+scrH)<0 THEN imgY=imgY+scrH
        IF KEY(208) THEN imgY=imgY+speedH ; IF imgY>0 THEN imgY=imgY-scrH
        IF KEY(203) THEN imgX=imgX-speedW ; IF (imgX+scrW)<0 THEN imgX=imgX+scrW
        IF KEY(205) THEN imgX=imgX+speedW ; IF imgX>0 THEN imgX=imgX-scrW

// Convert world coordinates into imgX AND imgY (the IF makes it handles POSITIVE world coordinates too)
        MundoX = MOD (worldX,imgWide) ;MundoX = -imgX ; IF worldX < 0 THEN MundoX = imgX - imgWide
        MundoY = MOD (worldX,imgHeight) ; MundoY = -imgY ; IF worldY < 0 THEN MundoY = imgY - imgHeight
        GENSPRITE()
        DRAWSPRITE map, imgX, imgY
        DRAWSPRITE map, imgX, imgY+scrH
    DRAWSPRITE map, imgX+scrW, imgY
        DRAWSPRITE map, imgX+scrW, imgY+scrH

//-------------------
PRINT " imgX = "+imgX + " imgY = "+imgY,1,384 // no se ve el texto fuera del viewport
PRINT " worldX = "+MundoX + " worldY = "+MundoY,1,400
PRINT " tilex = "+tilex + " tiley = "+tiley+ "bla-bla-bla---bla"+map,1,416
//Cambiar el middlehandle del sprite
MOUSESTATE mx,my,b1,b2

         IF b1=1

//       DRAWRECT mx-1,my-1,20,20, RGB(0,255,0)
       GRABSPRITE id,  mx-1,my-1, 20,20
       //  USESCREEN 1  // con esto se cuelga
         DRAWSPRITE id, mx-20,my                   // <-- ¿Como pongo esto en el fondo o blaground?
         USEASBMP
     //    ¡USESCREEN -1 // con esto se cuelga


ENDIF

ENDFUNCTION


WHILE TRUE //Bucle infinito que ejecuta tu función main hasta que pulses ESC
main()
SHOWSCREEN
WEND


mentalthink

Gracias Alex-R por responder, (no había mirado su código)  :-[ , pero yo lo que veo que si hace el bucle no?¿, porque tiene una etiqueta y un goto... (la verdad que en mi vida he usado el goto así que no sé si debe funcionar)

Catoct, con lo que te comentamos te sale la imagen todo el rato, luego si quieres hacer scroll , simplemente tienes que modificar las variables que pertenecen a la X o la Y de la imagen con un valor, por ejemplo un contador o cuando pulses una tecla , haces por ejemplo x=x+1 o con inc x (que sería lo mismo que decir ) x=x+1.

Si no sale, nos lo dices de nuevo...

Alex_R

De nada mentalthink. Siempre que puedo y me acuerdo me paso por aquí. Me sigue gustando hacer cosas con GLBasic.

Es verdad que usa un "goto" en su código. Si te soy sincero no sabía ni que existiera  :noggin:

A ver si se unen más hablantes de español al foro. Yo estoy intentando convencer a unos amigos a que programen con GLBasic, por lo fácil que es y lo rápido que salen las cosas.

Catoct

Pues yo sigo viendo el programa igual y que no queda el sprite dibujado en el backgrund.

Y digo que está igual porque mi código SI tiene un loop y no acaba el programa.
si os fijáis esta el:


Code (glbasic) Select


GLOBAL id =0

main:

VIEWPORT VistaGrandx1, VistaGrandy1, VistaGrandx2, VistaGrandy2




luego el programa vuelve al main:" con el GOTO main



Code (glbasic) Select



ENDIF


SHOWSCREEN

GOTO main



O sea, que no creo que el fallo esté en el looping, sino en ocmo se coloca el sprit en en backgrund, pero no acabo de ver el porqué

Marmor


Ian Price

I came. I saw. I played.

Catoct

Reporting that my avatar has been stolen hahaha  :D

erico

Yep, Marmor does that quite often... :D :D :D

Did you figure your problem out?