Anima tips och tricksHä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. Skottriktning1. 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
NEXTI 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
ENDIFIF 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
ENDinputsub:
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
LOOP5. 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