Tyhmät kysymykset (I/2010)

Voit pyytää apua ohjelmointiongelmiin täältä.
645363

Re: Tyhmät kysymykset (I/2010)

Post by 645363 » Thu Jan 06, 2011 11:47 pm

siinä koodisi korjattuna ja objektilla tehty

Code: Select all

FrameLimit 40 'rajoita nopeutta
SCREEN 800,600

Include "sdk/include/cbMap.cb"

MapLoad("Media\cdm2.til","Media\tileset.bmp")
PlayObject gCurrentMap,0,0,1

ukko = LoadObject ("Media\guy.bmp",72)
ukko2=CloneObject(ukko)
haamu=MakeObject()
SetupCollision ukko,gCurrentMap,2,4,2
SetupCollision ukko2,gCurrentMap,2,4,2
PositionObject ukko2,0,200
done=1
Repeat
   
    'Ukon ohjaus
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,3
    If DownKey() Then MoveObject ukko,-3
    
        If ObjectSight (ukko,ukko2) And done=1 Then

                lastseenx=(ObjectX(ukko))
                lastseeny=(ObjectY(ukko))
            
            PointObject ukko2,ukko
        Else
        PositionObject haamu,lastseenx,lastseeny
            PointObject ukko2,haamu
        
            If ObjectsOverlap(ukko2,haamu) Then
            done=1
            Else
            done=0
            EndIf 
        EndIf
    

MoveObject ukko2,2    
    
    DrawGame
    Text 0,0, Int(GetAngle2(ukko,ukko2))
    Text 0,20, Int(ObjectAngle(ukko2))
    CloneCameraPosition ukko

    DrawScreen

Forever 

pietari-poika
Newcomer
Posts: 16
Joined: Wed Oct 10, 2007 9:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by pietari-poika » Fri Jan 07, 2011 12:46 am

Nyt sain fiksattua tosta "taskulamppuefektistä" sen bugin, että efekti muuttuu pelaajan kääntyessä paikallaan vaikka fov on 360 astetta. Nyt kuitenkin on vieläkin toi sama ongelma, eli fps, joka on auttamattomasti liian alhaalla. Laatuasetuksella 80 peli toimii noin 38fps (framelimitti 60), mutta se on ihan liian vähän kun ajatellaan että nyt toi pyörii E8400@3GHz - 4GB - HD3850 -kokoonpanolla. Tolla laatuasetuksella 80 myös varjoissa on paljon "virheitä" ja tarkkuus tosi huono.

Jospa sitä yrittäisi tehdä omaa systeemiä jossa tilekartan tilejä joita pelaaja ei näe varjostettaisiin. Jälki olisi hieman karumpaa, mutta voisi toimia varsin hyvin ja ilman "virheitä". Virheillä tarkoitan siis sitä, että kohta jonka pelaaja näkee, varjostuu menetelmän epätarkkuudesta johtuen.

EDIT:
Nyt sain tehtyä oman viritelmäni. Eli idea mulla on se, että piilotettu objekti käy läpi kaikkien tilekartan tilejen keskustat, ja jokaisessa niistä testataan objectsightilla näkyvyys pelaajaan. Jos pelaaja ei näe objektia, tilen kohdalle piirretään jokin varjostuselementti (esimerkkikuvassa siis neliö jota ei ole täytetty). Tweakkasin tota hiukan siten, että "varjostusta" ei piirretä over-kerroksen päälle eikä alueille, joita ei ruudulla näy. Tässäkin tosin on hieman suorituskykyongelmia, fps on koneellani noin 37 tällä systeemillä. Havaitsin, että coolbasicin piirtokomennot lienevät hidastava tekijä, sillä jos menen kohtaan, jossa mahdollisimman monta tileä "varjostetaan" (eli piirretään box), niin peli hidastuu noin 25 fps:ään.

Tässä vielä kuva tosta "hienosta" systeemistäni, laitoin tähän esimerkkiä varten tyhjät neliöt varjostettuihin kohtiin.
Image

User avatar
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by tuhoojabotti » Fri Jan 07, 2011 2:42 am

pietari-poika wrote:...Eli idea mulla on se, että piilotettu objekti käy läpi kaikkien tilekartan tilejen keskustat...
Nopeutta saisi varmaan lisää käymällä läpi vain ruudulla olevat tilet. ;-)
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”

pietari-poika
Newcomer
Posts: 16
Joined: Wed Oct 10, 2007 9:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by pietari-poika » Fri Jan 07, 2011 3:08 pm

