ChaosBasic - KEHITTÄJIÄ HAKUSESSA!! (sivu 9)

Muu yhteisön välinen keskustelu.
Post Reply
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Misthema » Tue Jun 17, 2008 7:10 pm

Nemesis wrote:Screen.Lock ja Unlock aiheuttavat virheen.
Homma toimii ainakin näin:

Code: Select all

    For w = 0 To sw
       For h = 0 To sh
           	c=(Sin((w+h+t2)*5)+Cos((w-t2)*5)+Cos(h-t2)*5)*356
       		Screen.Color Sin(c)*64+128,Cos(c)*64+128,0
           	Screen.Dot(w,h)
       Next
    Next
Eli tuon setpixelin sijaan käytin Color- ja Dot-funktioita.
Siis ideanahan on lukita ruutu ja käyttää SetPixel -komentoa jotta homma sujuisi nopeammin. Color- ja Dot-komennolla tein saman jo 0.0.2.4 versiolla, mutta se oli hitaampi kuin CB, vaikka CB:ssä oli ruudun lukitukset ynnä muut.
Toivottavasti tämä asia korjautuu tämän päivän puolella. Pääsen sitten tekemään upeita efektejä. ;)

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dibalo » Tue Jun 17, 2008 8:45 pm

VERSIO 0.1.0.5 ILMESTYNYT!!!
Lataa (sisältää kaiken - ei siis pelkkä hotfix).

Muutoksia:
  • Korjattu bugi: Runtimen kaatuminen Screen.Lock-komennossa
  • Lisätty funktio: Image::Hotspot(float x, float y, float w, float h) As Void
  • Lisätty funktio: Image::RemoveHotspot() As Void
  • Muuta: Manuaalia päivitetty.
The darkest spells can be found from
http://tunkkaus.blogspot.fi

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

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by valscion » Tue Jun 17, 2008 9:41 pm

Nyt kun testasin mistheman efektikoodia, niin se oli hitaampi näytön lukituksen kanssa kun puolestaan pisteen piirtäminen oli nopeampaa :shock:
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
Sami345
Advanced Member
Posts: 349
Joined: Fri Aug 31, 2007 4:52 pm
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Sami345 » Tue Jun 17, 2008 10:30 pm

Tein objekti luokan:

Code: Select all

Class Object
	Private Var img As Image 
	Private Var x As Float
	Private Var y As Float
	Private Var rot As Float
	
	Private Function FixAngle()
		While rot > 360 Or rot < 0
			If rot > 360 Then
				rot = rot - 360
			ElseIf rot < 0 Then
				rot = 360 + rot
			EndIf
		EndWhile
	EndFunction
	
	Public Function Update() As Void
		img.DrawRotated x+Screen.Width()/2,y+Screen.Height()/2,rot
	EndFunction
	
	Public Function Move(Var how_lot As Float) As Void
		y = y - Sin(rot)*how_lot
		x = x + Cos(rot)*how_lot
	EndFunction
	
	Public Function Turn(Var how_lot As Float) As Void
		rot = rot + how_lot
		FixAngle()
	EndFunction
	
	Public Function X() As Float
		Return x
	EndFunction
	
	Public Function Y() As Float
		Return y
	EndFunction
	
	Public Function Angle() As Float
		Return rot
	EndFunction
	
	Public Function Position(Var target_x As Float,Var target_y As Float) As Void
		x = target_x
		y = target_y
	EndFunction
	
	Public Function Rotate(Var target_rot As Float) As Void
		rot = target_rot
		FixAngle()
	EndFunction
	
	Public Function Load(Var file As String,Var r = 0, Var b = 0, Var g = 0) As Void
		img = New Image
		img.Mask r,g,b
		img.Load file
		x = 0
		y = 0
		rot = 0
	EndFunction
	
	Public Function Delete() As Void
		img.Drop()
	EndFunction
EndClass
Projektit: Fiperus - Jäädytetty pidemmäksi aikaa.
Voitot: Viikkokisa XIII, Pikapelikisa 3, Pikapelikisa 13
http://www.sami345.tk/

User avatar
Nemesis
Member
Posts: 51
Joined: Sat May 17, 2008 1:54 pm

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Nemesis » Wed Jun 18, 2008 12:22 am

Minäkin tein! Mukana myös animointi CB-tyyliin.

Code: Select all

Class Object 
	Private Var Img As Image	//Objektin kuva.
	Private Var angle As Float	//Kääntymiskulma.
	Var x As Float		//Sijainti x-akselilla
	Var y As Float		//Ja y. 
	Private Var usable 
	Private Var T[50] As Image	//Animaatioframet.
	Private Var count			//Framejen määrä.
	Private Var a As Float 		//Animaation apumuuttuja
	Private Var b				// -''-
	Private Var M[4]			//Maskiväri
	//Alustus===============================================================
	Constructor
		This.x = Screen.Width()/2.0
		This.y = Screen.Height()/2.0
		This.usable = 1
	EndConstructor
	//Lataa objektin.===============================================================
	Function Load(Var file As String)
		Img = New Image
		Img.Mask(M[0],M[1],M[2],M[3])
		Img.Load(file)
	EndFunction
	//Lataa ANIMOIDUN objektin.===============================================================
	Function LoadAnim(Var file As String, Var w, Var h, Var start, Var count)
		Var pix
		count = count
		Img = New Image
		Img.Mask(M[0],M[1],M[2],M[3])
		Img.Load(file)
		Img.Lock(ChBLockRead)
		For i = 0 To count 
			T[i] = New Image
			T[i].Create(w,h)
			T[i].Lock(ChBLockWrite)
			For y2 = 0 To h-1
				For x2 = 0 To w-1
					pix = Img.GetPixel(x2 + (i+start)*w,y2)
					T[i].SetPixel(x2,y2, pix)
				Next
			Next
			T[i].Unlock()
		Next
		Img.Unlock()
	EndFunction
	//Piirtää objektin.===============================================================
	Function Draw()
		Img.DrawRotated(This.x, This.y, This.angle)
	EndFunction
	//Piirtää ANIMOIDUN objektin.===============================================================
	Function DrawAnim(Var v As Float)
		a = a + Screen.GetFrameTime()
		If a > v Then
			b += 1
			a = 0
		EndIf
		If b >= count Then b = 0
		Screen.Text(0,12,a)
		T[b].DrawRotated(x, y,angle)
	EndFunction
	//Kääntää objektia annetulla nopeudella.===============================================================
	Function Turn(Var v As Float)
		angle += v
	EndFunction
	//Kääntää objektin annettuun kulmaan.===============================================================
	Function Rotate(Var angle As Float)
		angle = angle
	EndFunction	
	//Liikuttaa objektia huomioiden kulman.===============================================================
	Function Move(Var v As Float)
		x += Cos(This.angle) * v
		y +=(-Sin(This.angle)) * v
	EndFunction
	//Palauttaa objektin kulman..===============================================================
	Function GetAngle()
		Return This.angle
	EndFunction
	//Liikuttaa objektia suoraan.===============================================================
	Function Translate(Var x As Float, Var y As Float)
		x += x
		y += y
	EndFunction	
	//Poistaa objektin.===============================================================
	Function Delete()
		This.Img.Drop()
		For i = 0 To count-1
			T[i].Drop()
		Next
		This.usable = 0
	EndFunction
	//Maskaa objektin.===============================================================
	Function Mask(Var r, Var g, Var b, Var a = 255)
		M[0] = r
		M[1] = g
		M[2] = b
		M[3] = 2
	EndFunction
