Minilop Retroware

MPAGD Iniciantes · Parte 17 de 29

Vamos criar um jogo com o MPAGD, Parte 17: Introdução aos OBJECTs

17 de outubro de 2021

Já na Parte 11 introduzimos itens colecionáveis no nosso jogo, no nosso exemplo, ossos que o Stinky Dog precisa de recolher para avançar. Mas há outro tipo de item que podes usar no teu jogo e que oferece muito mais flexibilidade do que os colecionáveis.

O problema dos COLLECTABLE BLOCKS é que são todos tratados da mesma forma: recolhes-os colocando uma instrução GETBLOCKS no evento do jogador, que verifica se o jogador está a tocar num bloco colecionável e, se estiver, remove-o do ecrã e executa o evento COLLECT BLOCKS.

E é aí que está o problema.

O MPAGD não sabe que BLOCK específico recolheste, por isso, se tens vários tipos de colecionáveis e queres, por exemplo, que tenham pontuações diferentes, bónus ou que deem melhorias ao jogador, isso não se consegue facilmente com os COLLECTABLE BLOCKS.

Os OBJECTs, por outro lado, são um pouco diferentes. São itens que podes desenhar como imagens de 16 x 16 px (os blocos são de 8 x 8 no Speccy). Cada objeto tem um estado de 'posse', ou seja, onde está o OBJECT neste momento? Pode ser:

Além disso, cada OBJECT tem um número de identificação específico que podemos usar no nosso código para:

Como vês, os OBJECTs são bastante úteis. Tanto os OBJECTS como os COLLECTIBLE BLOCKS têm prós e contras, e vais ter de os ponderar ao decidir quando usar OBJECTS e quando usar COLLECTIBLE BLOCKS.

Algumas das vantagens dos OBJECTs incluem:

Algumas das desvantagens dos OBJECTs incluem:

Quanto aos COLLECTABLE BLOCKS, algumas das vantagens são:

As desvantagens dos COLLECTABLE BLOCKS

Em geral, o único uso que realmente vejo para os COLLECTABLE BLOCKS é em jogos do tipo Manic Miner, onde é preciso recolher todos os itens para avançar para o ecrã seguinte. Se estás a escrever um jogo de aventura arcade, então os OBJECTS são provavelmente o melhor caminho.

Nos meus jogos, acho os objetos úteis para coisas como:

Também podem ser usados como flags quando ficaste sem variáveis em certas circunstâncias, dependendo do tipo de jogo, mas isso é um tema um pouco mais avançado que vou abordar noutro dia1.

Para já, vamos criar um objeto para o nosso jogo. No menu Editor, seleciona OBJECTS:

Captura de ecrã do tutorial

Criei uma tigela de comida para cães. Vais reparar que o editor é muito parecido com o SPRITE EDITOR, mas há algumas diferenças:

Primeiro, podemos definir a cor do objeto (no Speccy, apenas a cor de primeiro plano) clicando na caixa de cor no canto superior direito... mudei-a para vermelho

Segundo, repara na caixa branca do lado direito, que nos indica:

Prime o cursor para cima ou para baixo para escolher a opção pretendida; a predefinida é CARRYING, o que significa que está no inventário do jogador.

A opção seguinte é HIDDEN: significa que não está no inventário do jogador nem num ecrã específico

Prime o cursor para cima outra vez e mudará para ROOM 000 (ou seja, SCREEN 0 )

Vamos selecionar ROOM 000 e, para o colocar no ecrã, prime a tecla P:

Captura de ecrã do tutorial

Isto leva-te ao SCREEN 0 e coloca o OBJECT no canto superior direito

Não o queremos ali, por isso clicamos no ecrã no sítio onde queremos colocar o objeto:

Captura de ecrã do tutorial

Feito isto, vamos voltar ao editor de OBJECTs (Editor > Objects) e criar mais alguns:

Para criar um novo Object prime a tecla X,

Captura de ecrã do tutorial

Criei um objeto lata de comida para cães, mas desta vez defini-o como 'Hidden'; talvez o use mais tarde como item de bónus... vamos ver.

Ok, tendo criado alguns objetos, vamos precisar de colocar código no PLAYER EVENT que gere o que acontece quando o jogador toca num OBJECT.

DETECTOBJ           ; is sprite touching an object?
IF OBJ <> 255       ; did we detect an object?
    GET OBJ         ; automatically pick it up.
ENDIF

O comando DETECTOBJ verifica se o jogador está a tocar num OBJECT; se estiver, guarda o número do OBJECT na variável OBJ, e se não estiver a tocar em nenhum, o valor de OBJ é definido como 255.

É por isso que verificamos se o valor de OBJ NÃO é 255 ( o <> significa NÃO É )

e se não for 255, devemos estar a tocar num OBJECT, por isso fazemos GET OBJ, ou seja, apanhamos o OBJECT cujo número está guardado neste momento na variável OBJ.

Vamos testar, mas primeiro vamos escrever um pouco mais de código que coloque uma mensagem no ecrã a dizer-nos que apanhámos o DOG BOWL.

DETECTOBJ           ; is sprite touching an object?
IF OBJ <> 255       ; did we detect an object?
    GET OBJ         ; automatically pick it up.
    IF OBJ = 0      ; is it the Dog Bowl
      AT 10 4       ; at line 10 column 4
      COLOUR 13     ; green ink on blue paper
      PRINT "you got the dog food bowl!"   ; display a message
      DELAY 50      ; wait a couple of seconds
      WAITKEY       ; then wait for a key press
      REDRAW        ; redraw the screen & remove the message
    ENDIF
ENDIF

Isto é o que deve acontecer:

Reparaste que, depois de colocarmos uma mensagem no ecrã a dizer que tínhamos apanhado a tigela de comida, tivemos de usar o comando REDRAW para remover a mensagem, e ao fazê-lo todos os ossos COLLECTIBLE que tínhamos recolhido voltaram a aparecer no ecrã?

Quando estás a começar, é importante perceber a diferença entre os COLLECTIBLE blocks e os OBJECTs, e que os dois nem sempre se dão bem.

Voltaremos a ver os OBJECTs mais adiante nesta série, à medida que o nosso jogo se desenvolver.

SEGUINTE: PARTE 18: DIG nestes FODDERBLOCKS

Todo o MPAGD Iniciantes