tuhoojabotti wrote:
pietari-poika wrote:...Eli idea mulla on se, että piilotettu objekti käy läpi kaikkien tilekartan tilejen keskustat...
Nopeutta saisi varmaan lisää käymällä läpi vain ruudulla olevat tilet. ;-)
Niin. Tossa edellisessä postissani selitinkin, että nopeus parani kun pistin piirrettäviksi varjot, jotka ovat ScreenWidth()*0.8 matkan päässä enintään pelaajasta. (Koska mulla on tossa sellanen hieno zoom-toiminto :D) Nykyisellään toki kaikki kartan tilet käydään vielä läpi, mutta toi boxin piirto näyttäis olevan juurikin se asia joka jarruttaa... sikäli, että fps tippuu mitä enemmän neliöitä on piirrettävänä. Kun on suurella aukealla paikalla tossa kartassa niin fps on silloin hyvä, mutta ahtaassa paikassa se tippuu aikalailla. Pitänee vähän optimoida tota tosiaan.

Eikös yksittäisiä tilejä voi jotenkin tummentaa muullakin tavalla? Voisko kuvan piirtäminen piirtokomennoilla Lock():in ja Unlock():in välissä ja sitten sen näytölle piirtäminen olla nopeampaa kuin suoraan piirtää piirtokomennot näytölle?

User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 12:17 pm
Location: Espoo

Line Of Sight tilekartaan Bresenhamin algoritmilla

Post by MetalRain » Fri Jan 07, 2011 5:10 pm

pietari-poika wrote:Eli idea mulla on se, että piilotettu objekti käy läpi kaikkien tilekartan tilejen keskustat, ja jokaisessa niistä testataan objectsightilla näkyvyys pelaajaan. Jos pelaaja ei näe objektia, tilen kohdalle piirretään jokin varjostuselementti (esimerkkikuvassa siis neliö jota ei ole täytetty).
Kokeilinpa nopeuttaa tuota ja korvasin objectsightin käytön esilaskemalla taulukkoon kartan törmäysalueet. Kävin sitten läpi tilet tarkkailupisteestä tarkkailupisteen ympärille piiretyn suorakulmion (esimerkissä ruudun reunat) alla oleviin tileihin Bresenhamin algoritmillä ja merkkasin taulukkoon ylös mitkä tilet ovat näkyvissä.

Varjostuksen piirtoon otin kartan kokoisen kuvan johon piirsin varjostetut alueet ja piirrän sen kartan päälle. Tällöin tarvitsee päivittää vain alueita joiden varjostus muuttuu. Tuohon varjotuskuvaan voi sitten piirrellä ihan millaisia vaan kivoja varjostuksia, vaikka esimerkissä tyydyin täytettyyn mustaan laatikkoon.

Koodissa wasd liikuttaa kameraa.

Code: Select all

SCREEN 1024,768

DrawToWorld ON,ON 

Global LOSImage, LOSMapWidth, LOSMapHeight, LOSMapTileWidth, LOSMapTileHeight , LOSMapQuality

Dim LOSMap(1,1,1) As Byte

map = LoadMap("Media\cdm2.til","Media\tileset.bmp")


//tästä säädetään resoluutiota. Kokeile vaikka 0-2
InitLOS(map,1) 

Repeat

    TranslateCamera (KeyDown(cbkeyd)-KeyDown(cbkeya))*5,(KeyDown(cbkeyw)-KeyDown(cbkeys))*5

    CalculateLOS(CameraX(),CameraY())

    Color cbred
    
    Circle CameraX()-3,CameraY()+3,7,1

    DrawScreen 
    
    SetWindow "FPS: "+FPS()

Forever