EndClass
/*Tämänhetkiset ominaisuudet:
Load(Var file As String)
	Lataa objektin.
	
	file = kuvan TIEDOSTONIMI.
	
LoadAnim(Var file As String, Var w, Var h, Var start, Var count)
	Lataa animoidun objektin.
	
	file = kuvan TIEDOSTONIMI.
	w,h = framen leveys ja korkeus.
	start = aloitusframen järj.luku.
	count = framejen määrä.
	
Draw()
	Piirtää objektin.

DrawAnim(Var v As Float)
	Piirtää animoidun objektin.
	
	v = animaation nopeus(Montako sekuntia näytetään yhtä framea.).
	
Turn(Var v As Float)
	Kääntää objektia haluttuun suuntaan.
	
	v = kääntämisen nopeus (negatiivinen: oikealle, pos. vasemmalle.)
	
Rotate(Var angle As Float)
	Kääntää objektin haluttuun kulmaan.
	
	angle = kulma.
	
GetAngle()
	Palauttaa objektin kulman.
	
Translate(Var x As Float, Var y As Float)
	Liikuttaa objektia kulmasta huolimatta.
	
	x = vaakanopeus.
	y = pystynopeus.
	
Move(Var v As Float)
	Liikuttaa objektia huomioiden objektin kulman.
	
	v = nopeus.
	
Delete()
	Poistaa objektin
	
Mask(Var r, Var g, Var b, Var a)
	Maskaa objektin (kutsu ENNEN kuvan latausta.)
	
	PArametrit: RGBA

*/
Asian tuntian oikein kirjoitus ohjeet:
-Älä tee yhdys sana virheitä.
-Vältä lyhenteitä mahd. muk.
-Yksi sanaiset lauseet? Unohda.

User avatar
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by SPuntte » Wed Jun 18, 2008 1:13 am

Hittolainen!

Nyt vasta, kun katselin noita CB-objektisysteemejä ChB-luokkaimplementoituina, tajusin että tämä näyttää jo pelottavan hyvältä. Tuosta kun lähtee vielä perimään jotain objekteja joilla on spesiaalimpia ominaisuuksia, saadaan CB-tyylistä systeemiä helvetin nätisti toteutettuna. Ja kun kaiken tuon luokkamössön voi kapseloida sinne headeriin.. Ei tarvitse keskittyä hallitsemaan objektien logiikkasysteemiä koodin sisällä vaan voi keskittyä olennaiseen, pelisisällön luomiseen. Kun tähän saadaan vielä hiukkasen lisää ominaisuuksia ja vakautta, taitaa tämä(kin) jätkä sanoa CB:lle moi moi..

Dibalo, miksei nimesi ole Diballah? ;)
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

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

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by valscion » Wed Jun 18, 2008 3:15 am

Nemesis wrote:Minäkin tein! Mukana myös animointi CB-tyyliin.

Code: Select all

Class Object 
	Private Var Img As Image	//Objektin kuva.
	Private Var angle As Float	//Kääntymiskulma.
	Var x As Float		//Sijainti x-akselilla
	Var y As Float		//Ja y. 
	Private Var usable 
	Private Var T[50] As Image	//Animaatioframet.
	Private Var count			//Framejen määrä.
	Private Var a As Float 		//Animaation apumuuttuja
	Private Var b				// -''-
	Private Var M[4]			//Maskiväri
	//Alustus===============================================================
	Constructor
		This.x = Screen.Width()/2.0
		This.y = Screen.Height()/2.0
		This.usable = 1
	EndConstructor
	//Lataa objektin.===============================================================
	Function Load(Var file As String)
		Img = New Image
		Img.Mask(M[0],M[1],M[2],M[3])
		Img.Load(file)
	EndFunction
	//Lataa ANIMOIDUN objektin.===============================================================
	Function LoadAnim(Var file As String, Var w, Var h, Var start, Var count)
		Var pix
		count = count
		Img = New Image
		Img.Mask(M[0],M[1],M[2],M[3])
		Img.Load(file)
		Img.Lock(ChBLockRead)
		For i = 0 To count 
			T[i] = New Image
			T[i].Create(w,h)
			T[i].Lock(ChBLockWrite)
			For y2 = 0 To h-1
				For x2 = 0 To w-1
					pix = Img.GetPixel(x2 + (i+start)*w,y2)
					T[i].SetPixel(x2,y2, pix)
				Next
			Next
			T[i].Unlock()
		Next
		Img.Unlock()
	EndFunction
	//Piirtää objektin.===============================================================
	Function Draw()
		Img.DrawRotated(This.x, This.y, This.angle)
	EndFunction
	//Piirtää ANIMOIDUN objektin.===============================================================
	Function DrawAnim(Var v As Float)
		a = a + Screen.GetFrameTime()
		If a > v Then
			b += 1
			a = 0
		EndIf
		If b >= count Then b = 0
		Screen.Text(0,12,a)
		T[b].DrawRotated(x, y,angle)
	EndFunction
	//Kääntää objektia annetulla nopeudella.===============================================================
	Function Turn(Var v As Float)
		angle += v
	EndFunction
	//Kääntää objektin annettuun kulmaan.===============================================================
	Function Rotate(Var angle As Float)
		angle = angle
	EndFunction	
	//Liikuttaa objektia huomioiden kulman.===============================================================
	Function Move(Var v As Float)
		x += Cos(This.angle) * v
		y +=(-Sin(This.angle)) * v
	EndFunction
	//Palauttaa objektin kulman..===============================================================
	Function GetAngle()
		Return This.angle
	EndFunction
	//Liikuttaa objektia suoraan.===============================================================
	Function Translate(Var x As Float, Var y As Float)
		x += x
		y += y
	EndFunction	
	//Poistaa objektin.===============================================================
	Function Delete()
		This.Img.Drop()
		For i = 0 To count-1
			T[i].Drop()
		Next
		This.usable = 0
	EndFunction
	//Maskaa objektin.===============================================================
	Function Mask(Var r, Var g, Var b, Var a = 255)
		M[0] = r
		M[1] = g
		M[2] = b
		M[3] = 2
	EndFunction
