Strategiapeli

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
finnish noob

Strategiapeli

Post by finnish noob »

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?
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: Strategiapeli

Post by temu92 »

Mieluummin teet sen laittamalla objekteja tiettyihin paikkoihin. Kartan muokkaaminen lennosta tuommoista varten on turhan hankalaa.
finnish noob

Re: Strategiapeli

Post by finnish noob »

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)?
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Strategiapeli

Post by esa94 »

Kyllä.

Lainaus 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.
Katso loput CB:n manuaalista.
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?

Ozcar
Advanced Member
Posts: 439
Joined: Mon Aug 27, 2007 8:43 pm
Location: Helsinki

Re: Strategiapeli

Post by Ozcar »

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.
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: Strategiapeli

Post by phons »

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.
Image
finnish noob

Re: Strategiapeli

Post by finnish noob »

esa94 wrote:Kyllä.

Lainaus 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.
Katso loput CB:n manuaalista.
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?

tarkoitin että miten tarkistetaan yksiköt jotka ovat laatikon sisällä
finnish noob

Re: Strategiapeli

Post by finnish noob »

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?
dem0
Newcomer
Posts: 43
Joined: Wed Mar 19, 2008 7:36 am

Re: Strategiapeli

Post by dem0 »

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?
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.

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.
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: Strategiapeli

Post by Pate5 »

finnish noob wrote:tarkoitin että miten tarkistetaan yksiköt jotka ovat laatikon sisällä
Tarkista laatikon alku- ja loppupisteiden + objektien sijainnin perusteella näin:

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
Laatikkox ja laatikkoy kuvaavat laatikon alkupistettä. Laatikkoleveys ja laatikkokorkeus taas kuvaavat laatikon leveyttä ja korkeutta. Katso myös MouseWX(), MouseWY() ja DrawToWorld.
CoolBasic henkilökuntaa
Graafikko
finnish noob

Re: Strategiapeli

Post by finnish noob »

Pate5 wrote:
finnish noob wrote:tarkoitin että miten tarkistetaan yksiköt jotka ovat laatikon sisällä
Tarkista laatikon alku- ja loppupisteiden + objektien sijainnin perusteella näin:

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
Laatikkox ja laatikkoy kuvaavat laatikon alkupistettä. Laatikkoleveys ja laatikkokorkeus taas kuvaavat laatikon leveyttä ja korkeutta. Katso myös MouseWX(), MouseWY() ja DrawToWorld.
äh...olen yrittänyt, mutta en saa tuota toimimaan...saisiko jonkinnäköisen toimivan esimerkin?
finnish noob

Re: Strategiapeli

Post by finnish noob »

um...sattusiko edes joku tietämään....?
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: Strategiapeli

Post by Aavesoturi »

Tässä, muistaakseni Zeron joskus tekemä esimerkki:
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



finnish noob

Re: Strategiapeli

Post by finnish noob »

Juuri se mitä tarvitsin x]
kiitän ja kumarran
finnish noob

Re: Strategiapeli

Post by finnish noob »

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
Jonhu
Active Member
Posts: 186
Joined: Mon Aug 04, 2008 5:45 pm

Re: Strategiapeli

Post by Jonhu »

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ä.

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
Post Reply