Anima tips och tricks

Här följer några tips på Anima-programmering som inte finns omnämnda i manualen. Har du egna tips så skicka dem till mig.

1.Lagra sprite-typ i extravariabel
2. Avståndsberäkning
3. Inventory-ruta
4. Input-rutin
5. Skottriktning

Tillbaka

1. Lagra sprite-typ i extravariabel
Om man i sitt spel har många spritar av olika slag kan man använda en extravariabel, t ex E1, för att lagra typen och låta programmet skilja mellan dem. I början av programmet där spritarna sätts ut (N()=, X()= osv) lägger man för varje sprite till E1(spritenummer)=typ, där typ är tal man bestämt. T ex 1 = sak man kan ta, 2= sak man inte kan ta, 3=sak man har tagit, 4=fiende, 5=fälla, 6=projektil osv. Programmet kan sedan innehålla slingor som går igenom alla spritar och utifrån deras E1-värde bestämmer vad som ska hända med dem. Exempel: Om man använder kollisionsvariabeln K för att testa om den styrda spriten gått på en annan sprite, kan E1 bestämma följderna. T ex IF E1(K(2))=4 THEN ... (sprite 2 har gått på en fiende). Se också tips 2 och 3.

2. Avståndsberäkning
För att beräkna avståndet mellan två spritar kan följande förenklande formel användas:
D=ABS(X(2)-X(3)) + ABS(Y(2)-Y(3))
Exemplet gäller avståndet mellan sprite 2 och sprite 3. D (för Distance) är egentligen inte det riktiga avståndet utan summan av avstånden i x-led och y-led, men kan användas som mått på avståndet. Felet blir alltid mindre än 50% av det riktiga avståndet.
I följande exempel (se tips 1) testas alla spritar. För alla fiender (E1=4) beräknas avståndet. Fiender som är närmare än 80 pixlar kommer att röra sig mot sprite 2.  Poängen med att använda E1-variabeln är att man inte behöver ändra något i rutinen om man lägger till fler fiender.

FOR S=3 TO 50
  IF E1(S)=4 THEN
    D=ABS(X(S)-X(2))+ABS(Y(S)-Y(2))
    IF D<80 THEN
      IF X(S) > X(2) THEN
        X(S) = X(S) - 2
      ELSEIF X(S)< X(2) THEN
        X(S) = X(S) + 2
      ENDIF
      IF Y(S) > Y(2) THEN
        Y(S) = Y(S) - 2
      ELSEIF Y(S)< Y(2) THEN
        Y(S) = Y(S) + 2
      ENDIF
    ENDIF
  ENDIF
NEXT

I följande variant går motståndaren inte lika rakt då ett slumpmoment är inlagt. Detta ger motståndaren möjlighet att ta sig förbi vissa mindre hinder.

FOR S=3 TO 50
  IF E1(S)=4 THEN
    D=ABS(X(S)-X(2))+ABS(Y(S)-Y(2))
    IF D<80 THEN
      DX=0: DY=0: SLUMP=RND(2)
      IF X(S) > X(2) THEN
        DX= - 2
      ELSEIF X(S)< X(2) THEN
        DX= 2
      ENDIF
      IF Y(S) > Y(2) THEN
        DY = - 2
      ELSEIF Y(S)< Y(2) THEN
        DY = 2
      ENDIF

      IF SLUMP=0 THEN
        DX=0
      ELSEIF SLUMP=1 THEN
        DY=0
      ENDIF
      X(S)=X(S)+DX: Y(S)=Y(S)+DY
    ENDIF
  ENDIF
NEXT
 

3. Inventory-ruta
Följande exempel  är en subrutin som underhåller en inventory-ruta som placeras till höger på skärmen. Dvs en ruta som innehåller tagna föremål. Själva rutan är en bild (nr 10 i exemplet) med ej genomskinligt inre (använd inte vanlig svart färg). Efter det att rutan är utsatt och gammalt innehåll därmed raderat går rutinen igenom alla spritar och kollar deras E1-värde (se tips nr 1). De spritar vars E1-värde är lika med "taget föremål" sätts sedan in i rutan på lagom avstånd från varandra.

inventory:
PUT 10, 1 AT 280, 30
YINVE = 40
FOR I = 1 TO 100
  IF E1(I) = 3 THEN
    PUT I, 1 AT 288, YINVE
    YINVE = YINVE + 20
  ENDIF
NEXT
RETURN
 

4. Input-rutin
Anima saknar ju Input-kommando och stränghantering. I följande exempel används E5-variabeln för att bygga en Input-rutin i form av subrutinen inputsub.Variablerna RAD, KOL (kolumn) och MAXLENGD skickas med till subrutinen för att ange var på skärmen inmatningen skall ske. Det inmatade lagras i E5 från och med E5(1). Längden på det inmatade ligger i E5(0). Vill man lagra flera strängar får andra delar av E5 användas.

RAD=24:KOL=10:MAXLENGD=5: GOSUB inputsub

FOR I=1 TO E5(0)    'testa att skriva ut innehållet i E5
  LOCATE 10,5+I: PRINT CHR$(E5(I))
NEXT
PAUSE:PAUSE 36 'vänta 2 sekunder
END

inputsub:
KOL0=KOL  'startkolumn
DO
  LOCATE RAD,KOL: PRINT "_"  'markör
  DO: A=KEY: LOOP WHILE A=0
  IF A=13 THEN E5(0)=KOL-KOL0 : RETURN    'enter
  IF A=27 THEN E5(0)=0: RETURN            'esc
  IF A=8 AND KOL>KOL0 THEN KOL=KOL-1: LOCATE RAD,KOL: PRINT"  "   'backsteg
  IF A>=32 AND KOL<KOL0+MAXLENGD THEN
    E5(1+KOL-KOL0)=A
    LOCATE RAD,KOL: PRINT CHR$(A): KOL=KOL+1
  ENDIF
LOOP

5. Skottriktning
Om en figur ska skjuta på en annan kan skottet riktas med följande rader (skottet antas vara bild 10 och målet bild 2). Faktorn 10 i beräkningarna av skottets horisontella och vertikala fart kan naturligtvis ändras om skottet skall gå fortare eller långsammare. Man måste tänka på att om målet är mindre än det antal pixlar som skottet flyttas (10 i exemplet), kan skottet passera målet utan att träffa.

D=ABS(X(10)-X(2))+ABS(Y(10)-Y(2))
IF D=0 THEN D=1
H(10)=10*(X(10)-X(2))/D
V(10)=10*(Y(10)-Y(2))/D
 
 

Tillbaka