// Alustaa taulukot ja kuvat LOSia varten
// ottaa parametriksi kartan ja varjostuksen suhteellisenresoluution 0-4
Function InitLOS(map,q=0)

    LOSMapQuality=Min(Max(2^q,1),16)

    w=MapWidth()*LOSMapQuality
    h=MapHeight()*LOSMapQuality
    
    LOSMapTileWidth=(ObjectSizeX(map)/w)
    LOSMapTileHeight=(ObjectSizeY(map)/h)
    

    ReDim LOSMap(w,h,2) As Byte
    
    //0-kerros kartan törmäysdata (0=ei törmää 1=törmää)
    //1-kerros kartan varjostus (0=varjostettu 1=varjostamaton)
    //2-kerros varjotus kuvan edellinen tila (0=varjostettu 1=varjostamaton)
    
    LOSImage = MakeImage(w*LOSMapTileWidth,h*LOSMapTileHeight) //varjostuskuva
    
    DrawToImage LOSImage
        Color 1,1,1
        Box 0,0,w*LOSMapTileWidth,h*LOSMapTileHeight,1
    DrawToScreen

    LOSMapWidth = w
    LOSMapHeight = h
    
    For x=1 To w
        For y=1 To h
        
            LOSMap(x,y,0)=GetMap2 (2,RoundUp(x/LOSMapQuality),RoundUp(y/LOSMapQuality))
            LOSMap(x,y,1)=0
            LOSMap(x,y,2)=GetMap2 (0,RoundUp(x/LOSMapQuality),RoundUp(y/LOSMapQuality))
            
        Next y
    Next x
End Function 


//maailmakoordinaatti jolle varjostus lasketaan
//ja alueen leveys tileinä
//oletuksena alue ruudun koko
Function CalculateLOS(x,y,w=0,h=0)

    If w=0 And h=0 Then     
        w=(ScreenWidth()/LOSMapTileWidth)
        h=(ScreenHeight()/LOSMapTileHeight)
    EndIf 
    
    
    x = (LOSMapWidth*LOSMapTileWidth*0.5 +x + LOSMapTileWidth*LOSMapQuality - LOSMapTileWidth*0.5  )/LOSMapTileWidth
    y = (LOSMapHeight*LOSMapTileHeight*0.5 -y + LOSMapTileHeight*LOSMapQuality - LOSMapTileHeight*0.5  )/LOSMapTileHeight 
    
    //säilytetään vanhat koordinaatit ja ei päivitetä jos koordinaatit pysyy samana
    
    If LOSMap(1,0,0) <> x Or LOSMap(0,1,0) <> y Then 
    
        LOSMap(1,0,0) = x
        LOSMap(0,1,0) = y
        
    
        If x>0 And x<= LOSMapWidth And y>0 And y<= LOSMapHeight
        
    
            For xx=1 To LOSMapWidth
                For yy=1 To LOSMapHeight
                
                    LOSMap(xx,yy,1)=0 
                    
               Next yy
            Next xx
            
            LowX = Max(x-w/2,1)
            HighX = Min(x+w/2,LOSMapWidth)
            
            LowY = Max(y-h/2,1)
            HighY = Min(y+h/2,LOSMapHeight)
            
    
            For dx = LowX To HighX
            
               //yläreuna
               LOSBresenham(x,y,dx,LowY)
               
               //alareuna
               LOSBresenham(x,y,dx,HighY)
            
            Next dx
    
            
            For dy = LowY To HighY
            
                 //vasen reuna
                LOSBresenham(x,y,LowX,dy)
                
                //oikea reuna
                LOSBresenham(x,y,HighX,dy)
            
            Next dy
    
            DrawToImage LOSImage
        
                For dx = LowX To HighX
                    For dy = LowY To HighY
                    
                        If LOSMap(dx,dy,1)<> LOSMap(dx,dy,2) Then 
        
                            If LOSMap(dx,dy,1) = 1 Then //poista varjostus
                                Color cbblack
                            ElseIf LOSMap(dx,dy,1) = 0 Then //lisää varjostus
                                Color 1,1,1
                            EndIf 
                            
                            Box (dx-1)*(LOSMapTileWidth),(dy-1)*(LOSMapTileHeight),(LOSMapTileWidth),(LOSMapTileHeight),1
                            
                            LOSMap(dx,dy,2) = LOSMap(dx,dy,1)
                        
                        EndIf 
            
                    Next dy
                Next dx
            
            DrawToScreen
    
        EndIf 
        
    EndIf 
    
    DrawGame 
    
    DrawImage LOSImage,-LOSMapWidth*LOSMapTileWidth*0.5-LOSMapTileWidth*(LOSMapQuality-1),-LOSMapHeight*LOSMapTileHeight*0.5-LOSMapTileHeight*(LOSMapQuality-1)
    
End Function 