EndClass
/*Tämänhetkiset ominaisuudet:
Load(Var file As String)
	Lataa objektin.
	
	file = kuvan TIEDOSTONIMI.
	
LoadAnim(Var file As String, Var w, Var h, Var start, Var count)
	Lataa animoidun objektin.
	
	file = kuvan TIEDOSTONIMI.
	w,h = framen leveys ja korkeus.
	start = aloitusframen järj.luku.
	count = framejen määrä.
	
Draw()
	Piirtää objektin.

DrawAnim(Var v As Float)
	Piirtää animoidun objektin.
	
	v = animaation nopeus(Montako sekuntia näytetään yhtä framea.).
	
Turn(Var v As Float)
	Kääntää objektia haluttuun suuntaan.
	
	v = kääntämisen nopeus (negatiivinen: oikealle, pos. vasemmalle.)
	
Rotate(Var angle As Float)
	Kääntää objektin haluttuun kulmaan.
	
	angle = kulma.
	
GetAngle()
	Palauttaa objektin kulman.
	
Translate(Var x As Float, Var y As Float)
	Liikuttaa objektia kulmasta huolimatta.
	
	x = vaakanopeus.
	y = pystynopeus.
	
Move(Var v As Float)
	Liikuttaa objektia huomioiden objektin kulman.
	
	v = nopeus.
	
Delete()
	Poistaa objektin
	
Mask(Var r, Var g, Var b, Var a)
	Maskaa objektin (kutsu ENNEN kuvan latausta.)
	
	PArametrit: RGBA

*/
Mahtava koodinpätkä! Siihen kun vielä lisäilisit Positionin ja mahdollisuuden tallentaa yhteen muuttujaan String tyyppistä dataa. Ihmettelin muuten vähän, kun siellä on tuo usable yksityinen muuttuja, jonka arvo asetetaan ykköseksi objektia luotaessa ja nollataan kun objekti poistetaan. Sen muuttujan asettaisi joko yleiseksi tai sitten loisit funktion, jolla tarkistetaan onko objekti käytettävissä. (Tietysti aina pitäisi käyttää Pop kun poistetaan objekti... mutta tuolla tavalla voisi pitää sen objektiin viittavan muuttujan vielä käytettävissä, vaikka siihen ei ole ladattukaan kuvaa)

P.S.
Osaan kyllä itsekin nuo muutokset tehdä, mutta tämä on sinun koodisi :)
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
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Misthema » Wed Jun 18, 2008 9:52 am

OonSuomesta wrote:Nyt kun testasin mistheman efektikoodia, niin se oli hitaampi näytön lukituksen kanssa kun puolestaan pisteen piirtäminen oli nopeampaa :shock:
Väärin, koska minulla oli ruudun lukitus laitettu typerästi (se lukitsi jokaisen pikselin ruudulla ja siksi oli hidas).
Tässä uudet koodit joita saatte ihan rauhassa testailla. Huomaatte itsekin että ruudun lukitseminen ja SetPixel:llä "piirtäminen" on nopeampaa.

Ruudun lukituksella:

Code: Select all

Var sw As Integer = 110
Var sh As Integer = 75
Var c As Integer = 0
Var t As Clock = New Clock
Var t2 As Integer = 0
Var _size As Integer = 0
t.Start

Screen.Set(sw,sh)

Repeat

	t2+=1
	
	Screen.Lock(ChBLockWrite)
    For w = 0 To sw
    	For h = 0 To sh
	        c=(Sin((w+h+t2)*5)+Cos((w-t2)*5)+Cos(h-t2)*5)*356
	
            Screen.SetPixel(w,h, GetARGB(Sin(c)*64+128,Cos(c)*64+128,0))
    	Next
    Next
    Screen.Unlock

    Screen.Text 0,0,Screen.FPS()


	Screen.Draw
Until Key.Hit(KEY_ESCAPE)


Dot -komennolla:

Code: Select all

Var sw As Integer = 110
Var sh As Integer = 75
Var c As Integer = 0
Var t As Clock = New Clock
Var t2 As Integer = 0
Var _size As Integer = 0
t.Start

Screen.Set(sw,sh)

Repeat

	t2+=1
	
	For w = 0 To sw
       For h = 0 To sh
             c=(Sin((w+h+t2)*5)+Cos((w-t2)*5)+Cos(h-t2)*5)*356
        	 Screen.Color Sin(c)*64+128,Cos(c)*64+128,0
       	     Screen.Dot(w,h)
       Next
    Next

    Screen.Text 0,0,Screen.FPS()

	Screen.Draw
Until Key.Hit(KEY_ESCAPE)

User avatar
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Pate5 » Wed Jun 18, 2008 10:40 am

Itseäni ärsyttää kovasti yksi asia. Chb-tiedostoja ei voi avata chaosbasicilla, vaan editori pitää avata erikseen ja hakea tiedosto siihen. Myöskään exen tallentamispaikkaa ei voi vaihtaa(itselläni ei ainakaan toimi tuo user defined.) Myöskään color preferences ei toimi.
CoolBasic henkilökuntaa
Graafikko

User avatar
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dande » Wed Jun 18, 2008 12:42 pm

Kun tänne on näitä objekti-systeemejä alkanut tulla, niin esittelen sitten omanikin.

