Tengo un prototipo para lo que estás haciendo. Acabo de limpiar el código y lo pongo aquí:
Antes de todo explicar que premisas cumplir.
1. Cada objeto se asocia a una pantalla y a una posicion.
2. Las pantallas son listas de objetos si los colocamos ahí (importante).
3. Un panel es una seccion de pantalla entonces tambien es una lista concreta de objetos.
4. El inventario es una lista de objetos fuera de la pantalla de juego.
5. Si nos movemos de pantalla dejamos atrás la lista de objetos correspondiente.
6. Si entramos en una pantalla nueva veremos nuevos objetos listados allí.
7. Un objeto sólo puede pertenecer a una lista al mismo tiempo.
8. Para comporbar si tengo un objeto uso la función GOT.
9. Para pintar un objeto en la pantalla uso PUT.
10. Para carga el inventario uso GET.
11. Para SOLTAR un objeto uso el comando INV.
Según todo esto:
- necesito intercambiar los objetos entre pantallas cada vez que avanzamos por ellas.
- cargando el inventario estoy vaciando la pantalla y viceversa.
- sólo sé si tengo un objeto cuando está cargado en el inventario (uso funcion GOT).
Empezamos:
EVENT RESTARTSCREEN: En este momento es cuando vamos a entrar en una nueva estancia:
Podría ser buen momento (a elección) para comprobar si tenemos determinado objeto.
Para ello ya hemos cargado previamente el inventario (esto ocurió cuando
salimos de la pantalla anterior).
A continuación coloca en el panel los objetos que traes y refresca la pantalla (REDRAW).
Código:
EVENT RESTARTSCREEN
; ----------------------------------------------------------------------
; Check if you GOT an object from the game's catalog (object = G = 0 in this case).
G = 0
REPEAT 16
IF GOT G
AT 19 0 PRINT "VENGO CON "
AT 19 10 MESSAGE G
ELSE
AT 19 0 PRINT "VENGO SIN "
AT 19 10 MESSAGE G
ENDIF
ENDREPEAT
;
; ----------------------------------------------------------------------
; I fill the panel with everything I got from the game's catalog (16 objects in this case).
LET X = 0
LET Y = 0
LET I = 0
;
REPEAT 16
IF GOT I
PUT X Y I
ADD 16 TO X
ENDIF
add 1 to i
ENDREPEAT
; ----------------------------------------------------------------------
; important
REDRAW
EVENT KILLPLAYER: Para nuestro disgusto, estamos saliendo de una estancia mediante
el comando SCREEN S y tenemos que llevarnos el inventario si queremos que aparezca
en la nueva pantalla de resurrección.
(En otros juegos puedes SOLTAR todos los objetos y reaparecer sin nada).
Cargamos nuestro inventario.
Como tenemos el inventario podemos chequear si tenemos un objeto en concreto (opcional).
Código:
EVENT KILLPLAYER
SUBTRACT 1 FROM LIVES
AT 8 25
DISPLAY LIVES
;
; ----------------------------------------------------------------------
; Load the inventory with the items from the panel and take them with me
LET X = 0
LET Y = 0
;
REPEAT 6
DETECTOBJ
IF OBJ <> 255
GET OBJ
ENDIF
ADD 16 TO X
ENDREPEAT
;
; ----------------------------------------------------------------------
; Check if you GOT an object from the game's catalog (object = G = 0 in this case).
G = 0
REPEAT 16
IF GOT G
AT 19 0 PRINT "MUERO CON "
AT 19 10 MESSAGE G
ELSE
AT 19 0 PRINT "MUERO SIN "
AT 19 10 MESSAGE G
ENDIF
ENDREPEAT
; important to see message only
WAITKEY
; ----------------------------------------------------------------------
;
; vuelve a la pantalla S. (en mi caso la pantalla de salida, donde coloqué a PLAYER RESPAWN)
SCREEN S
SPRITETYPE4: Este es un pequeño invento para que los objetos en pantalla parezcan tener masa y peso.
Es un ayudante sacrificado y fiel.
Código:
EVENT SPRITETYPE4
;DROPPER
; DROP mode
DETECTOBJ
IF OBJ<>255
GET OBJ
PUT X Y OBJ
ENDIF
IF CANGODOWN
ELSE
REMOVE
ENDIF
FALL
; end of DROP mode
DEFINEMESSAGES: No te olvides de ponerle un nombre a cada cosa:
Código:
DEFINEMESSAGES
"LLAVES "
"HIMAN IMANDU "
"MASCARA DEL REO"
"CANDELABRO "
"LAMPARA "
"TELEFONO "
"VENTILADOR "
"PLANTA "
EVENT PLAYER: Dejo esto para el final por que ahora ya sabemos los trozos de código que tenemos que incrustar:
hay varias inserciones:
- "Load the inventory with the items from the panel."
- "Check if you GOT an object from the game's catalog."
- "Fill the panel with everything I got from the game's catalog."
En el control del jugador:
"Load" justo antes de salir de la pantalla: SCREEN n, SCREENLEFT, SCREENRIGHT, SCREENUP, SCREENDOWN.
En el control del "DROPPING"
IF KEY FIRE
"Load"
CALL the INVENTORY MENU and "DROP"
DROP
"Check"
"Fill"
ENDIF
Para el metodo DETECTOBJ
DETECTOBJ
IF OBJ <> 255
; did we detect an object
IF I = 0
Load new objet to inventary
GET OBJ
ADD 1 TO I
"Load"
IF I = 7
DROP
ENDIF
"Check"
"Fill"
ENDIF
ELSE
LET I = 0
ENDIF
Para que todo esto funcione. Debes poner justo después de chequear el control PLAYER:
; PUBLIC position
LET V = X
LET W = Y
CCP: -"Fin del programa".
Aquí está el Código:
EVENT PLAYER
SPRITEINK 7
IF KEY LEFT
LET DIRECTION = LEFT
LET IMAGE = 0
IF X <= LEFTEDGE
; ----------------------------------------------------------------------
; Load the inventory with the items from the panel (take them with me).
LET X = 0
LET Y = 0
;
REPEAT 6
DETECTOBJ
IF OBJ <> 255
GET OBJ
ENDIF
ADD 16 TO X
ENDREPEAT
;
LET X = V
LET Y = W
; ----------------------------------------------------------------------
SCREENLEFT
LET X = RIGHTEDGE
EXIT
ELSE
IF CANGOLEFT
SPRITELEFT
ANIMATE
ENDIF
ENDIF
ENDIF
IF KEY RIGHT
LET DIRECTION = RIGHT
LET IMAGE = 0
IF X >= RIGHTEDGE
; ----------------------------------------------------------------------
; Load the inventory with the items from the panel (take them with me).
LET X = 0
LET Y = 0
;
REPEAT 6
DETECTOBJ
IF OBJ <> 255
GET OBJ
ENDIF
ADD 16 TO X
ENDREPEAT
;
LET X = V
LET Y = W
; ----------------------------------------------------------------------
SCREENRIGHT
LET X = LEFTEDGE
EXIT
ELSE
IF CANGORIGHT
SPRITERIGHT
ANIMATE
ENDIF
ENDIF
ENDIF
; ----------------------------------------------------------------------
; PUBLIC position
LET V = X
LET W = Y
; ----------------------------------------------------------------------
IF KEY UP
JUMP 7
ENDIF
IF KEY FIRE
; ----------------------------------------------------------------------
; Load the inventory with the items from the panel.
LET X = 0
LET Y = 0
;
REPEAT 6
DETECTOBJ
IF OBJ <> 255
GET OBJ
ENDIF
ADD 16 TO X
ENDREPEAT
;
LET X = V
LET Y = W
;
; ----------------------------------------------------------------------
; CALL the INVENTORY MENU and "DROP"
AT 5 6 PRINT "SELECT TO DROP"
AT 7 9 INV "LLAVES,MAGNET,FLASK,CANDELABRO,LAMPARA,TELEFONO,VENTILADOR"
;
; ----------------------------------------------------------------------
; DROP
SUBTRACT 8 TO Y
PUT X Y OPT
SPAWN 4 3
; INSTANCE OF DROPPER SPRITE
ADD 8 TO Y
; ----------------------------------------------------------------------
; Check if you GOT an object from the game's catalog (object = G = 0 in this case).
G = 0
REPEAT 16
IF GOT G
AT 19 0 PRINT "TENGO LAS "
AT 19 10 MESSAGE G
ELSE
AT 19 0 PRINT " NO TENGO "
AT 19 10 MESSAGE G
ENDIF
ENDREPEAT
;
; ----------------------------------------------------------------------
; I fill the panel with everything I got from the game's catalog (16 objects in this case).
LET X = 0
LET Y = 0
LET I = 0
;
REPEAT 16
IF GOT I
PUT X Y I
ADD 16 TO X
ENDIF
add 1 to i
ENDREPEAT
;
LET X = V
LET Y = W
;
; ----------------------------------------------------------------------
ENDIF
IF DEADLY
KILL
ENDIF
DETECTOBJ
IF OBJ <> 255
; did we detect an object
IF I = 0
; ----------------------------------------------------------------------
; Load new objet to inventary
GET OBJ
ADD 1 TO I
BEEP 15
; ----------------------------------------------------------------------
; Load the inventory with the items from the panel.
LET X = 0
LET Y = 0
;
REPEAT 6
DETECTOBJ
IF OBJ <> 255
GET OBJ
ENDIF
ADD 16 TO X
ADD 1 TO I
ENDREPEAT
;
LET X = V
LET Y = W
;
IF I = 7
; ----------------------------------------------------------------------
; DROP
SUBTRACT 8 TO Y
PUT X Y OBJ
SPAWN 4 3
; INSTANCE OF DROPPER SPRITE
ADD 8 TO Y
; ----------------------------------------------------------------------
ENDIF
; ----------------------------------------------------------------------
; Check if you GOT an object from the game's catalog (object = G = 0 in this case).
G = 0
REPEAT 16
IF GOT G
AT 19 0 PRINT "LLEVO LAS "
AT 19 10 MESSAGE G
ELSE
AT 19 0 PRINT "NO LLEVO "
AT 19 10 MESSAGE G
ENDIF
ENDREPEAT
; ----------------------------------------------------------------------
; I fill the panel with everything I got from the game's catalog.
LET I = 0
LET X = 0
LET Y = 0
;
REPEAT 16
IF GOT I
PUT X Y I
ADD 16 TO X
ENDIF
add 1 to i
ENDREPEAT
;
LET X = V
LET Y = W
; ----------------------------------------------------------------------
ENDIF
ELSE
LET I = 0
ENDIF
FALL
Attachements:
events.rar (2.2 KB)