//http://en.wikipedia.org/wiki/Bresenham's_line_algorithm#Simplification
Function LOSBresenham(x0, y0, x1, y1)
    
    dx = Abs(x1-x0)
    dy = Abs(y1-y0)

    If x0 < x1 Then sx = 1 else sx = -1
    If y0 < y1 Then sy = 1 Else sy = -1
    err = dx-dy
    
    Repeat 
    
        If LOSMap(x0,y0,0)=0 Then 
            LOSMap(x0,y0,1)=1
        Else 
            LOSMap(x0,y0,1)=1
            Return 0
        EndIf 
    
        If x0 = x1 And y0 = y1 Then Return 0
        e2 = 2*err
        
        If e2 > -dy Then 
            err = err - dy
            x0 = x0 + sx 
        EndIf 
        
        If e2 <  dx Then 
            err = err + dx
            y0 = y0 + sy 
        EndIf 

    Forever

End Function 
Edit: Pistin vielä lisäherkkuna resoluution säädön, koska 32x32 palikat ei oikeen nappaa. Vaikka saman vaikutuksen saisi tekemällä pienempiä tilejä.
Image
Last edited by MetalRain on Fri Jan 07, 2011 11:03 pm, edited 8 times in total.

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Line Of Sight tilekartaan Bresenhamin algoritmilla

Post by JATothrim » Fri Jan 07, 2011 7:48 pm

MetalRain wrote:
pietari-poika wrote:Eli idea mulla on se, että piilotettu objekti käy läpi kaikkien tilekartan tilejen keskustat, ja jokaisessa niistä testataan objectsightilla näkyvyys pelaajaan. Jos pelaaja ei näe objektia, tilen kohdalle piirretään jokin varjostuselementti (esimerkkikuvassa siis neliö jota ei ole täytetty).
Kokeilinpa nopeuttaa tuota ja korvasin objectsightin käytön esilaskemalla taulukkoon kartan törmäysalueet. Kävin sitten läpi tilet tarkkailupisteestä tarkkailupisteen ympärille piiretyn suorakulmion (esimerkissä ruudun reunat) alla oleviin tileihin Bresenhamin algoritmillä ja merkkasin taulukkoon ylös mitkä tilet ovat näkyvissä.

Varjostuksen piirtoon otin kartan kokoisen kuvan johon piirsin varjostetut alueet ja piirrän sen kartan päälle. Tällöin tarvitsee päivittää vain alueita joiden varjostus muuttuu. Tuohon varjotuskuvaan voi sitten piirrellä ihan millaisia vaan kivoja varjostuksia, vaikka esimerkissä tyydyin harmaaseen laatikkoon.

Koodissa wasd liikuttaa kameraa.
En tiedä eroaako tämä versio koodistasi juurikaan, mutta arvelisin sen olevan nopeampi. Ohjelma käyttää 'yhteensuuntaan' rasteroivaa Bresenhamin algoritmiä, jolloin taulukon muokkaus lopetetaan heti kun osutaan törmäyskerrokseen. Lisäksi kartasta muokataan vain näkyvää osaa.

Code: Select all

SCREEN 800,600

Dim LOSMap(0,0,0)
Global LOSMap_w As integer
Global LOSMap_h As integer
Global LOSMap_obj As integer
Const LOSMAP_TW = 32.0
Const LOSMAP_TH = 32.0

map = LoadMap("Media\cdm2.til","Media\tileset.bmp")

InitLOS(map) 

PositionCamera -10,-50
Repeat

	TranslateCamera (KeyDown(cbkeyd)-KeyDown(cbkeya))*5,(KeyDown(cbkeyw)-KeyDown(cbkeys))*5
	
	CalculateLOS(MouseWX(), MouseWY())
	
	SetWindow "FPS: "+FPS()

	DrawScreen 

Forever


Function InitLOS(map)
	
	//pistetään talteen ettei tartte kokoajan kysellä
	LOSMap_obj = map
	LOSMap_w = MapWidth()-1
	LOSMap_h = MapHeight()-1
	ReDim LOSMap(LOSMap_w, LOSMap_h,2)
	
	For y=0 To LOSMap_h
		For x=0 To LOSMap_w
			LOSMap(x,y,0)=GetMap2 (0,x+1,y+1)	// pohja kerros
			LOSMap(x,y,1)=GetMap2 (2,x+1,y+1)	// törmäys kerros
		Next x
	Next y
End Function 

