If I only use 2 layers, it still looks 3d a little and ALMOST moves fast enough on my laptop for some gameplay. Remember the flying witch through candies that you helped me out with collision detecting? I put it all together with the scrolling fog code. Just wanted to see what the speed would be like.
- Dav
- Dav
Code: (Select All)
SCREEN _NEWIMAGE(1000, 600, 32)
candy& = BASIMAGE1&
witch& = BASIMAGE2&
fog& = _NEWIMAGE(300, 300, 32)
_DEST fog&
FOR i = 1 TO 10000
c = RND * 200 + 50
ball RND * _WIDTH, RND * _HEIGHT, RND * 15, c, c, c + 50, RND * 2
NEXT
fog1& = _COPYIMAGE(fog&)
_PUTIMAGE (_WIDTH, 0)-(0, _HEIGHT), fog1&
fog2& = _COPYIMAGE(fog1&)
_DEST 0
candies = 7
DIM SHARED candyx(candies), candyy(candies), candya(candies)
'======
restart:
'======
witchflyx = 20
witchflyy = 300
candycount = 0
FOR j = 1 TO candies
candyx(j) = _WIDTH + (RND * _WIDTH) * 2
candyy(j) = 40 + (RND * (_HEIGHT - 100))
candya(j) = RND * 360
NEXT
DO
'draw candies
FOR j = 1 TO candies
RotoZoom3 candyx(j), candyy(j), candy&, 1, 1, _D2R(candya(j))
candya(j) = candya(j) + 6
IF candya(j) > 360 THEN candya(j) = 1
NEXT
'see if witch hit a candy
FOR j = 1 TO candies
wx1 = witchflyx: wy1 = witchflyy
wx2 = wx1 + 75: wy2 = wy1 + 75
jx1 = candyx(j): jy1 = candyy(j)
jx2 = jx1 + 75: jy2 = jy1 + 75
hit = collision%(wx1, wy1, 75, 75, candyx(j) - 37, candyy(j) - 37, 60, 60)
IF hit THEN
CLS
FOR r = -3 TO 0
_PUTIMAGE (spos2, 0 + r)-(spos2 + _WIDTH + r, _HEIGHT), fog1&
_PUTIMAGE (spos2 + _WIDTH + r, 0)-(spos2 + (_WIDTH * 2) + r, _HEIGHT), fog2&
spos2 = spos2 - 3: IF spos2 <= -_WIDTH THEN spos2 = 0
'draw jacks
FOR j2 = 1 TO candies
RotoZoom3 candyx(j2), candyy(j2), candy&, 1, 1, _D2R(candya(j2))
NEXT
_PUTIMAGE (spos3, 0 + r)-(spos3 + _WIDTH + 800 + r, _HEIGHT + 800), fog1&
_PUTIMAGE (spos3 + _WIDTH + 800 + r, 0)-(spos3 + ((_WIDTH + 800) * 2) + r, _HEIGHT + 800), fog2&
spos3 = spos3 - 12: IF spos3 <= -_WIDTH - 800 THEN spos3 = 0
NEXT
_DISPLAY
tmp& = _COPYIMAGE(_DISPLAY)
'spin witch out here
r = 1
FOR dy = witchflyy + 35 TO _HEIGHT STEP 3
_PUTIMAGE (0, 0), tmp&
RotoZoom3 witchflyx + 75, dy, witch&, 1, 1, _D2R(r)
r = r + 5: IF r > 360 THEN r = 1
_LIMIT 150
_DISPLAY
NEXT
_FREEIMAGE tmp&
EXIT DO
END IF
NEXT
'move candies, compute
FOR j = 1 TO candies
candyx(j) = candyx(j) - 8
IF candyx(j) < -75 THEN
candycount = candycount + 1
'If won...
IF candycount > 75 THEN
_DELAY 3
END
END IF
candyx(j) = _WIDTH + (RND * _WIDTH) * 2
candyy(j) = 40 + (RND * (_HEIGHT - 100))
END IF
NEXT
'===================================================
'Here's the witch code....
'if pressed space, move witch up& forward
IF INP(&H60) = 57 THEN
witchflyy = witchflyy - 6
witchflyx = witchflyx + 6
spos3 = spos3 - 4 '<-- scroll fog faster too (remove it wanted)
ELSE
' else wich drifts down
witchflyy = witchflyy + 3
witchflyx = witchflyx - 2
END IF
'keep witch in screen bounds
IF witchflyx < 5 THEN witchflyx = 5
IF witchflyx > _WIDTH - 100 THEN witchflyx = _WIDTH - 100
IF witchflyy < 5 THEN witchflyy = 5
IF witchflyy > _HEIGHT - 100 THEN witchflyy = _HEIGHT - 100
_PUTIMAGE (witchflyx, witchflyy), witch&
LOCATE 1, 1: PRINT "Press SPACE to fly...Avoid touching the candies!";
'===========================================================
_PUTIMAGE (spos2, 0)-(spos2 + _WIDTH, _HEIGHT), fog1&
_PUTIMAGE (spos2 + _WIDTH, 0)-(spos2 + (_WIDTH * 2), _HEIGHT), fog2&
spos2 = spos2 - 3: IF spos2 <= -_WIDTH THEN spos2 = 0
_PUTIMAGE (spos3, 0)-(spos3 + _WIDTH + 800, _HEIGHT + 800), fog1&
_PUTIMAGE (spos3 + _WIDTH + 800, 0)-(spos3 + ((_WIDTH + 800) * 2), _HEIGHT + 800), fog2&
spos3 = spos3 - 12: IF spos3 <= -_WIDTH - 800 THEN spos3 = 0
_DISPLAY
_LIMIT 30
LOOP
GOTO restart
SUB ball (BallX, BallY, size, r&, g&, b&, a&)
FOR s = 1 TO size STEP .35
CIRCLE (BallX, BallY), s, _RGBA(r&, g&, b&, a&)
r& = r& - .5: g& = g& - .5: b& = b& - .5
NEXT
END SUB
FUNCTION BASIMAGE2& 'witch.png
v& = _NEWIMAGE(100, 96, 32)
DIM m AS _MEM: m = _MEMIMAGE(v&)
A$ = ""
A$ = A$ + "haIkMV\Bc4447?7mP??NcCRGl5#?XRXX8j11AAa=R8^P;h2^S2^7#Aa3NaK2"
A$ = A$ + "nDhIO7lJomm_CjhT9Cb<IVNjZ<CMh767UTdeoYk^ZZ[^WLiEib98888THFMe"
A$ = A$ + "EEGNiUZc>k<=hehJK^iVJXnkGF0H_Q]OQ5FhoG8GMIWMfA]hR;:jB:aXS>JX"
A$ = A$ + "J#md5Y?Sm0S557]`?mfK_R^`8m``<c<SFC`HOH<#ZKOo5a<?]OVJZYDOla79"
A$ = A$ + "BOFNiUEgOomR^H9Nla7EaMn53_mfKJ=9OnlR^H9#o5<7Q=VWQjfBc4f#C`k3"
A$ = A$ + "6;TjfBc2FAC:Y;[_njR^H1#\7fbW\a6K<eMgMWFGfMgM3dgR`0nbMk]gVIeF"
A$ = A$ + "MliFd?iK^iVRfb4nn0o\Yffd<d7aJ`0k2UPh;8G3:Qnk23\9T3QJ`:[\RF3T"
A$ = A$ + "HKXG?THIZV17L#WZ18G1VeRQjf>gX[^jbij0e]I^BBcYEDY]fJ;C7GADHXQ6"
A$ = A$ + "b9JaLc=WJ_mfCdRj`6K\QCd2=<XmbIRbJ[Kki<dS;bPf>k`QjPGJ]eF5m`38"
A$ = A$ + "o[DWG4MoB6H;X6[UGM;PnN26HCX2MlF<#7lR^f;HP]QUjAnR[aWY^7NomgCM"
A$ = A$ + "m8;W;MSVH\gj[Eb^<a4CDQMiR;^#eIWM:jQSY#Q2:Pg[ISJ2:8VLb9EC?mdZ"
A$ = A$ + ":RgQ1f0>CJ>O?dM\>^Dg6i<GMeE:`lc?_2SA5GK=lE:<]DWC66dVi8WNjYaf"
A$ = A$ + "f74VJS7o\Naf8iD?HniWOdm;\UNhe>OmeGG<?jRN4Idm?`[]PFHZgJo0=YRL"
A$ = A$ + "hcPf=ga6cOkgo<oHl]^lm02YZN#MKXI1KiKkQ7NXX990oaVWDTH\3Wc?oL]="
A$ = A$ + "b<f>^76f]dHMI5mXbJ53_foNPZlo[U]m1AF>7]0K_o0C2XOX>^N6HG4mXXN\"
A$ = A$ + "eFKUYe3>E_c0T;H\W4Yf^#5mdC?Za7OLbe1_8e<RkZQ]X2bKRaO>hSQ>oH<`"
A$ = A$ + ">iBX^>A2SdNm>>iTCD7MdAj?Sbk7;RQKcWD5ioMMi3RJe^<oM\f<V[QGK^>j"
A$ = A$ + "32OKVMfI;oIa5=9ZWS?L4ciTB]FKo6Q`ZCKoWkD1ank_O5_7VcGWJAm6GVmm"
A$ = A$ + "EBA2[N^ZeJbH3NjYW2<?NjhfIP]9]1i^7aQj=g4Q=6R;RK3OW<SYR?cQ7NHb"
A$ = A$ + "]EF3?fB<6RIl4lkH_]Sk9KTadMMLdMdA7dK3S9X6PlN_n17L#Z<_\[fcAoEI"
A$ = A$ + "P168e\me2_Wo3K_mfZ?olCb]3L0X5nmUQ2#MH^dB;A^mPJhB]V<b8S#^]P3#"
A$ = A$ + "UNlmgOGnl7\onkWLk07PZeL7af]fJ[YJ_mf9g6`9XB?<m=diEQ1f1>0b?b3?"
A$ = A$ + "l0YcM8SCm;DOna5glVPLSmlc?[NmeG9g6J;dkm32e2#DggNX?<F?7<fZYV=P"
A$ = A$ + "?j`ghFJY5b]UF1Re2_JBLcI[I>8XA8W27Ola>]NN\5IQj#YZJ8WahMMUJfQk"
A$ = A$ + "JBFX_QG#mfT6k1CKY5Q]W4J61[A3gdT\ni_7b5`;_l2ijPX5o27jW8e7GUX["
A$ = A$ + "A3Rd2i<c=HXh\lAjGDK#><ek;77Y5MgMgRFD7POV^B?j[_n4]84LAm]PaWbj"
A$ = A$ + "W[HLA?Ti:J<B[jSDNFN6O\MN]THlB>fhl>6aG:?_^\3je;91JQllOdn4ga]T"
A$ = A$ + "cc]dS6Jo6V_dI9>3nNg\BDmoEVcf=4Vo_bc75gBmZc59f>gC#?_7oj[_Zj\#"
A$ = A$ + "F`Qh[?1GfO`IA#MLIfoMbIjVPPPPPPPP#S`o0XLK%%h1"
btemp$ = ""
FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
IF INSTR(1, B$, "%") THEN
FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
IF F$ <> "%" THEN C$ = C$ + F$
NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
IF MID$(B$, j, 1) = "#" THEN
MID$(B$, j) = "@": END IF: NEXT
FOR t% = LEN(B$) TO 1 STEP -1
B& = B& * 64 + ASC(MID$(B$, t%)) - 48
NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
NEXT: btemp$ = btemp$ + X$: NEXT
btemp$ = _INFLATE$(btemp$, m.SIZE)
_MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
BASIMAGE2& = _COPYIMAGE(v&): _FREEIMAGE v&
END FUNCTION
FUNCTION BASIMAGE1& 'candy.png
v& = _NEWIMAGE(75, 75, 32)
DIM m AS _MEM: m = _MEMIMAGE(v&)
A$ = ""
A$ = A$ + "haIkL^ZTR3450UOUE^oBHAR4964[49B\8ARTZh;09B\8AR\gjTZ^CeE6jT>9"
A$ = A$ + "MBo8GaYHNGY?cmEg9c\HQIa2555555UNcbU;=[F]b\NmjZGimSmeD:bf]K=W"
A$ = A$ + ">MbLkf=cmkg[NmbU;V37>Di]HOmU:#l3NjicWV?Onl3_Oo^jSMnlI3^DMVI1"
A$ = A$ + ">Ph8K?Ic[G_<?Nl`LmjeIOL6a<h2G^ZNL6iVkf]KFj[S7?n[l_VPh<ZYag7m"
A$ = A$ + "1RmeoD1eZ8>Qe__^b>6SlbiB<FOMU]c86SjHcQI<jJ>hgl5ekf_OOak:O[]g"
A$ = A$ + "4hJLN\G;S=DOVlXQh:L]MNHYV?fflEndGDVG5nko<E`K7keFXAZ_CMWnD[2?"
A$ = A$ + "SGf\Ic?NZTm5i?M]n^d3TJjT7c\3eME9j;FWMaEfNRh9GNbfGUB=<F_nf;\["
A$ = A$ + "NBP_^BH_TnFOgNfCkjhMQLOOATO#_\VVOGf78aC#OlT0aSaN=?4Hmo]JFbNo"
A$ = A$ + "4752GUkaGL]cNQUI747I7;5:?E2m8a3DgZ^K2]S:5OaenDhXBaGOK6LeG^S]"
A$ = A$ + "VJGUSnRi7RQWbEOik\hS5idlGaXNEMR]3l5fcC\ME>m\24[jkB=;PmMV3gK]"
A$ = A$ + "H6KQW`A<GlO<VZmZVjn:6NBVoElT0^;Uc7SANXh:K?1bIE7KWh2RkC1?9Tji"
A$ = A$ + "RC]WJbE0ekS]CLaD=[U?N2hN>UZW5mHg?Tm8h[W0>?]Dni=I\Za;g_R^h:9f"
A$ = A$ + ":E[K=FaFlcUO?`JgG?9Tb?[9QLodbcO:e2kSWTi]R]CLAXZaKk9V1X?NBVO8"
A$ = A$ + "EW==4W[UDGZ_iMiBo#X_cVFolkin5=4?U3^RH[^FgZ^WXWo#m4`cTOZV3:dU"
A$ = A$ + "NRQ>F:GVabVVVgjKgGajWI#8boBei[Li;Ggce#W_E?V:UW]b5=iY#k8kI5Bi"
A$ = A$ + "Jj]i:iggSALT=YnIHe4DOM\mS=YnISfFLeDiYDoLnJSQ\O^iTW\S]6cl`BaC"
A$ = A$ + "0[SQ\7hflD>fc[9XgDXWg\4m4#_9jAYiMna#??:1fCL9kY#h[ihOkiM]F?ei"
A$ = A$ + "8o=WNV[2]_HmkjLHH63nLhDVm?GW5?d>Sl:L2c\b[lnh7nLZSn=bo[JDgXXX"
A$ = A$ + "XXXXXDNlO<Mg%%h1"
btemp$ = ""
FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
IF INSTR(1, B$, "%") THEN
FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
IF F$ <> "%" THEN C$ = C$ + F$
NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
IF MID$(B$, j, 1) = "#" THEN
MID$(B$, j) = "@": END IF: NEXT
FOR t% = LEN(B$) TO 1 STEP -1
B& = B& * 64 + ASC(MID$(B$, t%)) - 48
NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
NEXT: btemp$ = btemp$ + X$: NEXT
btemp$ = _INFLATE$(btemp$, m.SIZE)
_MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
BASIMAGE1& = _COPYIMAGE(v&): _FREEIMAGE v&
END FUNCTION
SUB RotoZoom3 (X AS LONG, Y AS LONG, Image AS LONG, xScale AS SINGLE, yScale AS SINGLE, radianRotation AS SINGLE)
' This assumes you have set your drawing location with _DEST or default to screen.
' X, Y - is where you want to put the middle of the image
' Image - is the handle assigned with _LOADIMAGE
' xScale, yScale - are shrinkage < 1 or magnification > 1 on the given axis, 1 just uses image size.
' These are multipliers so .5 will create image .5 size on given axis and 2 for twice image size.
' radianRotation is the Angle in Radian units to rotate the image
' note: Radian units for rotation because it matches angle units of other Basic Trig functions
' and saves a little time converting from degree.
' Use the _D2R() function if you prefer to work in degree units for angles.
DIM px(3) AS SINGLE: DIM py(3) AS SINGLE ' simple arrays for x, y to hold the 4 corners of image
DIM W&, H&, sinr!, cosr!, i&, x2&, y2& ' variables for image manipulation
W& = _WIDTH(Image&): H& = _HEIGHT(Image&)
px(0) = -W& / 2: py(0) = -H& / 2 'left top corner
px(1) = -W& / 2: py(1) = H& / 2 ' left bottom corner
px(2) = W& / 2: py(2) = H& / 2 ' right bottom
px(3) = W& / 2: py(3) = -H& / 2 ' right top
sinr! = SIN(-radianRotation): cosr! = COS(-radianRotation) ' rotation helpers
FOR i& = 0 TO 3 ' calc new point locations with rotation and zoom
x2& = xScale * (px(i&) * cosr! + sinr! * py(i&)) + X: y2& = yScale * (py(i&) * cosr! - px(i&) * sinr!) + Y
px(i&) = x2&: py(i&) = y2&
NEXT
_MAPTRIANGLE _SEAMLESS(0, 0)-(0, H& - 1)-(W& - 1, H& - 1), Image TO(px(0), py(0))-(px(1), py(1))-(px(2), py(2))
_MAPTRIANGLE _SEAMLESS(0, 0)-(W& - 1, 0)-(W& - 1, H& - 1), Image TO(px(0), py(0))-(px(3), py(3))-(px(2), py(2))
END SUB
FUNCTION collision% (b1x, b1y, b1w, b1h, b2x, b2y, b2w, b2h)
' x, y represent the box left most x and top most y
' w, h represent the box width and height which is the usual way sprites / tiles / images are described
' such that boxbottom = by + bh
' and boxright = bx + bw
'so the specific gosub above is generalized to a function procedure here!
IF (b1y + b1h < b2y) OR (b1y > b2y + b2h) OR (b1x > b2x + b2w) OR (b1x + b1w < b2x) THEN
collision% = 0
ELSE
collision% = -1 ' Collsion is true
END IF
END FUNCTION