Tarkoitukseni ei ola täysin samalla lailla matkia CB:n objektijärjestelmää, niinkuin aiemmat esimerkit, ja esimerkiksi kääntymiseen ei käytetä funktiota Turn vaan Rotate-funktiota, ja koko luokan nimi ei ole Object vaan CSprite. C siinä edessä on lyhennä sanasta Class, mutta voisihan se olla vaikka lyhenne sanasta Chaos, kun kerran se on ohjelmointikielenkin nimi.

Kaiken pohjana on CObject, joka sisältää peruskomennot liikkumiselle, eli: Move( x, y ), Rotate( angle ), Translate( x, y ), SetPosition( x, y ), SetAngle( angle ), CopyPosition( obj As CObject ), CopyAngle( obj As CObject ). Näiden lisäksi se sisältää muutaman itsetutkiskelu funktion: X(), Y(), Angle(), jotka (yllätys, yllätys) palauttavat tiedot objektin x- ja y-sijainnista sekä kulmasta. Se on tässä

Code: Select all

Class CObject
	Private Var mPos[2] As Float
	Private Var mAngle As Float
	
	
	Constructor
		mPos[0]=0.0
		mPos[1]=0.0
		mAngle=0.0
	EndConstructor
		
	/*Palauttaa objektion X-koordinaatin*/
	Public Function X() As Float
		Return mPos[0]
	EndFunction
	
	/*Palauttaa objektin Y-koordinaatin*/
	Public Function Y() As Float
		Return mPos[1]
	EndFunction
	
	/*Palauttaa objektin kulman*/
	Public Function Angle() As Float
		Return mAngle
	EndFunction
	
	/*Pyörittää objektia. Vastaa CB:n TurnObject-funktiota*/
	Function Rotate( Var angle As Float ) As Void
		mAngle+=angle
		If mAngle>360 Then
			mAngle=mAngle-360
		ElseIf mAngle<0 Then
			mAngle+=360
		EndIf
	EndFunction
	
	/*Asettaa objektin tiettyyn kulmaan. Vastaa CB:n RotateObject-funktiota*/
	Function SetAngle( Var angle As Float ) As Void
		mAngle=angle
	EndFunction
	
	/*Liikuttaa objektia eteenpäin tai sivulle*/
	Public Function Move( Var forward As Float, Var sidestep As Float=0 ) As Void
		mPos[0]+= Cos(mAngle)*forward+Sin(mAngle)*sidestep
		mPos[1]+= Sin(mAngle)*forward+Cos(mAngle)*sidestep
	EndFunction
	
	/*Liikuttaa objektia koordinaattiakseleiden mukaisesti objektin nykyisestä kulmasta välittämättä*/
	Public Function Translate( Var x As Float, Var y As Float ) As Void
		mPos[0]+=x
		mPos[1]+=y
	EndFunction
	
	/*Asettaa objektin tiettyihin koordinaatteihin*/
	Public Function SetPosition( Var x As Float, Var y As Float ) As Void
		mPos[0]=x
		mPos[1]=y
	EndFunction
	
	Public Function CopyPosition( Var obj As CObject ) As Void
		This.mPos[0]=obj.X()
		This.mPos[1]=obj.Y()
	EndFunction
	
	Public Function CopyAngle( Var obj As CObject ) As Void
		This.mAngle=obj.Angle()
	EndFunction
	
EndClass
Tästä luokasta periytetään ensimmäisenä CCamera-luokka, joka toimii kamerana tuleville Spriteillemme. Kamera luokka sisältää siis kaikki CObjektin-funktiot ja lisäksi myös seuraavat funktiot: SetSize( w, h ), InitImage( w, h ), DrawTo(), Draw( x, y ) ja vielä itsetutkiskelua varten Width() ja Height(). Peruskäytössä sinun ei periaatteessa tarvitse kuin luoda kamera muuttuja, ja konstruktori hoitaa loput. Muita funktioita tarvitset luodessasi jaettua ruutua (esimerkki alempana). Tässä itse luokka

Code: Select all

Class CCamera Inherits CObject
	Private Var mSize[2] As Integer
	Private Var mImage As Image
	
	Constructor
		mSize[0]=Screen.Width()
		mSize[1]=Screen.Height()
	EndConstructor
	
	/*Palauttaa näkymän leveyden*/
	Public Function Width() As Integer
		Return mSize[0]
	EndFunction
	
	/*Palauttaa näkymän korkeuden*/
	Public Function Height() As Integer
		Return mSize[1]
	EndFunction
	
	Public Function SetSize( Var sizeX As Integer, Var sizeY As Integer ) As Void
		mSize[0]=sizeX
		mSize[1]=sizeY
	EndFunction
	
	/*Alustaa kuvamuuttujan, tarpeellinen vain jaetun ruudun toteutuksessa*/
	Public Function InitImage(Var sizeX As Integer, Var sizeY As Integer ) As Void
		mImage = New Image
		mImage.Create sizeX,sizeY
		mSize[0]=sizeX
		mSize[1]=sizeY
	EndFunction
	
	/*Jos olet alustanut kuvan, niin ohjaa piirtokomennot tällä funktiolla 
		siihen (samalla myös tyhjentää kuvan)*/
	Public Function DrawTo() As Void
		Screen.SetDrawBuffer mImage
		Screen.Box 0,0,mSize[0],mSize[1]
	EndFunction
	
	 /*Tarvitaan vain jaetussa ruudussa, piirtää näkymän ruudulle*/
	Public Function Draw(Var x As Integer, Var y As Integer ) As Void
		mImage.Draw x,y
	EndFunction
EndClass
Sen jälkeen vielä itse CSprite-luokka, joka on se tärkein osa toiminnallisuutta. Se sisältää sen varsinaisen kuvan piirtämisen, skaalaamisen, läpinäkyvyyden ja pyörittelyn. Funktioita ovat:
  • SetMask(r,g,b,a=255), jolla asetetaan maskiväri ENNEN KUVAN LATAUSTA.
  • Load(file As String), jolla ladataan kuva
  • SetOpacity( alpha ), jolla asetetaan läpinäkyvyys
  • ChangeOpacity( alpha ), jolla muutetaan läpinäkyvyyttä
  • Zoom( scale ), jolla skaalataan objektia
  • SetScale( scale ), jolla asetetaan skaalaus tiettyyn arvoon
  • ZoomX( scale ) ja ZoomY( scale ), jolla skaalataan objektia vain toisessa suunnassa
  • SetScaleX( scale ) ja SetScaleY( scale ), jolla asetetaan vain tietyn suuntainen skaalaus
  • Update(), jolla ei tee yhtään mitään, mutta jonka voi toteuttaa periytetyissä luokissa, eli tämä toimii periaatteessa virtuaalifunktiona
  • Draw(), joka piirtää objektin suoraan näytölle. En suosittele käytettäväksi seuraavan funktion olemassa olon takia
  • Draw( cam As CCamera ), piirtää objektin kameran kautta. Tämän käyttäminen mahdollistaaa helpon skrollattavuuden
  • Opacity(), ScaleX(), ScaleY() ja Img() toimivat jälleen itsetutkiskelu funktioina, joiden palauttaman arvot jokainen voi päätellä