Function CalculateLOS(x, y)
	
	// kameran näkymä tile koordinaateissa
	begin_x% = RoundDown(ObjectSizeX(LOSMap_obj)/2.0 + (CameraX() - ScreenWidth() / 2.0 - LOSMAP_TW)) / LOSMAP_TW
	begin_y% = RoundDown(ObjectSizeY(LOSMap_obj)/2.0 - (CameraY() + ScreenHeight() / 2.0 + LOSMAP_TH)) / LOSMAP_TH
	end_x% = begin_x + RoundUp((ScreenWidth() + LOSMAP_TW) / LOSMAP_TW)
	end_y% = begin_y + RoundUp((ScreenHeight() + LOSMAP_TH) / LOSMAP_TH)
	// rajataan näkymä kartan alueelle.
	begin_x = Min(Max(begin_x, 0), LOSMap_w)
	begin_y = Min(Max(begin_y, 0), LOSMap_h)
	end_x = Min(Max(end_x, 0), LOSMap_w)
	end_y = Min(Max(end_y, 0), LOSMap_h)
	If Abs(begin_x-end_x) < 2 Or Abs(begin_y-end_y) < 2 Then Return 0
	x = Min(Max((ObjectSizeX(LOSMap_obj)/2.0+(x-LOSMAP_TW/2.0))/LOSMAP_TW, begin_x+1), end_x-1)
	y = Min(Max((ObjectSizeY(LOSMap_obj)/2.0-(y+LOSMAP_TH/2.0))/LOSMAP_TH, begin_y+1), end_y-1)
	
	DrawGame
	Text 0,0,Str(begin_x)+","+Str(begin_y)
	Text 0,12,Str(end_x)+","+Str(end_y)
	Text 0,24,Str(LOSMap_w)+"x"+Str(LOSMap_h)
	Text 0,36,Str(x)+","+Str(y)
	'DrawScreen
	'WaitKey
	// Nollataan näkyvä alue
	For i = begin_y To end_y
		For j = begin_x To end_x
			LOSMap(j,i,2)=0 
	   Next j
	Next i
	// Lasketaan LOS näkymälle, skannataan kameran reunoihin asti.
	For dx=begin_x To end_x
	   LOSBresenham(x,y,dx, begin_y)
	   
	   LOSBresenham(x,y,dx, end_y)
	Next dx
	
	For dy=begin_y To end_y
		LOSBresenham(x,y, begin_x,dy)
		
		LOSBresenham(x,y, end_x,dy)
	Next dy
	// Editoidaan karttaan (joka ON nyt vain näytön kokoinen alue)
	ClearText
	For i = begin_y To end_y
		For j = begin_x To end_x
			'DrawGame
			'Text 0,0,"EditMap "+Str(LOSMap_obj)+", 0, "+Str(j+1)+", "+Str(i+1)+", "+Str(LOSMap(j,i,2))
			'DrawScreen
			EditMap LOSMap_obj, 0, j+1, i+1, LOSMap(j,i,2)
	   Next j
	Next i
 
EndFunction 


Function LOSBresenham(x1%, y1%, x2%, y2%)
	dx% = Abs(x2 - x1)
	dy% = Abs(y2 - y1)
	y% = y1
	x% = x1
	error% = 0
	If dx > dy
		add% = 1 - (y2 < y1) Shl 1
		If x1 < x2
			While x <= x2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0
				error = error + dy
				If error Shl 1 >= dx
					y = y + add
					error = error - dx
				EndIf
				x = x + 1
			Wend
		Else
			While x >= x2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0 
				error = error + dy
				If error Shl 1 >= dx
					y = y + add
					error = error - dx
				EndIf
				x = x - 1
			Wend
		EndIf
	Else
		add% = 1 - (x2 < x1) Shl 1
		If y1 < y2
			While y <= y2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0
				error = error + dx
				If error Shl 1 >= dy
					x = x + add
					error = error - dy
				EndIf
				y = y + 1
			Wend
		Else
			While y >= y2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0
				error = error + dx
				If error Shl 1 >= dy
					x = x + add
					error = error - dy
				EndIf
				y = y - 1
			Wend
		EndIf
	EndIf
EndFunction
EDIT:

MetalRain näkyi muokanneen koodinsa paremmaksi, joten sen rinnalla koodini näyttää nyt ikävältä. höh. :?
MaGetzSup: koodini ei kuse. ;)

Last edited by JATothrim on Fri Jan 07, 2011 10:55 pm, edited 1 time in total.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Line Of Sight tilekartaan Bresenhamin algoritmilla

Post by MaGetzUb » Fri Jan 07, 2011 9:05 pm

JATothrim wrote: En tiedä eroaako tämä versio koodistasi juurikaan, mutta arvelisin sen olevan nopeampi. Ohjelma käyttää 'yhteensuuntaan' rasteroivaa Bresenhamin algoritmiä, jolloin taulukon muokkaus lopetetaan heti kun osutaan törmäyskerrokseen. Lisäksi kartasta muokataan vain näkyvää osaa.

