pyörähti käyntiin ja ihmettelin CoolBasicilla tehtyjen roguelike pelien vähäisyyttä. Pohdin syitä ja tulin siihen tulokseen että CoolBasicin tekstikomennot ovat liian hitaita. Koitin poistaa/kiertää tuon esteen ja aloitin roguelike grafiikkamoottorin tekemisen. Tässä nyt muutaman viikon satunnaisen koodaamisen tulos.
Code: Select all
// Memscreen
Dim MemScreenCharset(255,1,1,1) As integer
Global MemScreenEmptyimg, MemScreenCharW, MemScreenCharH, MemScreenColors, MemScreenInitialized
Const MemScreenImage = 0
Const MemScreenImageWidth = 4
Const MemScreenImageHeight = 8
Const MemScreenWidth = 12
Const MemScreenHeight = 16
Const MemScreenLayers = 20
Const MemScreenBuffer = 24
Const MemScreenChanges = 28
Const MemScreenChangelist = 32
Const MemScreenMemBlockSize = 36
Function MemScreenInitialize(cw,ch,colors)
If colors>32 Then MakeError "Warning! Please use smaller value (eg. 32) for colordepth. You are now trying to allocate "+(Float(colors^3)*255.0*4.0/1024.0/1024.0)+"MB of memory."
MemScreenEmptyimg=MakeImage(cw,ch)
MemScreenColors=colors
MemScreenCharW=cw
MemScreenCharH=ch
ReDim MemScreenCharset(255,Colors,Colors,Colors) As integer
MemScreenInitialized=1
End Function
Function DeleteMemScreen(mem)
If mem Then
If MEMBlockSize(mem)=MemScreenMemblockSize Then
img=PeekInt(mem,MemScreenImage)
buffer=PeekInt(mem,MemScreenBuffer)
changes=PeekInt(mem,MemScreenChangelist)
If img Then DeleteImage img
If buffer Then DeleteMEMBlock buffer
If changes Then DeleteMEMBlock changes
DeleteMEMBlock mem
EndIf
EndIf
End Function
Function MakeMemScreen(w,h,layers)
mem = MakeMEMBlock(MemScreenMemblockSize)
w=Max(w,1)
h=Max(h,1)
PokeInt mem,MemScreenImageWidth,w*MemScreenCharW
PokeInt mem,MemScreenImageHeight,h*MemScreenCharH
PokeInt mem,MemScreenImage,MakeImage(w*MemScreenCharW,h*MemScreenCharH)
PokeInt mem,MemScreenWidth,w
PokeInt mem,MemScreenHeight,h
PokeInt mem,MemScreenLayers,layers
PokeInt mem,MemScreenBuffer,MakeMEMBlock(w*h*(Layers+1)*4)
PokeInt mem,MemScreenChanges,0
PokeInt mem,MemScreenChangelist,MakeMEMBlock(w*h*12)
Return mem
End Function
Function MemScreenFlush(mem,x,y,layer=1,all=0,alllayers=0)
If mem And layer Then
If MEMBlockSize(mem)=MemScreenMemblockSize Then
mswidth=PeekInt(mem,MemScreenWidth)
msheight=PeekInt(mem,MemScreenHeight)
msbuffer=PeekInt(mem,MemScreenBuffer)
mslayers=PeekInt(mem,MemScreenLayers)
mschangelist=PeekInt(mem,MemScreenChangelist)
mschanges=PeekInt(mem,MemScreenChanges)
mschangelistsize=MEMBlockSize(mschangelist)
If all=0 And alllayers=0 Then
If (x=>0)(x<mswidth)(y=>0)(y<msheight)(layer<=mslayers) Then
PokeInt msbuffer,(x+y*mswidth+layer*mswidth*msheight)*4,0
oldvalue=PeekInt (msbuffer,(x+y*mswidth)*4)
If oldvalue Then
For i=mslayers To 1 Step -1
value = PeekInt (msbuffer,(x+y*mswidth+i*mswidth*msheight)*4)
If value Then
If oldvalue<>value Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
PokeInt mem,MemScreenChanges,mschanges
EndIf
Exit
EndIf
Next i
If value=0 Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
PokeInt mem,MemScreenChanges,mschanges
EndIf
EndIf
EndIf
ElseIf all=0 And alllayers=1 Then
If (x=>0)(x<mswidth)(y=>0)(y<msheight) Then
For i=mslayers To 1 Step -1
PokeInt msbuffer,(x+y*mswidth+i*mswidth*msheight)*4,0
Next i
If PeekInt (msbuffer,(x+y*mswidth)*4)<>0 Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,0
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
PokeInt mem,MemScreenChanges,mschanges
EndIf
EndIf
ElseIf all=1 And alllayers=0 Then
If layer And (layer<=mslayers) Then
For x=0 To mswidth-1
For y=0 To msheight-1
oldvalue=PeekInt (msbuffer,(x+y*mswidth)*4)
PokeInt msbuffer,(x+y*mswidth+layer*mswidth*msheight)*4,0
If oldvalue Then
For i=mslayers To 1 Step -1
value = PeekInt (msbuffer,(x+y*mswidth+i*mswidth*msheight)*4)
If value Then
If oldvalue<>value Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
EndIf
Exit
EndIf
Next i
If value=0 Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
EndIf
EndIf
Next y
Next x
PokeInt mem,MemScreenChanges,mschanges
EndIf
ElseIf all=1 And alllayers=1 Then
msimage=PeekInt(mem,MemScreenImage)
If msimage Then DeleteImage msimage
PokeInt mem,MemScreenImage,MakeImage(PeekInt(mem,MemScreenImageWidth),PeekInt(mem,MemScreenImageWidth))
DeleteMEMBlock msbuffer
PokeInt mem,MemScreenBuffer,MakeMEMBlock(mswidth*msheight*(mslayers+1)*4)
PokeInt mem,MemScreenChanges,0
EndIf
EndIf
EndIf
End Function
Function MemScreenUpdate(mem,draw=1,drawx=0,drawy=0)
If mem Then
If MEMBlockSize(mem)=MemScreenMemblockSize Then
msimage=PeekInt(mem,MemScreenImage)
mswidth=PeekInt(mem,MemScreenWidth)
msbuffer=PeekInt(mem,MemScreenBuffer)
mschangelist=PeekInt(mem,MemScreenChangelist)
mschanges=PeekInt(mem,MemScreenChanges)
If mschanges Then
For i=0 To mschanges-1
value=PeekInt(mschangelist,i*12)
xx=PeekInt(mschangelist,i*12+4)
yy=PeekInt(mschangelist,i*12+8)
If value Then
PokeInt msbuffer,(xx+yy*mswidth)*4,value
CopyBox 0,0,MemScreenCharW,MemScreenCharH,xx*MemScreenCharW,yy*MemScreenCharH,Image(value),Image(msimage)
Else
PokeInt msbuffer,(xx+yy*mswidth)*4,0
CopyBox 0,0,MemScreenCharW,MemScreenCharH,xx*MemScreenCharW,yy*MemScreenCharH,Image(MemScreenEmptyimg),Image(msimage)
EndIf
Next i
PokeInt mem,MemScreenChanges,0
EndIf
If draw And msimage Then
DrawImage msimage,drawx,drawy
EndIf
EndIf
EndIf
End Function
Function MemScreenCopy(frommem,tomem,x,y,w,h,dx=0,dy=0,fromlayer=1,tolayer=1,all=0)
If frommem And tomem Then
If MEMBlockSize(frommem)=MemScreenMemblockSize And MEMBlockSize(tomem)=MemScreenMemblockSize Then
If fromlayer And tolayer Then
fmswidth=PeekInt(frommem,MemScreenWidth)
fmsheight=PeekInt(frommem,MemScreenHeight)
fmsbuffer=PeekInt(frommem,MemScreenBuffer)
fmslayers=PeekInt(frommem,MemScreenLayers)
tmswidth=PeekInt(tomem,MemScreenWidth)
tmsheight=PeekInt(tomem,MemScreenHeight)
tmsbuffer=PeekInt(tomem,MemScreenBuffer)
tmslayers=PeekInt(tomem,MemScreenLayers)
tmschangelist=PeekInt(tomem,MemScreenChangelist)
tmschanges=PeekInt(tomem,MemScreenChanges)
tmschangelistsize=MEMBlockSize(tomschangelist)
If all Then x=0 : y=0 : w=fmswidth : h=fmsheight
If (tolayer<=tmslayers)(fromlayer<=fmslayers) Then
xm=0
For xx=Max(x,0) To Min(x+w,fmswidth)
ym=0
For yy=Max(y,0) To Min(y+h,fmsheight)
tx=dx+xm
ty=dy+ym
If (tx=>0)(tx<tmswidth)(ty=>0)(ty<tmsheight) Then
oldvalue=PeekInt (tmsbuffer,(tx+ty*tmswidth)*4)
img=PeekInt (fmsbuffer,(xx+yy*fmswidth+fromlayer*fmswidth*fmsheight)*4)
PokeInt tmsbuffer,(tx+ty*tmswidth+tolayer*tmswidth*tmsheight)*4,img
If img<>oldvalue Then
For i=tmslayers To 1 Step -1
value = PeekInt (tmsbuffer,(tx+ty*tmswidth+i*tmswidth*tmsheight)*4)
If value Then
If oldvalue<>value Then
If tmschangelistsize<(tmschanges+1)*12 Then
ResizeMEMBlock tmschangelist,(tmschanges+20)*12
PokeInt tomem,MemScreenChangeList,tmschangelist
tmschangelistsize=(tmschanges+20)*12
EndIf
PokeInt tmschangelist,tmschanges*12,value
PokeInt tmschangelist,tmschanges*12+4,tx
PokeInt tmschangelist,tmschanges*12+8,ty
tmschanges=tmschanges+1
EndIf
Exit
EndIf
Next i
If value=0 Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
EndIf
EndIf
EndIf
ym=ym+1
Next yy
xm=xm+1
Next xx
PokeInt tomem,MemScreenChanges,tmschanges
EndIf
EndIf
EndIf
EndIf
End Function
Function MemScreenPut(mem,img,x,y,layer=1)
If mem Then
If MEMBlockSize(mem)=MemScreenMemblockSize Then
If img And layer Then
mswidth=PeekInt(mem,MemScreenWidth)
msheight=PeekInt(mem,MemScreenHeight)
msbuffer=PeekInt(mem,MemScreenBuffer)
mslayers=PeekInt(mem,MemScreenLayers)
mschangelist=PeekInt(mem,MemScreenChangelist)
mschanges=PeekInt(mem,MemScreenChanges)
mschangelistsize=MEMBlockSize(mschangelist)
If (x=>0)(x<mswidth)(y=>0)(y<msheight)(layer<=mslayers) Then
PokeInt msbuffer,(x+y*mswidth+layer*mswidth*msheight)*4,img
oldvalue=PeekInt (msbuffer,(x+y*mswidth)*4)
If img<>oldvalue Then
For i=mslayers To 1 Step -1
value = PeekInt (msbuffer,(x+y*mswidth+i*mswidth*msheight)*4)
If value Then
If oldvalue<>value Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
PokeInt mem,MemScreenChanges,mschanges
EndIf
Return 1
EndIf
Next i
If value=0 Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
PokeInt mem,MemScreenChanges,mschanges
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
End Function
Function MemScreenPrint(mem,txt$,x=0,y=0,layer=1,r=255,g=255,b=255)
If mem Then
If MEMBlockSize(mem)=MemScreenMemblockSize Then
If layer Then
mswidth=PeekInt(mem,MemScreenWidth)
msheight=PeekInt(mem,MemScreenHeight)
msbuffer=PeekInt(mem,MemScreenBuffer)
mslayers=PeekInt(mem,MemScreenLayers)
mschangelist=PeekInt(mem,MemScreenChangelist)
mschanges=PeekInt(mem,MemScreenChanges)
mschangelistsize=MEMBlockSize(mschangelist)
l=Len(txt$)
For o=1 To l
xx=x+o-1
img = MemScreenMakeChar(Mid(txt$,o,1),r,g,b)
If (xx=>0)(xx<mswidth)(y=>0)(y<msheight)(layer<=mslayers) Then
PokeInt msbuffer,(xx+y*mswidth+layer*mswidth*msheight)*4,img
oldvalue=PeekInt (msbuffer,(xx+y*mswidth)*4)
If img<>oldvalue Then
For i=mslayers To 1 Step -1
value = PeekInt (msbuffer,(xx+y*mswidth+i*mswidth*msheight)*4)
If value Then
If oldvalue<>value Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,xx
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
EndIf
Exit
EndIf
Next i
If value=0 Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
EndIf
EndIf
Else
PokeInt mem,MemScreenChanges,mschanges
Return -1
EndIf
Next o
PokeInt mem,MemScreenChanges,mschanges
EndIf
EndIf
EndIf
End Function
Function MemScreenBox(mem,cimg,wimg,himg,fimg,x=0,y=0,w=1,h=1,layer=1)
MemScreenPut(mem,cimg,x,y,layer)
MemScreenLine(mem,wimg,x+1,y,layer,0,w-2)
MemScreenPut(mem,cimg,x+w-1,y,layer)
MemScreenPut(mem,cimg,x,y+h-1,layer)
MemScreenLine(mem,wimg,x+1,y+h-1,layer,0,w-2)
MemScreenPut(mem,cimg,x+w-1,y+h-1,layer)
MemScreenLine(mem,himg,x,y+1,layer,1,h-2)
MemScreenLine(mem,himg,x+w-1,y+1,layer,1,h-2)
If fimg And h>2 Then
For i=1 To h-2
MemScreenLine(mem,fimg,x+1,y+i,layer,0,w-2)
Next i
EndIf
End Function
Function MemScreenLine(mem,img,x,y,layer,linetype,lenght)
If mem Then
If MEMBlockSize(mem)=MemScreenMemblockSize Then
If layer And img Then
mswidth=PeekInt(mem,MemScreenWidth)
msheight=PeekInt(mem,MemScreenHeight)
msbuffer=PeekInt(mem,MemScreenBuffer)
mslayers=PeekInt(mem,MemScreenLayers)
mschangelist=PeekInt(mem,MemScreenChangelist)
mschanges=PeekInt(mem,MemScreenChanges)
mschangelistsize=MEMBlockSize(mschangelist)
For o=0 To lenght-1
If linetype=1 Then
yy=y+o
xx=x
Else
yy=y
xx=x+o
EndIf
If (xx=>0)(xx<mswidth)(yy=>0)(yy<msheight)(layer<=mslayers) Then
PokeInt msbuffer,(xx+yy*mswidth+layer*mswidth*msheight)*4,img
oldvalue=PeekInt (msbuffer,(xx+yy*mswidth)*4)
If img<>oldvalue Then
For i=mslayers To 1 Step -1
value = PeekInt (msbuffer,(xx+yy*mswidth+i*mswidth*msheight)*4)
If value Then
If oldvalue<>value Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,xx
PokeInt mschangelist,mschanges*12+8,yy
mschanges=mschanges+1
EndIf
Exit
EndIf
Next i
If value=0 Then
If mschangelistsize<(mschanges+1)*12 Then
ResizeMEMBlock mschangelist,(mschanges+20)*12
PokeInt mem,MemScreenChangeList,mschangelist
mschangelistsize=(mschanges+20)*12
EndIf
PokeInt mschangelist,mschanges*12,value
PokeInt mschangelist,mschanges*12+4,x
PokeInt mschangelist,mschanges*12+8,y
mschanges=mschanges+1
PokeInt mem,MemScreenChanges,mschanges
EndIf
EndIf
Else
PokeInt mem,MemScreenChanges,mschanges
Return -1
EndIf
Next o
PokeInt mem,MemScreenChanges,mschanges
EndIf
EndIf
EndIf
End Function
Function DeleteMemScreenChars()
If MemScreenInitialized=0 Then MakeError "You must call MemScreenInitialize() before calling other MemScreen functions!"
d=255/MemScreenColors
For c=32 To 255
For r=0 To MemScreenColors
For g=0 To MemScreenColors
For b=0 To MemScreenColors
If MemScreenCharset(c,r,g,b) Then DeleteImage MemScreenCharset(c,r,g,b)
Next b
Next g
Next r
Next c
End Function
Function MemScreenLoadChars()
If MemScreenInitialized=0 Then MakeError "You must call MemScreenInitialize() before calling other MemScreen functions!"
d=255/MemScreenColors
For c=32 To 255
For r=0 To MemScreenColors
For g=0 To MemScreenColors
For b=0 To MemScreenColors
If Not MemScreenCharset(c,r,g,b) Then
img=MakeImage(MemScreenCharW,MemScreenCharH)
DrawToImage img
Color r*d,g*d,b*d
Text 0,0,Chr(c)
DrawToScreen
MemScreenCharset(c,r,g,b) = img
EndIf
Next b
Next g
Next r
Next c
End Function
Function MemScreenMakeChar(txt$,r=255,g=255,b=255)
c=255/MemScreenColors
r=RoundDown(r / c)
g=RoundDown(g / c)
b=RoundDown(b / c)
value=Asc(Left(txt$,1))
If MemScreenCharset(value,r,g,b)=0 Then
img=MakeImage(MemScreenCharW,MemScreenCharH)
DrawToImage img
Color c*r,g*c,b*c
Text 0,0,Left(txt$,1)
DrawToScreen
MemScreenCharset(value,r,g,b) = img
EndIf
Return MemScreenCharset(value,r,g,b)
End Function
//---------------------------
SAFEEXIT OFF
SCREEN 800,600
//luodaan hahmoille tyyppikokoelma
Type npc
Field x
Field y
Field char
Field playable
End Type
//määritetään merkin leveys ja korkeus, sekä värien määrä
MemScreenInitialize(TextWidth("="),TextHeight("|"),5)
//luodaan 100x45 kokoinen ruutu neljällä kerroksella
//moottori varaa automaattisesti "nollannen kerroksen" puskuriksi
PlayScreen=makememscreen(100,46,4)
//tallennetaan ruudun mitat muuttujiin
sw=PeekInt(PlayScreen,MemScreenwidth)
sh=PeekInt(PlayScreen,MemScreenHeight)
//luodaan kaksi merkkiä
wall=MemScreenMakeChar("#",64,64,64)
floor=MemScreenMakeChar(".",196,196,196)
//piirretään ruudulle laatikko jossa kulmissa ja kyljissä käytetään wall merkkiä ja täytetään floor merkillä
//laatikko alkaa kohdasta 0,0 ja on koko ruudun kokoinen ja piirretään ensimmäiseen kerrokseen
MemScreenBox(PlayScreen,wall,wall,wall,floor,0,0,sw,sh,1)
//luodaan pelaaja
n.npc=New(npc)
n\x=1
n\y=1
n\char=MemScreenMakeChar("@",255,0,0)
n\playable=1
//piirretään pelaaja kolmanteen kerrokseen
MemScreenPut(PlayScreen,n\char,n\x,n\y,3)
//luodaan tuhat ja yksi muuta hahmoa ja piirretään ne toiseen kerrokseen
For i=0 To 1000
n.npc=New(npc)
n\x=Rand(1,sw-2)
n\y=Rand(1,sh-2)
n\char=MemScreenMakeChar(Chr(Rand(97,122)),Rand(64,255),Rand(64,255),Rand(64,255))
MemScreenPut(PlayScreen,n\char,n\x,n\y,2)
Next i
info=-1
Repeat
//välilyönti piilottaa/näyttää infotekstin
If KeyHit(cbkeyspace) Or info=-1 Then
If info=1 Then
info=0
MemScreenFlush(PlayScreen,0,0,4,1)
Else
status$=status$+"info"
MemScreenPrint(PlayScreen,"Tervetuloa testaamaan grafiikkamoottoria, jonka pyrkimyksenä on tuottaa nopeaa merkkigrafiikkaa.",1,1,4)
MemScreenPrint(PlayScreen,"Kaikki merkit ON tallennettu ennalta kuviin joita piirretään tarvittaessa CopyBoxilla pääkuvaan",1,2,4)
MemScreenPrint(PlayScreen,"Tämä on huomattavasti nopeampaa kuin Text, Print tai mikään muukaan keino.",1,3,4)
MemScreenPrint(PlayScreen,"Koska kyse ON vain kuvista voi myös ladattavia kuvia piirtää merkkigrafiikan sekaan.",1,4,4)
MemScreenPrint(PlayScreen,"Ruutuja ON myös luoda useita, näin vältytään muuttamasta samaa ruutua liian usein",1,5,4)
MemScreenPrint(PlayScreen,"Ruudussa voi myös olla useita kerroksia, joiden mukaan piirtojärjestys määräytyy.",1,6,4)
MemScreenPrint(PlayScreen,"Ruudusta voi poistaa merkkejä sijainnin ja kerroksen mukaan.",1,7,4)
MemScreenPrint(PlayScreen,"Koska ruutu ON tallennettu kuvaan voi sen sijaintia, kokoa tai väritystä muuttaa helposti.",1,8,4)
MemScreenPrint(PlayScreen,"Ruudulla vipeltää tällä hetkellä tuhat ja yksi hahmoa sekä pelaaja.",1,9,4)
MemScreenPrint(PlayScreen,"Paina välilyöntiä piilottaaksesi tämän tekstin.",1,12,4)
MemScreenPrint(PlayScreen,"Paina enteriä heiluttaaksesi ruutua.",1,13,4)
info=1
EndIf
EndIf
If KeyDown(cbkeyreturn) Then
bx=Rand(-10,10)
by=Rand(-10,10)
Else
bx=0
by=0
EndIf
If KeyHit(cbkeybackspace) Then small=Not small
For n.npc=Each npc
//pelaajan ohjastus
mx=0
my=0
If n\playable Then
mx=KeyDown(cbkeyright)*(n\x<sw-2)-KeyDown(cbkeyleft)*(n\x>1)
my=KeyDown(cbkeydown)*(n\y<sh-2)-KeyDown(cbkeyup)*(n\y>1)
Else
If Rand(50)=1 Then
mx=Rand(-1*(n\x>1),1*(n\x<sw-2))
my=Rand(-1*(n\y>1),1*(n\y<sh-2))
EndIf
EndIf
If mx Or my Then
MemScreenFlush(PlayScreen,n\x,n\y,2+n\playable)
n\x=n\x+mx
n\y=n\y+my
MemScreenPut(PlayScreen,n\char,n\x,n\y,2+n\playable)
EndIf
Next n
//päivitetään ruutu
MemScreenUpdate(PlayScreen,1,bx,by)
//tämä on hyvä laittaa esille
SetWindow "FPS: "+Str(FPS())
DrawScreen
' Wait 5
Until EscapeKey()
//tyhjennetään muisti turhasta tauhkasta
DeleteMemScreen(PlayScreen)
DeleteMemScreenChars()
End