Lisäksi mukana on vielä kaksi luokan ulkopuolista funktiota: UpdateSprites() ja DrawSprites(cam), jotka kutsuvat Update()- ja Draw( cam As CCamera )-funktioita kaikille Pushatuille spriteille. Ja se koodi:

Code: Select all

Class CSprite Inherits CObject
	Private Var mScale[2] As Float
	Private Var mImage As Image
	
	Constructor
		mImage = New Image
		mScale[0]=1.0
		mScale[1]=1.0
	EndConstructor
	
	/*Palauttaa objektin läpinäkyvyyden*/
	Public Function Opacity() As Float
		Return mImage.GetOpacity()
	EndFunction
	
	/*Palauttaa objektin skaalausarvon leveyssuunnassa*/
	Public Function ScaleX() As Float
		Return mScale[0]
	EndFunction
	
	/*Palauttaa objektin skaalausarvon pituussuunnassa*/
	Public Function ScaleY() As Float
		Return mScale[1]
	EndFunction
	
	/*Palauttaa objektin kuvamuuttujan*/
	Public Function Img() As Image
		Return mImage
	EndFunction
	
	/*Asettaa maskin ladattavalle kuvalle. KUTSU ENNEN LATAUSTA!*/
	Function SetMask(Var r As Integer, Var g As Integer, Var b As Integer, Var a As Integer=255)
		mImage.Mask(r,g,b,a)
	EndFunction
	
	/*Lataa objektille kuvamuuttujan*/
	Public Function Load( Var file As String ) As Void
		mImage.Drop()
		mImage.Load(file)
	EndFunction

	/*Asettaa objektin läpinäkyvyyden*/
	Function SetOpacity(Var alpha As Float) As Void
		mImage.SetOpacity(alpha)
	EndFunction
	
	/*Muuttaa objektin läpinäkyvyyttä tiettyyn suuntaan*/
	Function ChangeOpacity( Var alpha As Float ) As Void
		Var temp As Float=mImage.GetOpacity()
		temp+=alpha
		If (temp > 1.0) Then
			temp=1.0
		ElseIf (temp < 0.0) Then
			temp=0.0
		EndIf
		mImage.SetOpacity(temp)
	EndFunction
	
	/*Skaalaa objektia tietyn monikertaiseksi*/
	Function Zoom( Var scale As Float ) As Void
		mScale[0]=mScale[0]*scale
		mScale[1]=mScale[0]*scale
	EndFunction
	
	/*Asettaa skaalauksen tarkalleen tiettyyn arvoon*/
	Function SetScale( Var scale As Float ) As Void
		mScale[0]=scale
		mScale[1]=scale
	EndFunction
	
	/*Skaalaa objektia leveyssuunnassa*/
	Function ZoomX( Var scale As Float ) As Void
		mScale[0]*=scale
	EndFunction
	
	/*Asettaa leveyssuuntaisen skaalauksen tarkalleen tiettyyn arvoon*/
	Function SetScaleX( Var scale As Float ) As Void
		mScale[0]=scale
	EndFunction
	
	/*Skaalaa objektia pituussuunnassa*/
	Function ZoomY( Var scale As Float ) As Void
		mScale[1]*=scale
	EndFunction
	
	/*Asettaa pituussuuntaisen skaalauksen tarkalleen tiettyyn arvoon*/
	Function SetScaleY( Var scale As Float ) As Void
		mScale[1]=scale
	EndFunction
	
	Public Function Update() As Void
		/*Tämä on tyhjä funktio, voit periyttää luokan CSpritestä, ja toteuttaa sille oman update-funktion*/
	EndFunction
	
	/*Piirtää objektin*/
	Public Function Draw() As Void
		mImage.DrawRotated( mPos[0], Screen.Height()-mPos[1], mAngle, mScale[0], mScale[1] )
	EndFunction
	
	/*Piirtää objektin kameran mukaan*/
	Public Function Draw( Var cam As CCamera ) As Void
		Var camW=cam.Width()
		Var camH=cam.Height()
		Var camX=cam.X()
		Var camY=cam.Y()
		mImage.DrawRotated( (camW/2)+mPos[0]-camX, (camH/2)-mPos[1]+camY, mAngle, mScale[0], mScale[1] )
	EndFunction
	
EndClass

Function UpdateSprites() As Void
	Foreach iObj In CSprite
		iObj.Update()
	Next
EndFunction

Function DrawSprites( Var cam As CCamera ) As Void
	Foreach iObj In CSprite
		iObj.Draw(cam)
	Next
EndFunction
Näiden jälkeen sitten vielä pari esimerkkiä käytöstä:

Yleistä esimerkkiä:

Code: Select all


Class CCow Inherits CSprite
	Private Var mMoveX As Float
	Private Var mMoveY As Float
	Private Var mRotSpeed As Float
	Constructor
		This.SetMask(0,0,0)
		This.Load("../media/cow.png")
		This.SetPosition(Random(-400,400),Random(-400,400))
		mMoveX=Random(-100,100)
		mMoveY=Random(-100,100)
		mRotSpeed=Random(-270,270)
		This.SetOpacity(0.7)
	EndConstructor
	Public Overrided Function Update() As Void
		Var dt As Float =Screen.GetFrameTime()
		This.Rotate(dt*mRotSpeed)
		This.Translate(mMoveX*dt,mMoveY*dt)
		If (This.X()>800)|(This.X()< -800) Then
			mMoveX= -mMoveX
		EndIf
		If (This.Y()>800)|(This.Y()< -800) Then
			mMoveY= -mMoveY
		EndIf
	EndFunction