Code: Select all

SCREEN 800,600

Dim LOSMap(0,0,0)
Global LOSMap_w As integer
Global LOSMap_h As integer
Global LOSMap_obj As integer
Const LOSMAP_TW = 32.0
Const LOSMAP_TH = 32.0

map = LoadMap("Media\cdm2.til","Media\tileset.bmp")

InitLOS(map) 

PositionCamera -10,-50
Repeat

	TranslateCamera (KeyDown(cbkeyd)-KeyDown(cbkeya))*5,(KeyDown(cbkeyw)-KeyDown(cbkeys))*5
	
	CalculateLOS(MouseWX(), MouseWY())
	
	SetWindow "FPS: "+FPS()

	DrawScreen 

Forever


Function InitLOS(map)
	
	//pistetään talteen ettei tartte kokoajan kysellä
	LOSMap_obj = map
	LOSMap_w = MapWidth()-1
	LOSMap_h = MapHeight()-1
	ReDim LOSMap(LOSMap_w, LOSMap_h,2)
	
	For y=0 To LOSMap_h
		For x=0 To LOSMap_w
			LOSMap(x,y,0)=GetMap2 (0,x+1,y+1)	// pohja kerros
			LOSMap(x,y,1)=GetMap2 (2,x+1,y+1)	// törmäys kerros
		Next x
	Next y
End Function 

Function CalculateLOS(x, y)
	
	// kameran näkymä tile koordinaateissa
	begin_x% = RoundDown(ObjectSizeX(LOSMap_obj)/2.0 + (CameraX() - ScreenWidth() / 2.0 - LOSMAP_TW)) / LOSMAP_TW
	begin_y% = RoundDown(ObjectSizeY(LOSMap_obj)/2.0 - (CameraY() + ScreenHeight() / 2.0 + LOSMAP_TH)) / LOSMAP_TH
	end_x% = begin_x + RoundUp((ScreenWidth() + LOSMAP_TW) / LOSMAP_TW)
	end_y% = begin_y + RoundUp((ScreenHeight() + LOSMAP_TH) / LOSMAP_TH)
	// rajataan näkymä kartan alueelle.
	begin_x = Min(Max(begin_x, 0), LOSMap_w)
	begin_y = Min(Max(begin_y, 0), LOSMap_h)
	end_x = Min(Max(end_x, 0), LOSMap_w)
	end_y = Min(Max(end_y, 0), LOSMap_h)
	If Abs(begin_x-end_x) < 2 Or Abs(begin_y-end_y) < 2 Then Return 0
	x = Min(Max((ObjectSizeX(LOSMap_obj)/2.0+(x-LOSMAP_TW/2.0))/LOSMAP_TW, begin_x+1), end_x-1)
	y = Min(Max((ObjectSizeY(LOSMap_obj)/2.0-(y+LOSMAP_TH/2.0))/LOSMAP_TH, begin_y+1), end_y-1)
	
	DrawGame
	Text 0,0,Str(begin_x)+","+Str(begin_y)
	Text 0,12,Str(end_x)+","+Str(end_y)
	Text 0,24,Str(LOSMap_w)+"x"+Str(LOSMap_h)
	Text 0,36,Str(x)+","+Str(y)
	'DrawScreen
	'WaitKey
	// Nollataan näkyvä alue
	For i = begin_y To end_y
		For j = begin_x To end_x
			LOSMap(j,i,2)=0 
	   Next j
	Next i
	// Lasketaan LOS näkymälle, skannataan kameran reunoihin asti.
	For dx=begin_x To end_x
	   LOSBresenham(x,y,dx, begin_y)
	   
	   LOSBresenham(x,y,dx, end_y)
	Next dx
	
	For dy=begin_y To end_y
		LOSBresenham(x,y, begin_x,dy)
		
		LOSBresenham(x,y, end_x,dy)
	Next dy
	// Editoidaan karttaan (joka ON nyt vain näytön kokoinen alue)
	ClearText
	For i = begin_y To end_y
		For j = begin_x To end_x
			'DrawGame
			'Text 0,0,"EditMap "+Str(LOSMap_obj)+", 0, "+Str(j+1)+", "+Str(i+1)+", "+Str(LOSMap(j,i,2))
			'DrawScreen
			EditMap LOSMap_obj, 0, j+1, i+1, LOSMap(j,i,2)
	   Next j
	Next i
 
EndFunction 


