Okei. Kiitoksia.bool cppNerd=!false; wrote:Tällä tavalla:
Yksiköiden valinnan teko riippuu siitä miten olet ne tehnyt. Tuskin kuitenkaan on liian hankalaa käydä kaikki yksiköt läpi ja katsoa, mitkä niistä ovat laatikon sisällä, kun hiirennappi nostetaan, eli esimerkkini rivien 14 ja 16 sisällä.Code: Select all
Dim bx1,by1,bx2,by2,check,nbx1,nby1,nbx2,nby2 Repeat // muuta koodia... If check = 0 Then If MouseDown(1) Then check = 1 bx1 = MouseX() by1 = MouseY() End If ElseIf check = 1 Then If MouseDown(1) = 0 Then check = 0 Else bx2 = MouseX() by2 = MouseY() nbx1 = bx1 nby1 = by1 nbx2 = bx2 nby2 = by2 If bx1 > bx2 Then nbx1 = nbx1 + nbx2 nbx2 = nbx1 - nbx2 nbx1 = nbx1 - nbx2 End If If by1 > by2 Then nby1 = nby1 + nby2 nby2 = nby1 - nby2 nby1 = nby1 - nby2 End If Box nbx1,nby1,nbx2-nbx1,nby2-nby1,0 End If End If DrawScreen Forever
Tyhmät kysymykset (I/2009)
Re: Tyhmät kysymykset
Re: Tyhmät kysymykset
Äh, tuli nyt vielä tälläinen probleema että laitetaanko ukkojen valinta noilla nbx-jutuilla sitten näin? Ainakaan se ei toimi...Eräs Vierailija wrote:Okei. Kiitoksia.bool cppNerd=!false; wrote:Tällä tavalla:
Yksiköiden valinnan teko riippuu siitä miten olet ne tehnyt. Tuskin kuitenkaan on liian hankalaa käydä kaikki yksiköt läpi ja katsoa, mitkä niistä ovat laatikon sisällä, kun hiirennappi nostetaan, eli esimerkkini rivien 14 ja 16 sisällä.Code: Select all
Code: Select all
If ObjectX(solttu\obj)<nbx2 And ObjectX(solttu\obj)>nbx2-nbx1 And ObjectY(solttu\obj)<nby2 And ObjectY(solttu\obj)>nby2-nby1 Then
solttu\valittu=1
EndIf
-
- Active Member
- Posts: 135
- Joined: Fri Mar 07, 2008 8:49 pm
Re: Tyhmät kysymykset
Pienempi kuin ja suurempi kuin -operaattorit taitavat olla väärin päin. Muutenkin tulisi ongelmaa, koska objekteja käsitellään maailmakoordinaattien mukaan, mutta näyttämäni valintalaatikko toimii näyttökoordinaattien mukaan. Voin tehdä muutoksen, kun ehdin.
Re: Tyhmät kysymykset
Juu, olisin todella kiitollinen tuosta avusta. Korjasin nuo <:t ja >:t nyt oikein päin.bool cppNerd=!false; wrote:Pienempi kuin ja suurempi kuin -operaattorit taitavat olla väärin päin. Muutenkin tulisi ongelmaa, koska objekteja käsitellään maailmakoordinaattien mukaan, mutta näyttämäni valintalaatikko toimii näyttökoordinaattien mukaan. Voin tehdä muutoksen, kun ehdin.
-
- Active Member
- Posts: 135
- Joined: Fri Mar 07, 2008 8:49 pm
Re: Tyhmät kysymykset
Tässä on lupaamani versio.
Tein muutoksia vain riveille 12, 13, 19, 20, 33 ja 39 ja niihinkin lisäilin tai vaihdoin yksittäisiä merkkejä.
Code: Select all
Dim bx1,by1,bx2,by2,check,nbx1,nby1,nbx2,nby2
Repeat
DrawToWorld 1
// muuta koodia...
If check = 0 Then
If MouseDown(1) Then
check = 1
bx1 = MouseWX()
by1 = MouseWY()
End If
ElseIf check = 1 Then
If MouseDown(1) = 0 Then
check = 0
Else
bx2 = MouseWX()
by2 = MouseWY()
nbx1 = bx1
nby1 = by1
nbx2 = bx2
nby2 = by2
If bx1 > bx2 Then
nbx1 = nbx1 + nbx2
nbx2 = nbx1 - nbx2
nbx1 = nbx1 - nbx2
End If
If by1 < by2 Then
nby1 = nby1 + nby2
nby2 = nby1 - nby2
nby1 = nby1 - nby2
End If
Box nbx1,nby1,nbx2-nbx1,-nby2+nby1,0
End If
End If
DrawScreen
Forever
Re: Tyhmät kysymykset
ONGELMA RATKAISTU
Last edited by DatsuniG on Tue Sep 09, 2008 5:10 pm, edited 3 times in total.
Hengität nyt manuaalisesti.
-
- Advanced Member
- Posts: 349
- Joined: Mon Aug 27, 2007 9:00 pm
- Location: Lapinjärvi, Finland
- Contact:
Re: Tyhmät kysymykset
Noo joko teit sen jotenkin väärin tai sitten sinulla on liikaa törmääviä objekteja. CoolBasic kun ei tunnetusti ole niin hirveän nopea. Siis tuo törmäysten asettaminen tulee tehdä vain kerran, ei loopissa.nyt sattu juhaa leukaan wrote:
Koodi toimi vai loopin sisälle laitettuna, jolloin peli hidastui diashowksi.(siis omaan peliin sovellettuna^^)
Siis näin
Code: Select all
SCREEN 1024,768
Type vihu
Field obj
End Type
mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF
For i=1 To 30
v.vihu=New(vihu)
v\obj=CloneObject(mastervihu)
Next i
//tässä asetetaan törmäykset kaikille äsken luoduille vihuille
For v.vihu=Each vihu //Käydään lista läpi
vv.vihu=First(vihu) // otetaan vv muuttujaan ensimmäisen vihun osoitin
vv=After(v) // vaihdetaan se niin että se on v muuttujan jälkeisen vihun osoitin
While vv<>NULL //jatketaan kunnes vv on käynyt listan läpi
SetupCollision vv\obj,v\obj,2,2,2//asetetaan törmäykset
SetupCollision v\obj,vv\obj,2,2,2
vv=After(vv) //vaihdetaan taas vv muuttujaa siten että siinä on seuraavan vihun osoitin
Wend
Next v
//Eli jos ajatellaan että vihuja on 3
// tällöin vihujen lista on 1 2 3
//siis ensin asetetaan törmäys 1 ja 2 välillä sitten 1 ja kolmosen välillä
// sitten vasta siirrytään kakkosen ja asetataan törmäys sen ja kolmosen välille
//tällöin säästetään hieman resursseja
DrawToWorld ON
Repeat
Circle -200,200,400,0
For v.vihu=Each vihu
MoveObject v\obj,3
If Rand(20)=5 Then TurnObject v\obj,Rand(-60,60)
If Distance(ObjectX(v\obj),ObjectY(v\obj),0,0)>200 Then RotateObject v\obj,GetAngle(ObjectX(v\obj),-ObjectY(v\obj),0,0)
Next v
DrawScreen
Forever
Code: Select all
SCREEN 1024,768
Type vihu
Field obj
End Type
mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF
For i=1 To 30
v.vihu=New(vihu)
v\obj=CloneObject(mastervihu)
Next i
DrawToWorld ON
Repeat
//tässä asetetaan törmäykset kaikille äsken luoduille vihuille
For v.vihu=Each vihu //Käydään lista läpi
vv.vihu=First(vihu) // otetaan vv muuttujaan ensimmäisen vihun osoitin
vv=After(v) // vaihdetaan se niin että se on v muuttujan jälkeisen vihun osoitin
While vv<>NULL //jatketaan kunnes vv on käynyt listan läpi
SetupCollision vv\obj,v\obj,2,2,2//asetetaan törmäykset
SetupCollision v\obj,vv\obj,2,2,2
vv=After(vv) //vaihdetaan taas vv muuttujaa siten että siinä on seuraavan vihun osoitin
Wend
Next v
//Eli jos ajatellaan että vihuja on 3
// tällöin vihujen lista on 1 2 3
//siis ensin asetetaan törmäys 1 ja 2 välillä sitten 1 ja kolmosen välillä
// sitten vasta siirrytään kakkosen ja asetataan törmäys sen ja kolmosen välille
//tällöin säästetään hieman resursseja
Circle -200,200,400,0
For v.vihu=Each vihu
MoveObject v\obj,3
If Rand(20)=5 Then TurnObject v\obj,Rand(-60,60)
If Distance(ObjectX(v\obj),ObjectY(v\obj),0,0)>200 Then RotateObject v\obj,GetAngle(ObjectX(v\obj),-ObjectY(v\obj),0,0)
Next v
DrawScreen
Forever
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
Runoblogi, vuodatusta ja sekoiluja.
Re: Tyhmät kysymykset
Tajusin vihdoin mikä mättää. Vihuja luodaan loopissa kokoajan uusia, jolloin törmäys pätee vain kun sen laittaa loopin sisälle!nyt sattu juhaa leukaan wrote:
Koodi toimi vai loopin sisälle laitettuna, jolloin peli hidastui diashowksi.(siis omaan peliin sovellettuna^^)
Noo joko teit sen jotenkin väärin tai sitten sinulla on liikaa törmääviä objekteja. CoolBasic kun ei tunnetusti ole niin hirveän nopea. Siis tuo törmäysten asettaminen tulee tehdä vain kerran, ei loopissa.
Siis näin
Code: Select all
SCREEN 1024,768
Type vihu
Field obj
End Type
mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF
For i=1 To 30
v.vihu=New(vihu)
v\obj=CloneObject(mastervihu)
Next i
//tässä asetetaan törmäykset kaikille äsken luoduille vihuille
For v.vihu=Each vihu //Käydään lista läpi
vv.vihu=First(vihu) // otetaan vv muuttujaan ensimmäisen vihun osoitin
vv=After(v) // vaihdetaan se niin että se on v muuttujan jälkeisen vihun osoitin
While vv<>NULL //jatketaan kunnes vv on käynyt listan läpi
SetupCollision vv\obj,v\obj,2,2,2//asetetaan törmäykset
SetupCollision v\obj,vv\obj,2,2,2
vv=After(vv) //vaihdetaan taas vv muuttujaa siten että siinä on seuraavan vihun osoitin
Wend
Next v
//Eli jos ajatellaan että vihuja on 3
// tällöin vihujen lista on 1 2 3
//siis ensin asetetaan törmäys 1 ja 2 välillä sitten 1 ja kolmosen välillä
// sitten vasta siirrytään kakkosen ja asetataan törmäys sen ja kolmosen välille
//tällöin säästetään hieman resursseja
DrawToWorld ON
Repeat
Circle -200,200,400,0
For v.vihu=Each vihu
MoveObject v\obj,3
If Rand(20)=5 Then TurnObject v\obj,Rand(-60,60)
If Distance(ObjectX(v\obj),ObjectY(v\obj),0,0)>200 Then RotateObject v\obj,GetAngle(ObjectX(v\obj),-ObjectY(v\obj),0,0)
Next v
DrawScreen
Forever
Eikä näin
Code: Select all
SCREEN 1024,768
Type vihu
Field obj
End Type
mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF
For i=1 To 30
v.vihu=New(vihu)
v\obj=CloneObject(mastervihu)
Next i
DrawToWorld ON
oman koodin ongelmapätkä
Code: Select all
Type VIHU
Field obj
Field health
End Type
mvihu=LoadObject("Media\zombi.bmp",360)
ShowObject mvihu,OFF
uus = 30
ukko = LoadObject("media\soldier.bmp",360)
PositionObject ukko,0,200
aim=LoadObject("Media\crosshair.bmp")
repeat
PositionObject aim,MouseWX(),MouseWY()
PointObject ukko, aim
If KeyDown(cbkeyw) Then MoveObject ukko, 3
If KeyDown(cbkeys) Then MoveObject ukko, -3
If KeyDown(cbkeyd) Then MoveObject ukko, 0, 3
If KeyDown(cbkeya) Then MoveObject ukko, 0, -3
If ObjectX(ukko)<-500 Then PositionObject ukko,-500,ObjectY(ukko)
If ObjectX(ukko)>500 Then PositionObject ukko,500,ObjectY(ukko)
If ObjectY(ukko)<-400 Then PositionObject ukko,ObjectX(ukko),-400
If ObjectY(ukko)>400 Then PositionObject ukko,ObjectX(ukko),400
If uus=0 Then
v.VIHU = New (VIHU)
v\obj = CloneObject (mvihu)
uus = 30
v\health = 2
ScreenPositionObject v\obj,Rand(ScreenHeight()),Rand(ScreenWidth())
EndIf
uus = uus-1
forever
Re: Tyhmät kysymykset
Sain tehtyä jonkinlaisen ristinollapelin, mutta huomasin, että hyvän tekoälyn kehittäminen on todella monimutkaista. Joten päätin aloittaa neljänsuoralla, mutta tuli pieni pulma.. Pitäisi saada tämä koodi toimimaan, että ympyröiden värit säilyisivät oikein (muutakin hienosäätöä vielä puuttuu).
Code: Select all
SCREEN 800,600
FrameLimit 40 'rajoita nopeutta
alku:
Dim ruudukko(100,100)
Const ympkoko=60
ClsColor cbblack
turn_mem=1
Repeat
turn=turn_mem
For x=0 To 10
For y=0 To 7
Color cbwhite
If ruudukko(x,y)=0 Then
Circle 12+x*65+ympkoko/2,12+y*65+ympkoko/2,ympkoko
Box 10+x*65+ympkoko/2,10+y*65+ympkoko/2,65,65,0
ElseIf ruudukko(x,y)=1 Then
Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
Color cbblue
Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
ElseIf ruudukko(x,y)=2 Then
Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
Color cbred
Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
EndIf
If MouseX()>40+(x)*65 And MouseX()<40+(x)*65+65 Then
'If BoxOverlap(MouseX(),MouseY(),1,1,40+(x)*65,1,1000,65) Then
If turn=1
Color cbblue
Else
Color cbred
EndIf
Circle 40+(x)*65,12+(x),65
If MouseUp(1) Then
a=7
While a>0
If ruudukko(x,(a-y))=0 Then
If turn=1 'And ruudukko(x,(a-y))=0 Then
ruudukko(x,a)=1
turn_mem=2
Exit
ElseIf turn=2 Then
ruudukko(x,a)=2
turn_mem=1
Exit
EndIf
Else
a=a-1
EndIf
Wend
EndIf
EndIf
Next y
Next x
DrawScreen
Forever
Re: Tyhmät kysymykset
Terve,
Saako tiedostosta luetun ja ruudulle tulostetun tekstin pysymään jotenkin vaikka jos laittaa loopin ja drawscreenin??
Tällain
ku tekee ja sitte pistää drawscreenin ni teksti katoaa.
Saako tiedostosta luetun ja ruudulle tulostetun tekstin pysymään jotenkin vaikka jos laittaa loopin ja drawscreenin??
Tällain
Code: Select all
While Not EOF(f)
Text 0,textline,ReadLine(f)
textline=textline+12
Wend
-
- Active Member
- Posts: 135
- Joined: Fri Mar 07, 2008 8:49 pm
Re: Tyhmät kysymykset
Laita näin.
Code: Select all
While Not EOF(f)
AddText ReadLine(f)
DrawScreen
Wend
Re: Tyhmät kysymykset
bool cppNerd=!false; wrote:Laita näin.
Code: Select all
While Not EOF(f) AddText ReadLine(f) DrawScreen Wend
Kiitos paljon, toimii
Ajatuksenani oli yrittää saada luotua vähän nethack tyyliseen peliin kartat suoraan notepadilla
Mutta ei taida taidot riittää, ongelmaksi muodostuu nyt törmäykset... eli jos vaikka # on puu niin miten voi tietää missä kaikkialla # on jotta voisi estää hahmoa liikkumasta siihen kohtaan... vaikeaa.
Re: Tyhmät kysymykset
Miten on mahdollista saada vihuja spawnaamaan randomilla tiettyyn paikkaan?
näinkö? tai yms...?
näinkö? tai yms...?
Code: Select all
If uus=0 Then
v.VIHU = New (VIHU)
v\obj = CloneObject (mvihu)
uus = 25
PositionObject v\obj,Rand 100-200,Rand 100-200
-
- Active Member
- Posts: 135
- Joined: Fri Mar 07, 2008 8:49 pm
Re: Tyhmät kysymykset
EDIT:
Katso CBSDK:sta SpawnObject. Jos sinulla ei ole sitä, tässä on linkki
Re: Tyhmät kysymykset
eli näin...?
Code: Select all
If uus=0 Then
v.VIHU = New (VIHU)
v\obj = CloneObject (mvihu)
uus = 25
SetupCollision v\obj,kartta,1,4,2
SetupCollision kartta,v\obj,1,4,2
Function SpawnObject(v\obj)
// Loopataan niin kauan että sopiva paikka kartalta löytyy.
While True
// Ensin arvotaan x ja y.
x = Rand(1, MapWidth())
y = Rand(1, MapHeight())
// Tutkitaan back- ja hit-kerosten tilet arvotusta paikasta.
tBack = GetMap2(0, x, y)
tHit = GetMap2(2, x, y)
// back-kerroksessa pitää olla jotain mutta hit-kerroksessa ei saa olla mitään.
If tBack > 0 And tHit = 0 Then
// Jos ehto täyttyi niin sijoitetaan objekti kartalle
ObjectToMap (v\obj, x, y)
// Sopiva paikka löytyi joten homma on sillä selvä ja voidaan poistua.
Exit
EndIf
Wend
EndFunction
-
- Active Member
- Posts: 135
- Joined: Fri Mar 07, 2008 8:49 pm
Re: Tyhmät kysymykset
Mukana täytyisi olla myös ObjectToMap-funktio, minkä huomasin vasta jälkeenpäin. Lataa SDK ja käytä sitä.
Funktioiden parametreihin ei saa koskea, kutsu SpawnObject(v\obj). Älä kirjoita sille riville muuta kuin kommentteja.
Funktioiden parametreihin ei saa koskea, kutsu SpawnObject(v\obj). Älä kirjoita sille riville muuta kuin kommentteja.
Re: Tyhmät kysymykset
latasin(ja asensin)skd:n ja net frameworkin, muttei toimi. en tiedä miksi. "ObjectToMap can't be uset like this" "object requered"
-
- Active Member
- Posts: 135
- Joined: Fri Mar 07, 2008 8:49 pm
Re: Tyhmät kysymykset
Kuinka yrität käyttää funktiota? Onko mahdollista, että parametrit ovat vääränlaisia? Lähetä koodisi tänne.