Strategiapeli
Strategiapeli
Olen yrittänyt väsätä jonkinlaista ylhäältä kuvattua strategiapeliä/resunkeräys/sotapeliä(jotain warcraft 2/starcraft suuntaan), mutta "proju" on kaatunut pariin ongelmaan; jos käytetään tilekarttoja, miten voin "laittaa työläisen rankentamaan rakennusta", joka tuli tilejen mukaan kartalle haluttuun kohtaan (rakennuksen koko esim 2x3 tileä).
Voisiko joku laittaa toimivan esimerkin tyyliin; painaa nappia, jolloin "rakennuksen" saa halutulle tilelle?
Voisiko joku laittaa toimivan esimerkin tyyliin; painaa nappia, jolloin "rakennuksen" saa halutulle tilelle?
Re: Strategiapeli
Mieluummin teet sen laittamalla objekteja tiettyihin paikkoihin. Kartan muokkaaminen lennosta tuommoista varten on turhan hankalaa.
Re: Strategiapeli
jaa...Eihän karttaa tarvitse muuttaa jos sen päälle vain laitetaan objecti...?
no, jos joku sattuisi tietämään miten voi valita hiirella useampia yksiköitä "vetämällä boxin niiden ympärille"(vetämällä hiirellä laatikon, jonka sisälle jääneet yksiköt otetaan valituiksi)?
no, jos joku sattuisi tietämään miten voi valita hiirella useampia yksiköitä "vetämällä boxin niiden ympärille"(vetämällä hiirellä laatikon, jonka sisälle jääneet yksiköt otetaan valituiksi)?
Re: Strategiapeli
Kyllä.
Lainaus cb:n manuaalista:
Lainaus cb:n manuaalista:
Katso loput CB:n manuaalista.Manuaali wrote:CAMERAPICK
KUVAUS
Tällä komennolla voit poimia pelikentältä objekteja esimerkiksi hiiren avulla samaan tapaan kuin strategiapeleissä valitaan hiirellä yksikkö, jota hallitaan. Komentoa on tarkoitettu käytettäväksi yhden kerran ennen varsinaista valitun objektin tutkiskelua. Poimitun objektin saat selville funktiolla PickedObject.
EDIT:
Ah niin, ei ole suoraan komentoa, jolla tuon voisi tehdä; Sen sijaan anna jokaiselle hahmolle kenttä, joka kertoo, onko se valittu. Sitten tarkasta kaikki objektit laatikon sisältä. Oletan, että tajusit?
Re: Strategiapeli
Tai tarkistat hiiren painamisen loputtua, minkä kaikkien sotilaiden koordinaatit ovat neliön sisällä ja valitset ne. Keinoja löytyy, purkka käyttöön !
Ratkaisit juuri universaaliongelman! Hienoa, ota keksi.
Filosofia on ajattelun taidetta, mutta sen maalari elää juoden apurahojaan masennukseensa.
Filosofia on ajattelun taidetta, mutta sen maalari elää juoden apurahojaan masennukseensa.
Re: Strategiapeli
Jos muokaat kartaa niin selviät kamalista törmäys sähläyksistä. Objectien törmäys ei aina toimi kunnolla(ainakaan mulla).
Siis semmoinen "sinun ohjattava objecti --> joku talo"-törmäys.
Siis semmoinen "sinun ohjattava objecti --> joku talo"-törmäys.
Re: Strategiapeli
tarkoitin että miten tarkistetaan yksiköt jotka ovat laatikon sisälläesa94 wrote:Kyllä.
Lainaus cb:n manuaalista:
Katso loput CB:n manuaalista.Manuaali wrote:CAMERAPICK
KUVAUS
Tällä komennolla voit poimia pelikentältä objekteja esimerkiksi hiiren avulla samaan tapaan kuin strategiapeleissä valitaan hiirellä yksikkö, jota hallitaan. Komentoa on tarkoitettu käytettäväksi yhden kerran ennen varsinaista valitun objektin tutkiskelua. Poimitun objektin saat selville funktiolla PickedObject.
EDIT:Ah niin, ei ole suoraan komentoa, jolla tuon voisi tehdä; Sen sijaan anna jokaiselle hahmolle kenttä, joka kertoo, onko se valittu. Sitten tarkasta kaikki objektit laatikon sisältä. Oletan, että tajusit?
Re: Strategiapeli
Lisäys(en ole rekisteröitynyt):kun teen pelissäni rakennuksia, miten saan koulutettavat yksiköt(niiden valmistuessa)ilmestymään rakennuksen ympärille, ja miten saan tehtyä niin, ettei rakennuksia voi tehdä toistensa päälle?
Re: Strategiapeli
Olettakaamme, että käytät nyt niitä objekteja. Tässä tapauksessa molemmat hommat hoituvat helposti komennolla Objectsoverlap (http://www.coolbasic.com/cbmanual/comma ... erlap.html), joka tarkistaa ovatko annetut objektit mitenkään kosketuksissa toisiinsa.finnish noob wrote:Lisäys(en ole rekisteröitynyt):kun teen pelissäni rakennuksia, miten saan koulutettavat yksiköt(niiden valmistuessa)ilmestymään rakennuksen ympärille, ja miten saan tehtyä niin, ettei rakennuksia voi tehdä toistensa päälle?
Yksiköiden lisääminen rakennuksen ympärille onnistuu hakemalla ennen yksikön koordinaattien määrittelyä rakennuksen x ja y-koordinaatit komennoilla ObjectX() ja ObjectY(). Sitten pläräät luupissa mahdollisia paikkoja rakennuksen lähistöllä ja poistut luupista kun yksikkö ei ole kosketuksissa toisen yksikön tai rakennuksen kanssa (ks. Objectsoverlap).
Rakennus <-> Rakennus-törmäystarkistus hoituu samalla komennolla, eli sallit rakennuksen lisäämisen vasta kun se ei ole kosketuksissa minkään muun rakennuksen kanssa.
Re: Strategiapeli
Tarkista laatikon alku- ja loppupisteiden + objektien sijainnin perusteella näin:finnish noob wrote:tarkoitin että miten tarkistetaan yksiköt jotka ovat laatikon sisällä
Code: Select all
If ObjectX(valittava_objekti)> laatikkox And ObjectX(valittava_objekti)<laatikkox+laatikkoleveys And ObjectY(valittava_objekti)< laatikkoy And ObjectY(valittava_objekti)>laatikkoy+laatikkokorkeus Then
objekti_valittu=1
EndIf
CoolBasic henkilökuntaa
Graafikko
Graafikko
Re: Strategiapeli
äh...olen yrittänyt, mutta en saa tuota toimimaan...saisiko jonkinnäköisen toimivan esimerkin?Pate5 wrote:Tarkista laatikon alku- ja loppupisteiden + objektien sijainnin perusteella näin:finnish noob wrote:tarkoitin että miten tarkistetaan yksiköt jotka ovat laatikon sisällä
Laatikkox ja laatikkoy kuvaavat laatikon alkupistettä. Laatikkoleveys ja laatikkokorkeus taas kuvaavat laatikon leveyttä ja korkeutta. Katso myös MouseWX(), MouseWY() ja DrawToWorld.Code: Select all
If ObjectX(valittava_objekti)> laatikkox And ObjectX(valittava_objekti)<laatikkox+laatikkoleveys And ObjectY(valittava_objekti)< laatikkoy And ObjectY(valittava_objekti)>laatikkoy+laatikkokorkeus Then objekti_valittu=1 EndIf
-
- Active Member
- Posts: 163
- Joined: Fri Aug 31, 2007 7:07 pm
- Location: Helsinki
- Contact:
Re: Strategiapeli
Tässä, muistaakseni Zeron joskus tekemä esimerkki:
Vasen hiiri valitsee ukkeleita (vetämällä useita), oikea liikkuu/hyökkää.
Vasen hiiri valitsee ukkeleita (vetämällä useita), oikea liikkuu/hyökkää.
Code: Select all
FrameLimit 40
DrawToWorld ON
ukkomaara=6
Dim ukko(ukkomaara)
Dim ukko_valittu(ukkomaara)
Dim ukon_hyökkäys(ukkomaara)
Dim ukon_liikkuminen(ukkomaara)
Global maailmax
Global maailmay
For i=0 To ukkomaara
ukko(i)=LoadObject("media/guy.bmp",72)
PositionObject ukko(i), Rand(-30,-150),Rand(-100,100)
ObjectPickable ukko(i),2
Next i
w=1
vihu=LoadObject("media/soldier.bmp",72)
PositionObject vihu, Rand(200,100),Rand(-100,100)
ObjectPickable vihu,2
o=MakeObject()
o2=MakeObject()
o3=MakeObject()
o4=MakeObject()
menomerkki=LoadObject("media/target.bmp",72)
mouse=LoadImage("media/mouse.bmp")
attack=LoadImage("media/ship.bmp")
väri=255
ShowObject menomerkki, ON
PositionObject menomerkki, 99999,99999
'asetetaan äijille keskenään törmäyksentunnistus
SetupCollision ukko(0),ukko(1),2,2,2 : SetupCollision ukko(0),ukko(2),2,2,2 : SetupCollision ukko(0),ukko(3),2,2,2 : SetupCollision ukko(0),ukko(4),2,2,2
SetupCollision ukko(1),ukko(0),2,2,2 : SetupCollision ukko(1),ukko(2),2,2,2 : SetupCollision ukko(1),ukko(3),2,2,2 : SetupCollision ukko(1),ukko(4),2,2,2
SetupCollision ukko(2),ukko(1),2,2,2 : SetupCollision ukko(2),ukko(0),2,2,2 : SetupCollision ukko(2),ukko(3),2,2,2 : SetupCollision ukko(2),ukko(4),2,2,2
SetupCollision ukko(3),ukko(1),2,2,2 : SetupCollision ukko(3),ukko(2),2,2,2 : SetupCollision ukko(3),ukko(0),2,2,2 : SetupCollision ukko(3),ukko(4),2,2,2
SetupCollision ukko(4),ukko(1),2,2,2 : SetupCollision ukko(4),ukko(2),2,2,2 : SetupCollision ukko(4),ukko(3),2,2,2 : SetupCollision ukko(4),ukko(0),2,2,2
Repeat
hiiri()
///////////// Neliövalinta
Color cbwhite
If MouseDown(1) Then
If paikkavalittu=False Then
nelx=MaailmaX
nely=-Maailmay
paikkavalittu=True
EndIf
'pistää neliönkulmat oikeisiin paikkoihin
PositionObject o,nelx,nely
PositionObject o2,maailmax,ObjectY(o)
PositionObject o3,ObjectX(o2),-maailmay
PositionObject o4,ObjectX(o),ObjectY(o3)
'piirtää itte neliön
Line ObjectX(o), ObjectY(o),maailmax,ObjectY(o)
Line ObjectX(o2), ObjectY(o2),ObjectX(o3),ObjectY(o3)
Line ObjectX(o3), ObjectY(o3),ObjectX(o4),ObjectY(o4)
Line ObjectX(o4), ObjectY(o4),ObjectX(o),ObjectY(o)
'jos ei painahiirellä poistaa neliön
ElseIf Not MouseDown(1) Then
nelx=0
nely=0
paikkavalittu=False
EndIf
///////// UKKOJE VALINTA //////////
CameraPick MouseX(),MouseY()
e=PickedObject()
For i=0 To ukkomaara
'vasemmasta yläkulmasta
If ObjectX(ukko(i))=>ObjectX(o) And ObjectX(ukko(i))=<ObjectX(o2) And ObjectY(ukko(i))=<ObjectY(o2) And ObjectY(ukko(i))=>ObjectY(o3) Then
If paikkavalittu=False Then
ukko_valittu(i)=True
EndIf
'oikeasta alakulmasta
ElseIf ObjectX(ukko(i))=<ObjectX(o) And ObjectX(ukko(i))=>ObjectX(o2) And ObjectY(ukko(i))=>ObjectY(o2) And ObjectY(ukko(i))=<ObjectY(o3) Then
If paikkavalittu=False Then
ukko_valittu(i)=True
EndIf
'vasemmasta alakulmasta
ElseIf ObjectX(ukko(i))=>ObjectX(o) And ObjectX(ukko(i))=<ObjectX(o2) And ObjectY(ukko(i))=>ObjectY(o2) And ObjectY(ukko(i))=<ObjectY(o3) Then
If paikkavalittu=False Then
ukko_valittu(i)=True
EndIf
'oikeasta yläkulmasta
ElseIf ObjectX(ukko(i))=<ObjectX(o) And ObjectX(ukko(i))=>ObjectX(o2) And ObjectY(ukko(i))=<ObjectY(o2) And ObjectY(ukko(i))=>ObjectY(o3) Then
If paikkavalittu=False Then
ukko_valittu(i)=True
EndIf
'jos painaa ukkoa
ElseIf e=ukko(i) And MouseDown(1) Then
For r=0 To ukkomaara
ukko_valittu®=False
Next r
ukko_valittu(i)=True
EndIf
'tekee ympyrän äijän ympärille
Color 0,255,0
If ukko_valittu(i)=True Then Circle ObjectX(ukko(i))-20,ObjectY(ukko(i))+20, 40,OFF
Next i
////////////////////////////////////7
For i=0 To ukkomaara
///// "HYÖKKÄYS" //////
If e=vihu Then
ShowMouse attack
Else
ShowMouse mouse
EndIf
'jos hiiri on vihun päällä ja painaa hiiren oikeeta niin "hyökkää"
If e=vihu And MouseDown(2) Then
'tavallinen liikkuminen pois päältä
For t=0 To ukkomaara
ukon_liikkuminen(t)=0
Next t
PositionObject menomerkki, 99999,9999
If ukko_valittu(i)=1 Then
PointObject ukko(i), vihu
ukon_hyökkäys(i)=ON
EndIf
EndIf
'jos hyökkäys päällä niin liikutaan vihua kohti
If ukon_hyökkäys(i)=ON Then MoveObject ukko(i), 2
If Distance2(ukko(i),vihu)<100 And ukon_hyökkäys(i)=ON Then
'hyökkäys pois päältä kun se on tehty
For w=0 To ukkomaara
ukon_hyökkäys(w)=OFF
Next w
//AMMUNTA
ampuminen=ON
EndIf
If ampuminen=ON Then
Color väri,väri,väri
Text 0,0, "PUM"
väri=väri-1
If väri<1 Then
ampuminen=OFF
ClearText
väri=255
EndIf
EndIf
/////////////////////////////
////////// LIIKKUMINEN
If MouseDown(1) And e=0 Then
For z=0 To ukkomaara
ukko_valittu(z)=0
Next z
EndIf
If MouseDown(2) And e=0 Then
If menopaikka=False Then
menox=MaailmaX
menoy=-Maailmay
'menopaikka=True
PositionObject menomerkki,menox,menoy
EndIf
'ei liikuteta ukkoja joita ei ole valittu
If ukko_valittu(i)=ON Then ukon_liikkuminen(i)=ON
'laitetaan ukko_hyökkäys pois päältä
For u=0 To ukkomaara
ukon_hyökkäys(u)=OFF
Next u
EndIf
'varsinainen liikutus
If ukon_liikkuminen(i)=ON Then
PointObject ukko(i), menomerkki
MoveObject ukko(i),2
EndIf
'jos joku ukoista koskee objectia niin kaikki pysähtyy
For p=0 To ukkomaara
If ObjectsOverlap(ukko(p),menomerkki) Then paikalla=True
Next p
If paikalla=True Then ukon_liikkuminen(i)=False : paikalla=False
Next i
DrawScreen
Forever
'muutetaan ruudun koordinaatit maailman koordinaateiksi
Function hiiri()
hiiriX=MouseX()
hiiriY=MouseY()
MaailmaX = CameraX()-ScreenWidth()/2+hiiriX
MaailmaY = -CameraY()-ScreenHeight()/2+hiiriY
End Function
Re: Strategiapeli
mikä tässä mättää? loota ei mee kohilleen.
Code: Select all
SCREEN 800,600
FrameLimit 60
Global maailmax
Global maailmay
Type SOTILAAT
Field Obj
Field Valittu
Field Kohde
Field liiku
EndType
MSotilas=LoadObject("Media\guy.bmp",74)
ShowObject MSotilas,OFF
target=LoadObject("media/target.bmp",72)
For a=1 To 5
s.SOTILAAT=New(SOTILAAT)
s\obj=CloneObject(MSotilas)
s\valittu=False
s\kohde=MakeObject()
s\liiku=False
ScreenPositionObject s\obj,Rand(0,800),Rand(0,600)
Next a
For s.SOTILAAT=Each SOTILAAT
For s2.SOTILAAT=Each SOTILAAT
If s\obj<>s2\obj Then
SetupCollision s\obj,s2\obj,2,2,2
EndIf
ObjectPickable s\obj,2
Next s2
Next s
mouse=MakeObject()
o=MakeObject()
o2=MakeObject()
o3=MakeObject()
o4=MakeObject()
Repeat
hiiri()
Color 0,255,0
If MouseDown(1) Then
If paikkavalittu=False Then
nelx=MaailmaX
nely=-Maailmay
paikkavalittu=True
EndIf
'pistää neliönkulmat oikeisiin paikkoihin
PositionObject o,nelx,nely
PositionObject o2,maailmax,ObjectY(o)
PositionObject o3,ObjectX(o2),-maailmay
PositionObject o4,ObjectX(o),ObjectY(o3)
'piirtää itte neliön
Line ObjectX(o), ObjectY(o),maailmax,ObjectY(o)
Line ObjectX(o2), ObjectY(o2),ObjectX(o3),ObjectY(o3)
Line ObjectX(o3), ObjectY(o3),ObjectX(o4),ObjectY(o4)
Line ObjectX(o4), ObjectY(o4),ObjectX(o),ObjectY(o)
'jos ei paina hiirellä poistaa neliön
ElseIf Not MouseDown(1) Then
nelx=0
nely=0
paikkavalittu=False
EndIf
CameraPick MouseX(),MouseY()
e=PickedObject()
For s.sotilaat=Each sotilaat
'vasemmasta yläkulmasta
If ObjectX(s\obj)=>ObjectX(o) And ObjectX(s\obj)=<ObjectX(o2) And ObjectY(s\obj)=<ObjectY(o2) And ObjectY(s\obj)=>ObjectY(o3) Then
If paikkavalittu=False Then
s\valittu=True
EndIf
'oikeasta alakulmasta
ElseIf ObjectX(s\obj)=<ObjectX(o) And ObjectX(s\obj)=>ObjectX(o2) And ObjectY(s\obj)=>ObjectY(o2) And ObjectY(s\obj)=<ObjectY(o3) Then
If paikkavalittu=False Then
s\valittu=True
EndIf
'vasemmasta alakulmasta
ElseIf ObjectX(s\obj)=>ObjectX(o) And ObjectX(s\obj)=<ObjectX(o2) And ObjectY(s\obj)=>ObjectY(o2) And ObjectY(s\obj)=<ObjectY(o3) Then
If paikkavalittu=False Then
s\valittu=True
EndIf
'oikeasta yläkulmasta
ElseIf ObjectX(s\obj)=<ObjectX(o) And ObjectX(s\obj)=>ObjectX(o2) And ObjectY(s\obj)=<ObjectY(o2) And ObjectY(s\obj)=>ObjectY(o3) Then
If paikkavalittu=False Then
s\valittu=True
EndIf
'jos painaa ukkoa
ElseIf e=s\obj And MouseDown(1) Then
s\valittu=False
s\valittu=True
EndIf
'tekee ympyrän äijän ympärille
Color 0,255,0
If s\valittu=True Then Circle ObjectX(s\obj)-20,ObjectY(s\obj)+20, 40,OFF
Next s
DrawScreen
Forever
Function hiiri()
hiiriX=MouseX()
hiiriY=MouseY()
MaailmaX = CameraX()-ScreenWidth()/2+hiiriX
MaailmaY = -CameraY()-ScreenHeight()/2+hiiriY
End Function
Re: Strategiapeli
Tässä typeillä toteutettu valitseminen. Todennäköisesti koodissasi on vikana, että piirtokomennot on sijoitettu eri koordinaatistoon kuin tyypit..
Tuo ohjelma/peli kannattaa toteuttaa typeillä. Pelkästään boksi valinta selvyyden vuoksi tässä.
Tuo ohjelma/peli kannattaa toteuttaa typeillä. Pelkästään boksi valinta selvyyden vuoksi tässä.
Code: Select all
SCREEN 800,600
Const Vihuja = 20
Const Area = 50
Type VIHU
Field obj
Field Spd As Float
Field WpX
Field WpY
Field ID
EndType
cloonattava_vihu=LoadObject("media\guy.bmp",72)
ShowObject cloonattava_vihu,OFF
Sw#=ScreenWidth()
Sh#=ScreenHeight()
For az=1 To Vihuja
Nz.VIHU=New(VIHU)
Nz\obj=CloneObject(cloonattava_vihu)
PositionObject Nz\obj,Rand(-Sw#/2,Sw#/2),Rand(-Sh#/2,Sh#/2)
Next az
Repeat
If MouseHit(2) Then Addwaypoint()
If MouseDown(1)
If nelio = OFF
x1 = MouseX() 'merkataan neliön lähtöpaikka muistiin
y1 = MouseY()
nelio = ON
ElseIf nelio = ON
For aa.VIHU = Each VIHU
If ObjectX(aa\obj)+Sw#/2>=Min(MouseX(),x1) And ObjectX(aa\obj)+Sw#/2<=Max(MouseX(),x1)
If -ObjectY(aa\obj)+Sh#/2>=Min(MouseY(),y1) And -ObjectY(aa\obj)+Sh#/2<=Max(MouseY(),y1)
aa\ID = ON
Else
aa\ID = OFF
EndIf
Else
aa\ID = OFF
EndIf
Next aa
EndIf
ElseIf MouseUp(1) ' neliö pois kun hiiri nousee
nelio = OFF
EndIf
// Liikutetaan objectia, jos liike on suurempi kuin 0
For aa.VIHU=Each VIHU
If aa\spd>0
PointObject2(aa\obj,aa\WpX,aa\WpY)
MoveObject aa\obj,aa\spd
If Distance(aa\WpX,aa\WpY,ObjectX(aa\obj),ObjectY(aa\obj))<=20 Then aa\spd=0
EndIf
Next aa
DrawGame
// piirretään valituille vihuille ympyrät. Nopeampaa olisi vaihtaa vain kuva.
For aa.VIHU=Each VIHU
If aa\ID = ON Then Circle ObjectX(aa\obj)-Area/2+ScreenWidth()/2,-ObjectY(aa\obj)-Area/2+ScreenHeight()/2, Area,0
Next aa
// piirretään neliö, jos hiiri on alhaalla..
If nelio = ON Then Box2(x1,y1,MouseX(),MouseY(),0)
DrawScreen
Forever
Function Box2(x1#,y1#,x2#,y2#,tayte)
Line x1#,y1#,x2#,y1#
Line x1#,y1#,x1#,y2#
Line x2#,y2#,x1#,y2#
Line x2#,y2#,x2#,y1#
EndFunction
Function PointObject2(obj1,x2#,y2#)
angle#=-GetAngle(ObjectX(obj1),ObjectY(obj1),x2#,y2#)
RotateObject obj1,angle#
EndFunction
Function Addwaypoint()
For aa.VIHU=Each VIHU
If aa\ID=ON Then
aa\WpX=MouseWX()
aa\WpY=MouseWY()
aa\spd=Rnd(2,4)
aa\ID=OFF
EndIf
Next aa
EndFunction