Function LOSBresenham(x1%, y1%, x2%, y2%)
	dx% = Abs(x2 - x1)
	dy% = Abs(y2 - y1)
	y% = y1
	x% = x1
	error% = 0
	If dx > dy
		add% = 1 - (y2 < y1) Shl 1
		If x1 < x2
			While x <= x2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0
				error = error + dy
				If error Shl 1 >= dx
					y = y + add
					error = error - dx
				EndIf
				x = x + 1
			Wend
		Else
			While x >= x2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0 
				error = error + dy
				If error Shl 1 >= dx
					y = y + add
					error = error - dx
				EndIf
				x = x - 1
			Wend
		EndIf
	Else
		add% = 1 - (x2 < x1) Shl 1
		If y1 < y2
			While y <= y2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0
				error = error + dx
				If error Shl 1 >= dy
					x = x + add
					error = error - dy
				EndIf
				y = y + 1
			Wend
		Else
			While y >= y2
				LOSMap(x,y,2) = LOSMap(x,y,0)
				If LOSMap(x,y,1) Then Return 0
				error = error + dx
				If error Shl 1 >= dy
					x = x + add
					error = error - dy
				EndIf
				y = y - 1
			Wend
		EndIf
	EndIf
EndFunction
Koodisi kusee armottomasti. :|
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by DJ-Filbe » Mon Jan 10, 2011 8:13 pm

Pystyykö CB:llä lukea näppäimistöä, vaikka ikkuna olisi passiivinen / piilotettu?

User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: Tyhmät kysymykset (I/2010)

Post by TheDuck » Mon Jan 10, 2011 8:21 pm

DJ-Filbe wrote:Pystyykö CB:llä lukea näppäimistöä, vaikka ikkuna olisi passiivinen / piilotettu?
cbFun
^^

DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by DJ-Filbe » Mon Jan 10, 2011 8:29 pm

Mites datan lähetys serverin tiedoston jatkeeksi viiveellä? Olisiko jollain tarjota valmista koodia millä tämä onnistuisi? Eli siis ohjema joka heittää merkkijonon serverillä sijaitsevan tiedoston loppupäähän.

User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by esa94 » Mon Jan 10, 2011 8:37 pm

DJ-Filbe wrote:Mites datan lähetys serverin tiedoston jatkeeksi viiveellä? Olisiko jollain tarjota valmista koodia millä tämä onnistuisi? Eli siis ohjema joka heittää merkkijonon serverillä sijaitsevan tiedoston loppupäähän.
Miksi viiveellä? Kyllähän voisit lähettää sen suoraankin jos keyloggeria kerran teet.

cbNetwork soveltunee tähän yhtä hyvin kuin muuhunkin samanlaiseen siirtelyyn.

DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by DJ-Filbe » Mon Jan 10, 2011 8:41 pm

esa94 wrote:
DJ-Filbe wrote:Mites datan lähetys serverin tiedoston jatkeeksi viiveellä? Olisiko jollain tarjota valmista koodia millä tämä onnistuisi? Eli siis ohjema joka heittää merkkijonon serverillä sijaitsevan tiedoston loppupäähän.
Miksi viiveellä? Kyllähän voisit lähettää sen suoraankin jos keyloggeria kerran teet.

cbNetwork soveltunee tähän yhtä hyvin kuin muuhunkin samanlaiseen siirtelyyn.
Pystyn siirtämään dataa cbNetworkilla koneesta toiseen, mutta sen kirjoituksesta tiedostoon ei ole mitään hajua :?

User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Tyhmät kysymykset (I/2010)

Post by CCE » Mon Jan 10, 2011 8:43 pm

DJ-Filbe wrote:
esa94 wrote:
DJ-Filbe wrote:Mites datan lähetys serverin tiedoston jatkeeksi viiveellä? Olisiko jollain tarjota valmista koodia millä tämä onnistuisi? Eli siis ohjema joka heittää merkkijonon serverillä sijaitsevan tiedoston loppupäähän.
Miksi viiveellä? Kyllähän voisit lähettää sen suoraankin jos keyloggeria kerran teet.

cbNetwork soveltunee tähän yhtä hyvin kuin muuhunkin samanlaiseen siirtelyyn.
Pystyn siirtämään dataa cbNetworkilla koneesta toiseen, mutta sen kirjoituksesta tiedostoon ei ole mitään hajua :?
CoolBasicilla on mahdollista käsitellä tiedostoja, katso komennot OpenToWrite sekä OpenToRead. Mikäli data ei ole tekstimuotoista, voit tietenkin käyttää mm. WriteInt() ja vastaavia funktioita.

