Page 60 of 154
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 12:20 pm
by Jonhu
Kelli wrote:Jonhu wrote:Miten saisin värjättyä segmentin pinta-alan?
onko mitään sektorin piirtokäskyä, tai voiko tuon alueen merkata jotenkin?
Vaikkapa tällä tavalla :
Code: Select all
Function draw_sector(x1#, y1#, x2#, y2#, x3#, y3#, resolution)
x_dif1# = x1# - x2# : x_dif2# = x2# - x3# : x_dif3# = x3# - x1#
y_dif1# = y1# - y2# : y_dif2# = y2# - y3# : y_dif3# = y3# - y1#
to_x# = x2# : to_y# = y2#
For i=1 To resolution
Line x1#,y1#,to_x#,to_y#
to_x# = to_x# - x_dif2#/resolution
to_y# = to_y# - y_dif2#/resolution
Next i
to_x# = x3# : to_y# = y3#
For i=1 To resolution
Line x2#,y2#,to_x#,to_y#
to_x# = to_x# - x_dif3#/resolution
to_y# = to_y# - y_dif3#/resolution
Next i
to_x# = x1# : to_y# = y1#
For i=1 To resolution
Line x3#,y3#,to_x#,to_y#
to_x# = to_x# - x_dif1#/resolution
to_y# = to_y# - y_dif1#/resolution
Next i
End Function
sinun koodissasi sitten piirrät sektorin vain
draw_sector(550, 350, 550+Sin(360)*150, 350-Cos(360)*150,550+Sin(keskuskulma#)*150, 350-Cos(keskuskulma#)*150, 200)
Sun koodeista muuten oppii todella hyvin noita functioita =)
Tarvisin koko sectorin väritettynä, että voin vähentää kolmion pinta-alan ja saada vain segmentin väritettyä... Tuo on juuri päinvastoin, mutta lähellä oikeaa..
EDIT: Thx
, taidan alkaa opetella functioita urakalla xD (nyt piirtelen 3D pyramideja)
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 12:42 pm
by Kelli
Sitä näköjään sekoittaa asioita melko helposti.
No, tässä nyt varmaankin se mitä tarkoitit:
Code: Select all
Function draw_segment(x1#, y1#, x2#, y2#, x3#, y3#, a#, m#,resolution)
new_a1# = a# : new_a2# = a#
For i=0 To resolution
Line x2#,y2#,x1#+Sin(new_a1#)*m#,y1#-Cos(new_a1#)*m#
new_a1# = new_a1# - a#/resolution
Next i
For i=0 To resolution
Line x3#,y3#,x1#+Sin(new_a2#)*m#,y1#-Cos(new_a2#)*m#
new_a2# = new_a2# - a#/resolution
Next i
End Function
esim:
draw_segment(550, 350,550+Sin(360)*150, 350-Cos(360)*150,550+Sin(keskuskulma#)*150, 350-Cos(keskuskulma#)*150, keskuskulma#, 150,200)
Edit. Isoilla kulmilla alkaa näköjään jo rakoilemaan, mutta tarkkuutta nostamalla hoituu.
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 5:41 pm
by Jonhu
Propleema kellon kanssa... Pitäisi saada tuo viisari heilumaan, ennenkuin pysähtyy haluttuun kohtaan.. Tavoitteena olisi mekaanin kello.. Sain viisarin heilumaan, mutta sitten muu kello katosi, koska käytin drawscreen komentoa for luupin sisällä.. Tossa on nyt koodi karsittuna minun yrityksistäni..
Code: Select all
SCREEN 450,500
Repeat
SetWindow "Kello: "+Time()
Text 100,10,"Date " + Date()
Text 300,10,"Time " + Time()
clock()
DrawScreen
Forever
Function clock()
kulma=0
hour=Int(GetWord(Time(),1,":"))
Minn=Int(GetWord(Time(),2,":"))
secc=Int(GetWord(Time(),3,":"))
For i=0 To 360 Step 30 'silmukoi kokonainen ympyrä
Circle 225+Sin(kulma+i)*150, 250-Cos(kulma+i)*150,5
If i>0 Then
Text 220+Sin(kulma+i)*175, 245-Cos(kulma+i)*175, i/30
EndIf
Next i
For i=0 To 360 Step 6
Dot 225+Sin(kulma+i)*150, 250-Cos(kulma+i)*150
Next i
Line2(225,250,225+Cos(90-minn*6)*145,250-Sin(90-minn*6)*145,2)
Line2(225,250,225+Cos(90-(hour*30)-(minn/2))*125,250-Sin(90-(hour*30)-(minn/2))*125,4)
Color cbred
Line2 (225,250,225+Cos((90-(secc)*6))*150,250-Sin((90-(secc)*6))*150,1)
Color 50,50,50
Smooth2D ON
Circle 220,245,10
Color cbwhite
Smooth2D OFF
EndFunction
Function line2(x#,y#,x2#,y2#,w=1)
xx#=x#
yy#=y#
ang#=GetAngle(xx#,yy#,x2#,y2#)
While Distance(xx#,yy#,x2#,y2#)>1
Circle xx#-w/2,yy#-w/2,w
xx#=xx#+Cos(ang#)
yy#=yy#-Sin(ang#)
Wend
EndFunction
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 7:46 pm
by Metsämies
Miten saa helpoiten tehtyä objekteilla metsää? Kuitenkin tarkotus saada ainakin 5 000-20 000 puuta metsään kaadettavaksi. Ja kuinkas sitten onnistuu niiden piirtäminen vain jos ne on ruudun sisällä?
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 7:53 pm
by Ilmuri
Coolbasic osaa kyllä itse olla piirtämättä ruudun ulkopuolella olevia objekteja.
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 7:55 pm
by KillBurn
Metsämies wrote:Miten saa helpoiten tehtyä objekteilla metsää? Kuitenkin tarkotus saada ainakin 5 000-20 000 puuta metsään kaadettavaksi. Ja kuinkas sitten onnistuu niiden piirtäminen vain jos ne on ruudun sisällä?
Tyypeillä tietty.Teet ensin tyypin puu ja sille astat kentiksi objektin ja vaikka energiat, sitten niiden luonnin yhteydessä arvot puiden paikat.manuaalista saat apua.Tai voin minäkin esimerkkiä antaa jos tarvit.
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 7:58 pm
by Metsämies
Laita vaan jotain esimerkkiä, ei tarvi olla kuin se puujuttu. Mites sitte voin laittaa siihen objectiin jotain tietoa, esim kuutiomäärän joka sitten tulee moton tietokoneeseen?
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 8:01 pm
by valscion
Metsämies wrote:Laita vaan jotain esimerkkiä, ei tarvi olla kuin se puujuttu. Mites sitte voin laittaa siihen objectiin jotain tietoa, esim kuutiomäärän joka sitten tulee moton tietokoneeseen?
Asetat siihen samaan tyyppikokoelmaan vaikkapa Fieldin "kuutiomäärä" ja siitä sitten katsot paljon saat puuta kaadosta
. Siitä saattaa sitten tulla lagista jos 20:tä tuhatta puuta käyt läpi jokaisella looppauskierroksella tarkistaaksesi kaadetaanko puuta, joten tähän pitää sitten keksiä joku muu ratkaisu kuin For...Each.
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 8:17 pm
by KillBurn
tossa jonkinlainen esimerkki puiden käsittelystä
Code: Select all
FrameLimit 40
SCREEN 800,600
Type puut
Field obj
Field hp'paljonko joutuu puuta sahaamaan ennenkö kaatuu
Field id'minkä näköinen puu on
EndType
puu=LoadObject("media\guy.bmp")
puu2=LoadObject("media\ukkeli.bmp")
ShowObject puu,OFF
ShowObject puu2,OFF
saw=LoadObject("media\Crosshair.bmp")
'Tehdään puut'''''''
For i=1 To 100'sata puuta
newpuu.puut= New(puut)
newpuu\id=Rand(1,2)
If newpuu\id=1 Then
newpuu\obj=CloneObject(puu)'puun ulkomuoto
newpuu\hp=100'puun hp
PositionObject newpuu\obj,Rand(-400,400),Rand(-300,300)'arvotaan puun paikka
EndIf
If newpuu\id=2 Then
newpuu\obj=CloneObject(puu2)'puun ulkomuoto
newpuu\hp=150'puun hp
PositionObject newpuu\obj,Rand(-400,400),Rand(-300,300)'arvotaan puun paikka
EndIf
Next i
Repeat
ObjectOrder saw,1'asetetaan saha muiden objektien päälle
PositionObject saw,MouseWX(),MouseWY()
'puiden käsittely''''''''''''''''''''''''''
For ipuu.puut= Each puut
If ObjectsOverlap (saw,ipuu\obj) And MouseDown(1) Then ipuu\hp-10
If ipuu\hp<0 Then 'jos hp loppuu niin poistetaan puu
kaadetut+1
DeleteObject ipuu\obj
Delete ipuu
EndIf
Next ipuu
DrawGame'ettei teksti jää muiden alle
Text 10,10,"puita kaadettu "+kaadetut
DrawScreen
Forever
kannattaa jakaa metsä alueisiin ettei kerralla ihan 20 000 puuta olisi.
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 8:40 pm
by Kelli
Jos todella haluaa 20 000 puuta ruudulle, niin kannattaa tehdä homma kuvilla.
Esim näin:
Code: Select all
SCREEN 1024,768,32
Dim tree_images(10)
For i=0 To 9
tree_images(i) = MakeImage(1024,768)
DrawToImage tree_images(i)
Color 0,255,0
For p=0 To 2000
Circle Rand(1024),Rand(768),4
Next p
Next i
DrawToScreen
puita_hakattu = 0
Repeat
For i=0 To 9
If MouseHit(1)
PickImageColor tree_images(i),MouseX(),MouseY()
vari = getRGB(GREEN)
If vari = 255
DrawToImage tree_images(i)
Color 0,0,0
Circle MouseX()-4,MouseY()-4,8
DrawToScreen
puita_hakattu = puita_hakattu + 1
EndIf
EndIf
DrawImage tree_images(i),0,0
Next i
Color 0,0,0
Box 5,5,170,20
Color 255,255,255
Text 10,10,"Puita hakattu: "+puita_hakattu
DrawScreen
Forever
Tuosta puuttuu vain puita generoidessa tarkistus, ettei luoda puita liian lähekkäin. Kunhan sen lisää, voi kuvien määrää tiputtaa.
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 9:22 pm
by Metsämies
KillBurn wrote:tossa jonkinlainen esimerkki puiden käsittelystä
Code: Select all
FrameLimit 40
SCREEN 800,600
Type puut
Field obj
Field hp'paljonko joutuu puuta sahaamaan ennenkö kaatuu
Field id'minkä näköinen puu on
EndType
puu=LoadObject("media\guy.bmp")
puu2=LoadObject("media\ukkeli.bmp")
ShowObject puu,OFF
ShowObject puu2,OFF
saw=LoadObject("media\Crosshair.bmp")
'Tehdään puut'''''''
For i=1 To 100'sata puuta
newpuu.puut= New(puut)
newpuu\id=Rand(1,2)
If newpuu\id=1 Then
newpuu\obj=CloneObject(puu)'puun ulkomuoto
newpuu\hp=100'puun hp
PositionObject newpuu\obj,Rand(-400,400),Rand(-300,300)'arvotaan puun paikka
EndIf
If newpuu\id=2 Then
newpuu\obj=CloneObject(puu2)'puun ulkomuoto
newpuu\hp=150'puun hp
PositionObject newpuu\obj,Rand(-400,400),Rand(-300,300)'arvotaan puun paikka
EndIf
Next i
Repeat
ObjectOrder saw,1'asetetaan saha muiden objektien päälle
PositionObject saw,MouseWX(),MouseWY()
'puiden käsittely''''''''''''''''''''''''''
For ipuu.puut= Each puut
If ObjectsOverlap (saw,ipuu\obj) And MouseDown(1) Then ipuu\hp-10
If ipuu\hp<0 Then 'jos hp loppuu niin poistetaan puu
kaadetut+1
DeleteObject ipuu\obj
Delete ipuu
EndIf
Next ipuu
DrawGame'ettei teksti jää muiden alle
Text 10,10,"puita kaadettu "+kaadetut
DrawScreen
Forever
kannattaa jakaa metsä alueisiin ettei kerralla ihan 20 000 puuta olisi.
Muuten pelaa ihan hyvin, mutta se piirtää niitä puita vain ruudullisen, ja kun liikkuu vaikka ruudullisen oikealle, niin kas, siellähän ei olekaan puita
Re: Tyhmät kysymykset
Posted: Sun Aug 10, 2008 9:39 pm
by Metsämies
Metsämies wrote:KillBurn wrote:tossa jonkinlainen esimerkki puiden käsittelystä
Code: Select all
FrameLimit 40
SCREEN 800,600
Type puut
Field obj
Field hp'paljonko joutuu puuta sahaamaan ennenkö kaatuu
Field id'minkä näköinen puu on
EndType
puu=LoadObject("media\guy.bmp")
puu2=LoadObject("media\ukkeli.bmp")
ShowObject puu,OFF
ShowObject puu2,OFF
saw=LoadObject("media\Crosshair.bmp")
'Tehdään puut'''''''
For i=1 To 100'sata puuta
newpuu.puut= New(puut)
newpuu\id=Rand(1,2)
If newpuu\id=1 Then
newpuu\obj=CloneObject(puu)'puun ulkomuoto
newpuu\hp=100'puun hp
PositionObject newpuu\obj,Rand(-400,400),Rand(-300,300)'arvotaan puun paikka
EndIf
If newpuu\id=2 Then
newpuu\obj=CloneObject(puu2)'puun ulkomuoto
newpuu\hp=150'puun hp
PositionObject newpuu\obj,Rand(-400,400),Rand(-300,300)'arvotaan puun paikka
EndIf
Next i
Repeat
ObjectOrder saw,1'asetetaan saha muiden objektien päälle
PositionObject saw,MouseWX(),MouseWY()
'puiden käsittely''''''''''''''''''''''''''
For ipuu.puut= Each puut
If ObjectsOverlap (saw,ipuu\obj) And MouseDown(1) Then ipuu\hp-10
If ipuu\hp<0 Then 'jos hp loppuu niin poistetaan puu
kaadetut+1
DeleteObject ipuu\obj
Delete ipuu
EndIf
Next ipuu
DrawGame'ettei teksti jää muiden alle
Text 10,10,"puita kaadettu "+kaadetut
DrawScreen
Forever
kannattaa jakaa metsä alueisiin ettei kerralla ihan 20 000 puuta olisi.
Muuten pelaa ihan hyvin, mutta se piirtää niitä puita vain ruudullisen, ja kun liikkuu vaikka ruudullisen oikealle, niin kas, siellähän ei olekaan puita
Olihan siellä tosiaan ne koordinaatit
Re: Tyhmät kysymykset
Posted: Mon Aug 11, 2008 5:17 pm
by Nassi_Setä
miten vois tehä tämmösen:on 1 vihu joka kattoo 4 suuntaan,sen pitäis liikkuu 4 suuntaan ja se tulee vaikka hiirtä kohden silleen että kun vihu kulkee ylös päin niin näytetään vihun "takakuva" ja kun vaikka kulkee oikeelle niin näytetään vihun "oikeakuva" niin miten voi tehä sen että kun vihu kulkee oikeelle niin se "oikeakuva" näytetään?
Re: Tyhmät kysymykset
Posted: Mon Aug 11, 2008 6:01 pm
by koodaaja
Kuulostaa yläviistosta kuvatulta. Siihen kuvat ovat omiaan, mutta se menee monimutkaiseksi. Tilekartat lienevät paras ratkaisu, toki oma formaatti ja piirtofunkkari ovat pakollisia. Koska yläviistossa pitää ottaa kolme ulottuvuutta huomioon. Isometrinen on hyvin vastaavanlaista.
Mutta vastauksena kysymykseen: lataat kuvat joka suuntaan ja tallennat viimeisen suunnan aina kun jotain liikkumisnamiskaa painetaan ( itse olen monasti käyttänyt 0 = oikealle, 1 = alas, 2 = vasemmalle, 3 = ylös -tekniikkaa, kulmien kanssa työskentely helpottuu ) sitten piirrät sitä vastaavan kuvan.
Koordinaateista sen verran, että perus 45-asteen yläkuvakulmassa ukko liikkuu näytön syvyyssuunnassa puolet siitä, mitä leveyssuunnassa, ja isometrisessä liikutaan alas painettaessa sekä x- että y-akseleilla.
Ja kun en kuitenkaan selittänyt tarpeeksi hyvin, niin kysy tarkennuksia (ja mahd. selitä ongelmaa lisää :p)
Re: Tyhmät kysymykset
Posted: Mon Aug 11, 2008 7:28 pm
by pelzti
Miten voin tallentaa objectien paikat ja ladata ne? Entä onko muutujien tallennukseen muuta vaihtoehtoa kuin load- ja saveprogram?
Re: Tyhmät kysymykset
Posted: Mon Aug 11, 2008 7:34 pm
by Jonhu
En haluaisi käyttää copypaste tyyliä ohjelmissani, mutta en millään keksi miten saisin tämän koodin toimimaan kahdella eri ukolla...
Pitäisi saada tuon maara\obj lisäksi toimimaan maara\obj2:sella, jolloin voisin luoda helposti useita erillaisia ukkoja peliini..
EDIT: Mutta tarvisin myös erillaiset liikkeet sille vihulle....
Re: Tyhmät kysymykset
Posted: Mon Aug 11, 2008 7:41 pm
by koodaaja
Load- ja saveprogram ovat se viimeinen vaihtoehto tallentamiseen. Eli CB:ssä käytetään yleensä ihan .txt -tiedostoja, toki voit vaihtaa päätteen miksi ikinä haluat. Eivät ole niin virhealttiita ja voit tallentaa vain tarpeellisen. Hieman suunnittelua ne tosin vaativat - eli mikä tallennetaan ja miten tallennetaan. Mutta helppoa sekin on, kun hetken pohtii. Pistetäänpäs esimerkkikoodia, joka tallentaa objektin koordinaatit ja lataa ne.
Code: Select all
guy = LoadObject("Media\guy.bmp", 72)
Repeat
MoveObject guy, UpKey()-DownKey()
TurnObject guy, LeftKey()-RightKey()
If KeyHit( cbkeyf1 ) Then 'tallennetaan
file = OpenToEdit("save.txt") 'avataan tiedosto
xpos = ObjectX(guy)'tallennetaan arvot muuttujiin - ei pakollista, selkeyden vuoksi tässä
ypos = ObjectY(guy)
angle# = ObjectAngle(guy)
WriteInt file, xpos'kirjoitetaan tiedostoon
WriteInt file, ypos
WriteFloat file, angle
CloseFile file'suljetaan tiedosto
EndIf
If KeyHit( cbkeyf2 ) Then'ladataan
file = OpenToEdit("save.txt")'avataan
xpos = ReadInt(file) 'luetaan tiedostosta
ypos = ReadInt(file)
angle# = ReadFloat(file)
PositionObject guy, xpos, ypos 'asetetaan ukko paikalleen
RotateObject guy, angle
CloseFile file 'suljetaan tiedosto
EndIf
DrawScreen
Forever
EDIT: Jonhu. Mitä kummaa? Voithan vain ladata eri ukoille erinäköisen kuvan ja laittaa tyyppiin fieldin, joka kertoo millainen ukko on kyseessä.
Re: Tyhmät kysymykset
Posted: Tue Aug 12, 2008 5:59 pm
by MikkoK
Laitanpas tämän nyt tännekkin: Eli siis tutkiskelin tätä cb:n manuaalia ja löysin vihollisesimerkin ja nyt haluaisin lisätä siihen vihollisten poiston hiirenklikkauksesta. Eli jos hiiri on vihollisen päällä ja painetaan hiiren vasenta nappia vihollinen poistuu. Ennen en ole taulukoiden kanssa työskennellyt mutta nyt sain päähäni opetella niitä.
Koodi:
Code: Select all
Dim enemy_x#(100)
Dim enemy_y#(100)
Dim enemy_plusx(100) As Float,enemy_plusy(100) As Float
Dim i As Integer
Dim angle As Integer
'First apply a random position for all enemies
For i=1 To 100
enemy_x(i)=Rand(390)
enemy_y(i)=Rand(290)
angle=Rand(360)
enemy_plusx(i)=Cos(angle)
enemy_plusy(i)=Sin(angle)
Next i
Color 0,255,0
'The main loop
Repeat
'update all enemies
For i=1 To 100
'draw
Box enemy_x(i),enemy_y(i),10,10,OFF
'move
enemy_x(i)=enemy_x(i)+enemy_plusx(i)
enemy_y(i)=enemy_y(i)+enemy_plusy(i)
'bounce
If enemy_x(i)<0 Or enemy_x(i)>390 Then enemy_plusx(i)= -enemy_plusx(i)
If enemy_y(i)<0 Or enemy_y(i)>290 Then enemy_plusy(i)= -enemy_plusy(i)
Next i
DrawScreen
Until EscapeKey()
Re: Tyhmät kysymykset
Posted: Tue Aug 12, 2008 7:04 pm
by Substance
Tässä
Code: Select all
Dim enemy_elossa(100)'pistetää elossa taulukko
Dim enemy_x#(100)
Dim enemy_y#(100)
Dim enemy_plusx(100) As Float,enemy_plusy(100) As Float
Dim i As Integer
Dim angle As Integer
'First apply a random position for all enemies
For i=1 To 100
enemy_x(i)=Rand(390)
enemy_y(i)=Rand(290)
angle=Rand(360)
enemy_plusx(i)=Cos(angle)
enemy_plusy(i)=Sin(angle)
enemy_elossa(i)=1 'enemy on elossa
Next i
Color 0,255,0
'The main loop
Repeat
'update all enemies
For i=1 To 100
If enemy_elossa(i)=1 Then 'tarkistetaan onko enemy elossa
'draw
Box enemy_x(i),enemy_y(i),10,10,OFF
'move
enemy_x(i)=enemy_x(i)+enemy_plusx(i)
enemy_y(i)=enemy_y(i)+enemy_plusy(i)
'bounce
If enemy_x(i)<0 Or enemy_x(i)>390 Then enemy_plusx(i)= -enemy_plusx(i)
If enemy_y(i)<0 Or enemy_y(i)>290 Then enemy_plusy(i)= -enemy_plusy(i)
'tarkistetaan onko hiiri enemyn päällä
If MouseX()>enemy_x(i) And MouseX()<enemy_x(i)+10 And MouseY()>enemy_y(i) And MouseY()<enemy_y(i)+10 Then
If MouseHit(1) Then enemy_elossa(i)=0 'tarkistetaan klikataanko
EndIf
EndIf
Next i
DrawScreen
Until EscapeKey()
Re: Tyhmät kysymykset
Posted: Tue Aug 12, 2008 9:15 pm
by Sepi
Onko cb:llä mahdollista tehdä MakeErrorin tyylistä "erroria", joka ei kuitenkaan sulje ohjelmaa?