EndClass


Screen.Set 640,480
Screen.ClsColor(128,128,128)

Var camera As CCamera = New CCamera

Var obj As CSprite = New CSprite
obj.SetMask(0,0,0)
obj.Load("../media/guy.bmp")

For i=0 To 255
	Var iObj As CSprite = New CCow
	Push iObj
Next

Var dt As Float

Var cameraFollow=0

Push obj

Repeat
	dt=Screen.GetFrameTime()
	
	obj.Move(80*obj.ScaleX()*dt*(Key.Down(KEY_W)-Key.Down(KEY_S)),40*obj.ScaleX()*dt*(Key.Down(KEY_A)-Key.Down(KEY_D)))
	obj.Rotate(180*dt*(Key.Down(KEY_Q)-Key.Down(KEY_E)))
	obj.Translate(90*dt*(Key.Down(KEY_RIGHT)-Key.Down(KEY_LEFT)),90*dt*(Key.Down(KEY_UP)-Key.Down(KEY_DOWN)))
	
	camera.Translate(90*dt*(Key.Down(KEY_NUMPAD6)-Key.Down(KEY_NUMPAD4)),90*dt*(Key.Down(KEY_NUMPAD8)-Key.Down(KEY_NUMPAD2)))
	
	If Key.Down(KEY_Z) Then
		obj.Zoom(1.0+dt)
	ElseIf Key.Down(KEY_X) Then
		obj.Zoom(1.0-dt)
	ElseIf Key.Hit(KEY_C) Then
		obj.SetScale(1.0)
	EndIf
	
	If Key.Hit(KEY_SPACE) Then
		cameraFollow= Not cameraFollow
	EndIf
	
	If Key.Hit(KEY_RETURN) Then
		camera.SetPosition(0,0)
	EndIf
	
	If cameraFollow Then
		camera.CopyPosition(obj)
	EndIf
	
	obj.ChangeOpacity(dt*(Key.Down(KEY_2)-Key.Down(KEY_1)))
	If Key.Hit(KEY_3) Then
		obj.SetOpacity(1.0)
	EndIf
	
	UpdateSprites()
	DrawSprites(camera)
	
	If Mouse.Hit(0) Then
		camera.Translate(Mouse.X()-320,Mouse.Y()-240)
	EndIf
	
	Screen.Color(255,255,255,128)
	Screen.Box(2,2,380,42)
	
	Screen.Color(255,0,0)
	
	Screen.Line(2,2, 382,2)
	Screen.Line(382,2, 382,44)
	Screen.Line(382,44, 2,44)
	Screen.Line(2,44, 2,2)
	
	Screen.Color(0,0,0)
	
	Screen.Text 4, 1,"Ukko liikkuu WASD:sta ja Q:sta ja E:sta, sekä nuolinäppäimistä"
	Screen.Text 4,11,"Z:sta ja X:sta säätää kokoa, C:stä palauttaa oletuksen"
	Screen.Text 4,21,"1:sta ja 2:sta muuttaa lapinakyvyytta ja 3:sta palauttaa oletuksen."
	Screen.Text 4,31,"Numeronäppäimistöllä tai hiiren klikkauksilla liikuttaa kameraa."
	
	Screen.Color(255,255,255)
	
	Screen.Text 10,50,"FPS: "+Screen.FPS()
	Screen.Text 10,60,"DeltaTime: "+dt
	Screen.Text 10,70,"Obj.X: "+obj.X()+" | Obj.Y: "+obj.Y()
	Screen.Text 10,80,"Scale: "+obj.ScaleX()+" | Angle: "+obj.Angle()
	Screen.Text 10,90,"Opacity: "+obj.Opacity()
	
	Screen.Text 10,100,"Cam X: "+camera.X()
	Screen.Text 10,110,"Cam Y: "+camera.Y()
	Screen.Text 10,120,"Cam Width: "+camera.Width()
	Screen.Text 10,130,"Cam Height: "+camera.Height()
	
	Screen.Draw()
Until Key.Hit(KEY_ESCAPE)
Jaettu ruutu:

Code: Select all

Screen.Set(800,600)
Var obj As CSprite = New CSprite
Var cam As CCamera = New CCamera
Var cam2 As CCamera = New CCamera
cam.InitImage(400,600)
Key.Wait()
cam.Rotate(90)
cam2.InitImage(400,600)
cam2.Rotate(90)
obj.SetMask(0,0,0)
obj.Load("../media/guy.bmp")
Repeat
	Var dt As Float=Screen.GetFrameTime()	
    obj.Move 120*dt*(Key.Down (KEY_W)-Key.Down (KEY_S))
    obj.Rotate 120*dt*(Key.Down (KEY_A)-Key.Down (KEY_D))    
    cam.Move 120*dt*(Key.Down (KEY_T)-Key.Down (KEY_G)),120*dt*(Key.Down (KEY_H)-Key.Down (KEY_F))
    cam2.Move 120*dt*(Key.Down (KEY_I)-Key.Down (KEY_K)),120*dt*(Key.Down (KEY_L)-Key.Down (KEY_J))
	Screen.Color 0,0,0
	cam.DrawTo()
	obj.Draw cam
	cam2.DrawTo()
	obj.Draw cam2
	Screen.SetDrawBuffer(Null)
	cam.Draw 0,0
	cam2.Draw 400,0
	Screen.Color 255,255,255
	Screen.Line(400,0,400,600)
	Screen.Draw()
Forever
CTileMap on kehityksessä, mutta seuraavaksi lisännen jonkinlaisen overlap-funktion CSpriteen, jos vain kerkeän. (Olen keskittynyt enemmän Wii-skenen ja DS-skenen seuraamiseen viimepäivinä)

Include-komennosta (jota kannattanee noiden koodien kanssa käyttää) ChaosEditorin yhteydessä: Include etsii tiedostoja aina viimeksi avatusta kansiosta. Jos sinulla on esim kansio A, jossa on kansiot B ja C, ja olet avannut koodin kansiosta B, joka käyttää includea kyseisessä kansiossa sijaitsevaan tiedostoon, ja avaat sen jälkeen koodin kansiosta C ja yrität kääntää B-kansion koodia, niin kääntäjä valittaa, että se ei löydä include-tiedostoa.