User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by esa94 » Mon Jan 10, 2011 8:46 pm

DJ-Filbe wrote:
esa94 wrote:
DJ-Filbe wrote:Mites datan lähetys serverin tiedoston jatkeeksi viiveellä? Olisiko jollain tarjota valmista koodia millä tämä onnistuisi? Eli siis ohjema joka heittää merkkijonon serverillä sijaitsevan tiedoston loppupäähän.
Miksi viiveellä? Kyllähän voisit lähettää sen suoraankin jos keyloggeria kerran teet.

cbNetwork soveltunee tähän yhtä hyvin kuin muuhunkin samanlaiseen siirtelyyn.
Pystyn siirtämään dataa cbNetworkilla koneesta toiseen, mutta sen kirjoituksesta tiedostoon ei ole mitään hajua :?
PHP:tä on perinteisesti käytetty tähän.

DJ-Filbe
Devoted Member
Posts: 854
Joined: Sat Feb 20, 2010 3:18 pm

Re: Tyhmät kysymykset (I/2010)

Post by DJ-Filbe » Mon Jan 10, 2011 8:50 pm

CCE wrote:
DJ-Filbe wrote:
esa94 wrote: Pystyn siirtämään dataa cbNetworkilla koneesta toiseen, mutta sen kirjoituksesta tiedostoon ei ole mitään hajua :?
CoolBasicilla on mahdollista käsitellä tiedostoja, katso komennot OpenToWrite sekä OpenToRead. Mikäli data ei ole tekstimuotoista, voit tietenkin käyttää mm. WriteInt() ja vastaavia funktioita.
[/quote]
:D
Datan kirjoitusta serverin filuun tietenkin tarkoitin :D
:lol:
esa94 wrote:PHP:tä on perinteisesti käytetty tähän.
jep, mutta:
Miten saan datan PHP:lle? Avaamalla selaimen? Ei soveltuisi hyvin käyttötarkoitukseen...
PHP-parametrit ovat HTTPGet-funktiolla mahdottomia... Ja PHP-GET-parametrit ne vasta "hyvin" sopisivatkin tarkoitukseen...
Tarvitsen ohjelman, joka lähettää pyydettäessä dataa / paikallisen tiedoston serverille.

User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: Tyhmät kysymykset (I/2010)

Post by TheDuck » Mon Jan 10, 2011 8:55 pm

Mitä jos yrittäisit tehdä itse sen keyloggerisi jos on pakko sellainen tehdä, etkä tulisi pyytämään meitä tekemään sitä puolestasi?
^^

User avatar
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 9:25 am

Re: Tyhmät kysymykset (I/2010)

Post by Sly_Jack0 » Mon Jan 10, 2011 10:46 pm

En viitsinyt nostaa cbGL-topikkia tämän takia, mutta mitä scan-koodeja pitää käyttää cbglKeyDown()-funktion kanssa, jos haluaa lukea nuolinäppäimiä? CB:n mukana tulleessa taulukossa olevat eivät toimi.

User avatar
valscion
Moderator
Moderator
Posts: 1588
Joined: Thu Dec 06, 2007 8:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by valscion » Mon Jan 10, 2011 11:25 pm

Sly_Jack0 wrote:En viitsinyt nostaa cbGL-topikkia tämän takia, mutta mitä scan-koodeja pitää käyttää cbglKeyDown()-funktion kanssa, jos haluaa lukea nuolinäppäimiä? CB:n mukana tulleessa taulukossa olevat eivät toimi.
Koitas näitä:

Code: Select all

UP_ARROW    72
LEFT_ARROW  75
DOWN_ARROW  80
RIGHT_ARROW 77
Löysin pikaisella googletuksella, ei ole tietoa toimiiko oikein.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com

User avatar
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 9:25 am

Re: Tyhmät kysymykset (I/2010)

Post by Sly_Jack0 » Tue Jan 11, 2011 4:22 pm

VesQ wrote:Koitas näitä...
Kiitoksia, nuo toimivat. =)

xamuli
Newcomer
Posts: 16
Joined: Thu Oct 07, 2010 4:40 pm

Re: Tyhmät kysymykset (I/2010)

Post by xamuli » Wed Jan 12, 2011 5:46 pm

Onko taulukon soluilla maksimimäärää ja jos soluja laittaa paljon, hidastaako se peliä tai käykö jotai muuta huonoa?

Locked