User avatar
iTKEVAnAKKI
Advanced Member
Posts: 335
Joined: Tue Aug 28, 2007 3:55 pm
Location: Siellä jossain

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by iTKEVAnAKKI » Wed Jun 18, 2008 1:33 pm

En jaksannut testata noita, mutta jos kaikki toimiin niinkuin pitää niin MAHTAVAA! :o Kohta vois alottaa jonku prjoktin ChBllä...
Projektit:
Joku projekti meneillään... Mitähän siitäkin tulee ;)

cryde
Newcomer
Posts: 8
Joined: Mon Apr 07, 2008 12:11 pm

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by cryde » Wed Jun 18, 2008 9:16 pm

En saanut tuota galgoneerin esimerkkiä toimimaan.. Copypastesin koodit omiin .chb tiedostoihin ja sitten esimerkit omaansa. Includetin koodit esimerkkiin mutta editori valittaa Csprite -tiedostosta että "Wrong keyword usage" tai "Syntax error"

Teenkö jotain väärin ?

User avatar
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dande » Wed Jun 18, 2008 9:44 pm

cryde wrote:En saanut tuota galgoneerin esimerkkiä toimimaan.. Copypastesin koodit omiin .chb tiedostoihin ja sitten esimerkit omaansa. Includetin koodit esimerkkiin mutta editori valittaa Csprite -tiedostosta että "Wrong keyword usage" tai "Syntax error"

Teenkö jotain väärin ?
Helpoin tapa lienee, että lisäät tiedostoon, jossa on CCamera, alkuun rivin include "CObject.chb" ja CSprite-luokan sisältävään tiedostoon include "CCamera.chb". Tämän jälkeen omassa testissäsi includetat CSprite.chb:n. Noiden pitäisi toimia myös samaan tiedostoon pastetettuina

Tässä kaikki tiedostot toimivassa paketissa: http://www.nullcore.org/~janne/CObject.rar

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dibalo » Wed Jun 18, 2008 11:04 pm

Bravo! Erinomaista!! :mrgreen:

Vinkki: jos haluaa luokkansa toteutukseen, että objekti lisätään automaattisesti systeemiin niin.

Code: Select all

Public Function LatausFunktioTjsp(_PARAMETRIT_) As _HALUTTU_TYYPPI_
   ...
   Push This
   ...
EndFunction
Ja Pop:han toimii samalla tavalla. ;)
The darkest spells can be found from
http://tunkkaus.blogspot.fi

User avatar
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dande » Wed Jun 18, 2008 11:23 pm

Dibalo wrote:Bravo! Erinomaista!! :mrgreen:

Vinkki: jos haluaa luokkansa toteutukseen, että objekti lisätään automaattisesti systeemiin niin.

Code: Select all

Public Function LatausFunktioTjsp(_PARAMETRIT_) As _HALUTTU_TYYPPI_
   ...
   Push This
   ...
EndFunction
Ja Pop:han toimii samalla tavalla. ;)
Ajattelin, että ehkä olisi parempi, jos olisi tarvittaessa mahdollista käyttää useita eri linkitettyjä listoja (mahdollista varastoida yhteen listaan vaikka toisen tason objektit, ja sitten vain nopeasti vaihtaa listaa), joten kysyn tässä samalla, onko tulossa sisäänrakennettua list-tyypiä? Ja kuinkas ne staattiset jäsenfunktiot ja -muuttujat?

Edit:
Pystyykö luokan jäsenmuuttujataulukon kokoa muuttamaan? Aina kun yritän sitä, niin herjaa että ResizeArray:tä ei voi käyttää niin. Esim tässä:

Code: Select all

Class A
	Private Var a[2]
	Constructor
		ResizeArray a[4]
	EndConstructor
EndClass
Ilman Luokkia homma kyllä toimii niinkuin pitääkin. Tämä olisi kohtuu tarpeellista suunnittelemalleni Tilemap-järjestelmälle, ellet sitten toteuta muistipaloja, jolloin voisin portata CoolBasicille tekemäni järjestelmän lähes suoraan ChB:lle

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dibalo » Thu Jun 19, 2008 12:34 am

Galgoneer wrote:Pystyykö luokan jäsenmuuttujataulukon kokoa muuttamaan? Aina kun yritän sitä, niin herjaa että ResizeArray:tä ei voi käyttää niin.
Kääntäjän bugi, joka korjataan StormBringer -versioon. Yritän kiirehtiä sen valmiiksi ennen armeijaan lähtöä... Lisäksi dokumentoin kääntäjän rajapinnan, jotta halukkaat voivat tehdä oman editorin Kaaokselle. :)
The darkest spells can be found from
http://tunkkaus.blogspot.fi

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

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by valscion » Thu Jun 19, 2008 5:42 am

Galgoneer wrote:Kun tänne on näitä objekti-systeemejä alkanut tulla, niin esittelen sitten omanikin.

Jaettu ruutu:

Code: Select all

Screen.Set(800,600)
Var obj As CSprite = New CSprite
Var cam As CCamera = New CCamera
Var cam2 As CCamera = New CCamera
cam.InitImage(400,600)
Key.Wait()
cam.Rotate(90)
cam2.InitImage(400,600)
cam2.Rotate(90)
obj.SetMask(0,0,0)
obj.Load("../media/guy.bmp")
Repeat
	Var dt As Float=Screen.GetFrameTime()	
    obj.Move 120*dt*(Key.Down (KEY_W)-Key.Down (KEY_S))
    obj.Rotate 120*dt*(Key.Down (KEY_A)-Key.Down (KEY_D))    
    cam.Move 120*dt*(Key.Down (KEY_T)-Key.Down (KEY_G)),120*dt*(Key.Down (KEY_H)-Key.Down (KEY_F))
    cam2.Move 120*dt*(Key.Down (KEY_I)-Key.Down (KEY_K)),120*dt*(Key.Down (KEY_L)-Key.Down (KEY_J))
	Screen.Color 0,0,0
	cam.DrawTo()
	obj.Draw cam
	cam2.DrawTo()
	obj.Draw cam2
	Screen.SetDrawBuffer(Null)
	cam.Draw 0,0
	cam2.Draw 400,0
	Screen.Color 255,255,255
	Screen.Line(400,0,400,600)
	Screen.Draw()
Forever
Jäin miettimään, että miten tähän saisi sen että molemmat heput olisi samassa pelimaailmassa mutta vain eri koordinaateissa?
Wohoo, kello 5:42 ja vielä hereillä
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
Dande
Active Member
Posts: 193
Joined: Tue Aug 28, 2007 4:30 pm

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dande » Thu Jun 19, 2008 10:33 am

OonSuomesta wrote:
Galgoneer wrote:Kun tänne on näitä objekti-systeemejä alkanut tulla, niin esittelen sitten omanikin.

Jaettu ruutu:

Code: Select all

Screen.Set(800,600)
Var obj As CSprite = New CSprite
Var cam As CCamera = New CCamera
Var cam2 As CCamera = New CCamera
cam.InitImage(400,600)
Key.Wait()
cam.Rotate(90)
cam2.InitImage(400,600)
cam2.Rotate(90)
obj.SetMask(0,0,0)
obj.Load("../media/guy.bmp")
Repeat
	Var dt As Float=Screen.GetFrameTime()	
    obj.Move 120*dt*(Key.Down (KEY_W)-Key.Down (KEY_S))
    obj.Rotate 120*dt*(Key.Down (KEY_A)-Key.Down (KEY_D))    
    cam.Move 120*dt*(Key.Down (KEY_T)-Key.Down (KEY_G)),120*dt*(Key.Down (KEY_H)-Key.Down (KEY_F))
    cam2.Move 120*dt*(Key.Down (KEY_I)-Key.Down (KEY_K)),120*dt*(Key.Down (KEY_L)-Key.Down (KEY_J))
	Screen.Color 0,0,0
	cam.DrawTo()
	obj.Draw cam
	cam2.DrawTo()
	obj.Draw cam2
	Screen.SetDrawBuffer(Null)
	cam.Draw 0,0
	cam2.Draw 400,0
	Screen.Color 255,255,255
	Screen.Line(400,0,400,600)
	Screen.Draw()
Forever
Jäin miettimään, että miten tähän saisi sen että molemmat heput olisi samassa pelimaailmassa mutta vain eri koordinaateissa?
Wohoo, kello 5:42 ja vielä hereillä
Siinähän on vain yksi heppu, joten tottakai molemmista kameroista näkyy vain yksi heppu. Toisen hepun, tai vaikka useammankin saa mukaan seuraavalla koodilla:

Code: Select all

Include "CSprite.chb"
Screen.Set(800,600)
Const Var MAX_UKOT=10
Var obj[MAX_UKOT] As CSprite
For i=0 To MAX_UKOT-1
   obj[i]= New CSprite
   obj[i].SetMask(0,0,0)
   obj[i].Load("../media/guy.bmp")
   obj[i].SetPosition(Random(-100,100),Random(-100,100))
   Var tmpObj As CSprite = obj[i]
   Push tmpObj
Next
Var cam As CCamera = New CCamera
Var cam2 As CCamera = New CCamera
cam.InitImage(400,600)
Key.Wait()
cam.Rotate(90)
cam2.InitImage(400,600)
cam2.Rotate(90)
Var iObj=0
Repeat
   Var dt As Float=Screen.GetFrameTime()   
    obj[iObj].Move 120*dt*(Key.Down (KEY_W)-Key.Down (KEY_S))
    obj[iObj].Rotate 120*dt*(Key.Down (KEY_A)-Key.Down (KEY_D))   
    If Key.Hit(KEY_SPACE) Then
       iObj+=1
       If iObj>MAX_UKOT-1 Then iObj=0
    EndIf
    cam.Move 120*dt*(Key.Down (KEY_T)-Key.Down (KEY_G)),120*dt*(Key.Down (KEY_H)-Key.Down (KEY_F))
    cam2.Move 120*dt*(Key.Down (KEY_I)-Key.Down (KEY_K)),120*dt*(Key.Down (KEY_L)-Key.Down (KEY_J))
   Screen.Color 0,0,0
   cam.DrawTo()
   DrawSprites( cam )
   cam2.DrawTo()
   DrawSprites ( cam2 )
   Screen.SetDrawBuffer(Null)
   cam.Draw 0,0
   cam2.Draw 400,0
   Screen.Color 255,255,255
   Screen.Line(400,0,400,600)
   Screen.Draw()
Forever
Ja taas muuten bugi Dibalolle: ei voi pushata objektia taulukosta, vaan pitää tehdä välimuuttuja tyyliin:

Code: Select all

Var tmpObj As CSprite = obj[i]
Push tmpObj
Koska jos yrittää Push obj, niin kääntäjä rupeaa valittamaan.

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Dibalo » Thu Jun 19, 2008 6:01 pm

StormBringer tekee kaiken paremmaksi, myös tämän.. :lol:
The darkest spells can be found from
http://tunkkaus.blogspot.fi

User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: ChaosBasic 0.1.0.1 (Sledgehammer)

Post by Misthema » Sun Jun 22, 2008 2:42 am

Galgoneer wrote:Ajattelin, että ehkä olisi parempi, jos olisi tarvittaessa mahdollista käyttää useita eri linkitettyjä listoja (mahdollista varastoida yhteen listaan vaikka toisen tason objektit, ja sitten vain nopeasti vaihtaa listaa), joten kysyn tässä samalla, onko tulossa sisäänrakennettua list-tyypiä? Ja kuinkas ne staattiset jäsenfunktiot ja -muuttujat?
Hmm.. Olisiko mahdollista saada tähän sellaista, että kun objekteja linkitetään listaan useampia kuin yksi, niin sitä kokonaista listaa saisi liikuteltua silleen, että sen sisältämät objektit liikkuisi ja pyörisi samassa suhteessa koko ajan?

Olipa sekavaa.. Tarkoitan siis sitä että kun objekteja pushaa listaan, niin se lista on yksi iso kokonainen objekti, jota voi liikutella, eli voit ladata eri "osia"/kuvia, joista sitten kasautuu joku.

Esimerkkiä:

Code: Select all

Var Left_Wing As Plane
Var Right_Wing As Plane
Var The_Plane As Plane

Left_Wing.Position(15,0)
Right_Wing.Position(-15,0)
The_Plane.Position(0,-15)

Push Left_Wing
Push Right_Wing
Push The_Plane

Plane.Move(2)
Ja näin kaikki kolme objektia liikkuisi normaalisti, yhtenä "lentokoneena", ja olisivat toisiinsa nähden koko ajan samassa kohdassa, yhtä kaukana toisistaan.

Post Reply