Tyhmät kysymykset (I/2011)
Re: Tyhmät kysymykset (I/2011)
Johtuu siitä että yrität editoida sellaista osaa mapista jota ei ole olemassa. Editmap vaatii tilekoordinaatteja parametreina, eli vasen yläkulma on 1, 1, ja se kasvaa alas oikealle. Nyt kuitenkin käytät objektikoordinaatteja.
Joudut siis muuttamaan objektikoordinaatit tilekoordinaateiksi. Tähän taitaa olla funktiot tehtynä cbRepositoryssa. Jos sieltä ei löydy niin kokeile hakua.
Joudut siis muuttamaan objektikoordinaatit tilekoordinaateiksi. Tähän taitaa olla funktiot tehtynä cbRepositoryssa. Jos sieltä ei löydy niin kokeile hakua.
- aloittelijamies
- Newcomer
- Posts: 45
- Joined: Fri Nov 18, 2011 9:55 pm
Re: Tyhmät kysymykset (I/2011)
kiitos VesQ vinkistä, kokeilen kun jaksan
Re: Tyhmät kysymykset (I/2011)
Miten pystyy tekemään nettipelin
exe tiedosto swf muotoon: Lopetettu
Tervetuloa lukemaan foorumin noloimman käyttäjän viestejä!
Tervetuloa lukemaan foorumin noloimman käyttäjän viestejä!
Re: Tyhmät kysymykset (I/2011)
Opettelemalla ensin perusteet, koodaamalla projektin ilman nettiominaisuuksia, opettelemalla cbNetwork, koodaamalla projektin päälle nettiominaisuudet.Mikki0000 wrote:Miten pystyy tekemään nettipelin
Aloita kohdasta "perusteet". Jos jotai arviota haluat kauanko kestää että pääset loppuun niin sanotaa sellane pari vuotta jos ahkera olet.
Re: Tyhmät kysymykset (I/2011)
Hei!
Mulla on pieni ongelma tämän ensimmäisen 'pelini' kanssa, ammukset eivät oikein lähde piipusta. (Olen "koodannut" tämän copy-pastettamalla mukana tulevista lessoneista.)
Mulla on pieni ongelma tämän ensimmäisen 'pelini' kanssa, ammukset eivät oikein lähde piipusta. (Olen "koodannut" tämän copy-pastettamalla mukana tulevista lessoneista.)
Code: Select all
FrameLimit 40
SCREEN 550,400 'näyttö
SetWindow "Game"
DrawToWorld ON
'Print ""
Type AMMUS 'luo kokoelma, jonka nimi on AMMUS
Field obj 'yksi kenttä nimeltään ''obj'
End Type
ukko=LoadObject("Media\soldier.bmp",72)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
ääniAmmu = LoadSound ("Media\Blaster.wav")
musa = PlaySound ("Media\SK_Battle2.mp3")
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1
ukko = LoadObject("Media\guy.bmp",360)
'lataa vihulainen
vihu = LoadObject ("Media\guy.bmp",72)
ObjectPickable vihu, 2 'aseta se poimittavaksi
PositionObject vihu, 32,150 'sijoita ylemmäs
ObjectPickable kartta, ON 'aseta se poimittavaksi
SetupCollision ukko, kartta, 1, 4, 2
Color cbred
AddText "Voit ohjata nuolilla.Voit poistaa tämän tekstin painamalla enter."
Color cbRed
Text X,325,"moi"
Plusx=1
SetupCollision ukko, vihu, 2, 2, 2
Repeat 'silmukka
If KeyHit(28) Then
ClearText
EndIf
x = x + plusx
If x<0 Or x>200 Then plusx= -plusx
'DrawImage kuva,40,20
ClsColor cbblack 'Taustan väri
'kakkos ukon alku asento
'RotateObject ukko2,180
'koodin pätkä voit lisätä ukkelin tai kameran.
'If KeyDown(cbKeyA) Then
'If KeyDown(cbKeyD) Then
'If KeyDown(cbKeyW) Then
'If KeyDown(cbKeyS) Then
'Tällä liikutetaan ukkelia
If LeftKey() Then TurnObject ukko, 5
If RightKey() Then TurnObject ukko, -5
If UpKey() Then MoveObject ukko, 2
If DownKey() Then MoveObject ukko, -2
'Älä päästä ukkelia rajojen ulkopuolelle
'If ObjectX(ukko)<-200 Then PositionObject ukko,-200,ObjectY(ukko)
'If ObjectX(ukko)>200 Then PositionObject ukko,200,ObjectY(ukko)
'If ObjectY(ukko)<-150 Then PositionObject ukko,ObjectX(ukko),-150
'If ObjectY(ukko)>150 Then PositionObject ukko,ObjectX(ukko),150
'Älä päästä ukkelia rajojen ulkopuolelle
'If ObjectX(ukko2)<-150 Then PositionObject ukko2,-200,ObjectY(ukko2)
'If ObjectX(ukko2)>150 Then PositionObject ukko2,200,ObjectY(ukko2)
'If ObjectY(ukko2)<-100 Then PositionObject ukko2,ObjectX(ukko2),-150
'If ObjectY(ukko2)>100 Then PositionObject ukko2,ObjectX(ukko2),150
'Aktivoi jos on kaksi pelaajaa käytössä
'SetupCollision ukko,ukko2,2,2,2
'SetupCollision ukko2,ukko,2,2,2
'Color cbRed
'Text X,325,""
UpdateGame 'päevitä peli
CloneCameraPosition ukko 'cameera ja U.K.K.Eli
DrawGame
'Voidaanko ampua
If KeyDown(cbkeyspace) And reload=0 Then
PlaySound ääniAmmu,50
reload=10 'lataa 1/4 sekunnissa (koska framelimit 40)
EndIf
'lataaminen
If reload>0 Then reload-1
If SoundPlaying(musa)=0 Then
musa = PlaySound ("Media\SK_Battle2.mp3")
If Rand(1,2)=1 Then
SetSound musa,0,100,-100 'vasen kajari
Else
SetSound musa,0,100,100 'oikea kajari
EndIf
EndIf
'Ammu-systeemi. Vain, jos ase on ladattu
'If KeyDown(cbkeyspace) And reload=0 Then
' Gosub LisääAmmus
'EndIf
'päivitä aseen lataaminen
' If reload>0 Then reload=reload-1
Gosub PäivitäAmmukset
'If reload>0 Then reload=reload-1
'
' ObjectPick ukko
' e=PickedObject()
' If e=vihu Then
'Color cbMagenta
'Circle PickedX()-4,PickedY()+4,8,OFF
'EndIf
DrawScreen 'piirtää ruudun
Until EscapeKey()
End
If KeyDown(cbkeyspace) And reload=0 Then
luoti.AMMUS = New(AMMUS) 'luo uusi ammus
luoti\obj=CloneObject(pati) 'tee klooni
'asetetaan pati samaan paikkaan
CloneObjectPosition luoti\obj,ukko
'käännetään pati samaan suuntaan
CloneObjectOrientation luoti\obj,ukko
reload=5 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reloa
'vapaa paikka löytyi, luodaan pati
'AMMUS_ELOSSA(i)=ON
'AMMUS_OBJ(i)=CloneObject(pati)
'asetetaan pati samaan paikkaan
'CloneObjectPosition AMMUS_OBJ(i),ukko
'käännetään pati samaan suuntaan
'CloneObjectOrientation AMMUS_OBJ(i),ukko
'reload=5 ''aseen lataus
'enempää paikka-tarkistuksia ei tarvita,
'joten voimme paeta silmukasta
'Päivitä kaikki ammukset
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
If ObjectX(luoti\obj)<-480 Or ObjectX(luoti\obj)>300 Or ObjectY(luoti\obj)<-400 Or ObjectY(luoti\obj)>300 Then
'ammus ylittää rajan -> tuhoa se
DeleteObject luoti\obj ''poista objekti
Delete luoti ''poista luoti kokonaan
EndIf
Next luoti
Return
PäivitäAmmukset:
'liikutetaan kaikkia ammuksia, ja katsotaan
'törmäävätkö ne oransseihin seiniin. Jos
'törmäävät, niin ne poistetaan ammuslistasta,
'ja paikka vapautuu uudelle ammukselle.
'käydään KAIKKI läpi
For i=1 To 100
If AMMUS_ELOSSA(i) Then
MoveObject AMMUS_OBJ(i),6
'tämä on inhottavan pitkä rivi-------------> -------------> -------------> -------------> ------------->
'voit kuitenkin pilkkoa sen mielessäsi
'OR:n erottamiin osiin...
If ObjectX(AMMUS_OBJ(i))<-180 Or ObjectX(AMMUS_OBJ(i))>180 Or ObjectY(AMMUS_OBJ(i))<-130 Or ObjectY(AMMUS_OBJ(i))>130 Then
'ammus ylittää rajan -> tuhoa se
DeleteObject AMMUS_OBJ(i)
'vapauta paikka tyhjäksi
AMMUS_ELOSSA(i)=OFF
EndIf
EndIf
Next i
'
Return 'palaa takaisin pääsilmukkaan
Re: Tyhmät kysymykset (I/2011)
Ainakin sen huomasin että käytät taulukoita ja tyyppejä sekaisin, etkä ole määritellyt taulukoita ollenkaan. Eli suosittelen tutustumaan oppitunteihin, eli "lessoneihin" hieman syvemminanti-koodari wrote:Hei!
Mulla on pieni ongelma tämän ensimmäisen 'pelini' kanssa, ammukset eivät oikein lähde piipusta. (Olen "koodannut" tämän copy-pastettamalla mukana tulevista lessoneista.)
Code: Select all
koodia
Oppitunnissa Ammukset toteutetaan tuo systeemi taulukoilla ja oppitunnissa Ammukset 2 tyypeillä. Manuaalista löydät kattavammin tietoa niistä, mutta jos olet ihan alussa ohjelmoinnin kanssa, niin ne eivät välttämättä ole vielä niin tarpeellisia opetella, vaan kannattaa perehtyä manuaalin "Perusteet" ja "CoolBasic ohjelmointikieli"-osioihin.
Re: Tyhmät kysymykset (I/2011)
Pahoittelen tuplapostia, mutta muistin että itsellänikin oli ongelma Eli kuten aikaisemminkin kyselin EditMap-komennosta, niin en ole löytänyt foorumilta vastausta ongelmaan, enkä ole sitä itse keksinyt, niin voisiko joku osaava pistää esimerkkiä, kuinka muutan objektin maailman koordinaatit tile koordinaateiksi? Löysin jotkut GetTileX() ja GetTileY()-funktiot, joilla pitäisi onnistua, vaan ei toiminut niilläkään vaikka niitäkin yritin muokkailla Alkaa aiheuttaa harmaita hiuksia tämä ongelma
Re: Tyhmät kysymykset (I/2011)
Selvitin tuon pienen kikkailun avulla. Tässä olisi lopputulos:MrMonday wrote:Pahoittelen tuplapostia, mutta muistin että itsellänikin oli ongelma Eli kuten aikaisemminkin kyselin EditMap-komennosta, niin en ole löytänyt foorumilta vastausta ongelmaan, enkä ole sitä itse keksinyt, niin voisiko joku osaava pistää esimerkkiä, kuinka muutan objektin maailman koordinaatit tile koordinaateiksi? Löysin jotkut GetTileX() ja GetTileY()-funktiot, joilla pitäisi onnistua, vaan ei toiminut niilläkään vaikka niitäkin yritin muokkailla Alkaa aiheuttaa harmaita hiuksia tämä ongelma
Code: Select all
Function GetTileXFromWorldX(_x, _map, _tileWidth = 32)
Return ((_x + ObjectSizeX(_map)/2) / _tileWidth + 1)
EndFunction
Function GetTileYFromWorldY(_y, _map, _tileHeight = 32)
Return ((-_y + ObjectSizeY(_map)/2) / _tileHeight + 1)
EndFunction
// ESIMERKKI
FrameLimit 60
map= LoadMap("Media\cdm2.til","Media\tileset.bmp")
guy= LoadObject("Media\guy.bmp", 72)
Repeat
If LeftKey() Then TurnObject guy, 5
If RightKey() Then TurnObject guy, -5
If UpKey() Then MoveObject guy, 2
If DownKey() Then MoveObject guy, -2
tileX = GetTileXFromWorldX( ObjectX(guy), map, 32 )
tileY = GetTileYFromWorldY( ObjectY(guy), map, 32 )
If tileX >= 1 And tileX <= MapWidth() And tileY >= 1 And tileY <= MapHeight() Then
If oldtileX >= 1 And oldtileY >= 1 Then
EditMap map, 0, oldtileX, oldtileY, oldtile
EndIf
oldtileX = tileX
oldtileY = tileY
oldtile = GetMap2(0,tileX,tileY)
EditMap map, 0, tileX, tileY, 114
EndIf
CloneCameraPosition guy
DrawScreen
Forever
Code: Select all
tileX = (x + ObjectSizeX(map)/2) / 32 + 1
tileY = (-y + ObjectSizeY(map)/2) / 32 + 1
tileX lasketaan niin että maailmankoordinaatiston x-koordinaattiin ensin lisätään koko kartan leveys jaettuna kahdella, eli puolikas kartan leveyttä. Näin saadaan aivan vasemman laidan pienimmäksi mahdolliseksi x-koordinaatiksi 0. Sitten jaamme saadun luvun tilen leveydellä, tässä tapauksessa 32:lla, jotta saisimme tilekoordinaatteja. Edelleen vasemman laidan pienin arvo on 0 ja koska tilekoordinaatit alkavat ykkösestä, täytyy arvoon vielä lisätä se 1.
tileY:lle tehdään muuten sama mutta kiepsautetaan y-koordinaatin arvo heti negatiiviseksi, koska maailmankoordinaateissa y kasvaa ylöspäin mutta karttakoordinaateissa y kasvaa alaspäin.
EDIT: Eli jos haluat niin tässä olisi valmiit funktiot sinulle:
Code: Select all
Function GetTileXFromWorldX(_x, _map, _tileWidth = 32)
Return ((_x + ObjectSizeX(_map)/2) / _tileWidth + 1)
EndFunction
Function GetTileYFromWorldY(_y, _map, _tileHeight = 32)
Return ((-_y + ObjectSizeY(_map)/2) / _tileHeight + 1)
EndFunction
Sain näköjään funktioilleni vielä mukavan URLin
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
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Re: Tyhmät kysymykset (I/2011)
Kiitos kaunis VesQlle avusta, mutta valitettavasti tuokaan ei toiminut toivotulla tavalla. Tai sitten minulla jäi tuosta joku seikka ymmärtämättä, vaikka yritin toki sisäistää mahdollisimman hyvin mitä se tekee (vihaan käyttää koodia jos en tiedä miksi se tekee mitäkin) Tai minulla on koodissa joku systeemi vaturallaan sillain että se haraa vastaan, mutta en mitään järkevää selitystä löytänyt. Eli nyt EditMap-komento toimii, mutta se muokkaa karttaa jostain ihan muualta. Ei siis ihan randomisti mistä kohtaa kenttää sattuu, vaan aina saman verran ylhäältä ja oikealta siitä kohdasta katsottuna missä muutoksen pitäisi tapahtua. Alla hieman muokattuna ja karsittuna kohta, missä ammutaan, eli jätin kaiken epäolennaisen pois, jotta helpommin saisi selvää. Teenkö minä siis koodissa jotain väärin? Ja kiitos vielä avusta Jonezille ja VesQlle.
Re: Tyhmät kysymykset (I/2011)
Täytyy sanoa, etten valitettavasti saanut oikein selvää mitä koodisi täytyi tehdä. Joten koodasin pienen esimerkin siitä miten EditMappia ja VesQ:n funkkareita käyteyään yhdessä. Muutin funktioiden toimintaa niin, että nyt ne ottavat huomioon myös jos itse karttaa on liikuteltu. Jos haluat "optimoida" koodiasi (koska kartaa ei lähes ikinä liikutella), käytä vesQ:n alkuperäisiä.
Code: Select all
Type tBullets
Field obj
EndType
map = LoadMap("Media\cdm2.til", "media\tileset.bmp")
guy = LoadObject("media\guy.bmp", 72)
SetupCollision guy, map, 2, 4, 2
bullet = LoadObject("media\bullet.bmp")
ShowObject bullet, OFF
Repeat
TurnObject guy, (LeftKey() - RightKey()) * 5
MoveObject guy, (UpKey() - DownKey()) * 5
CloneCameraPosition(guy)
If KeyHit(CbKeyLControl) Then
Shoot(guy, bullet)
EndIf
For ib.tBullets = Each tBullets
bDeleteBullet = False
MoveObject ib\obj, 5
//Otetaan mapin hit-arvo luodin kohdalta ylös
mapData = GetMap(2, ObjectX(ib\obj), ObjectY(ib\obj))
//jos luoti on seinän kohdalla (arvo != 0)
If mapData <> 0 Then
tileX = GetTileXFromWorldX(ObjectX(ib\obj), map, 32)
tileY = GetTileYFromWorldY(ObjectY(ib\obj), map, 32)
//poistetaan hit
EditMap map, 2, tileX, tileY, 0
//muutetaan kuvaa
EditMap map, 0, tileX, tileY, mapData - 1
bDeleteBullet = True //luoti tuhtoutuu osuessaan seinään
EndIf
//tuhotaan luoti jos se menee liian kauas
If Distance2(ib\obj, guy) > 2000 Then bDeleteBullet = True
//tuhotaan luoti jos täytyy
If bDeleteBullet Then
DeleteObject ib\obj
Delete ib
EndIf
Next ib
DrawScreen
Forever
Function Shoot(obj, bullet)
nb.tBullets = New (tBullets)
nb\obj = CloneObject (bullet)
CloneObjectPosition nb\obj, obj
CloneObjectOrientation nb\obj, obj
EndFunction
// VesQ:n funktiot tässä
Function GetTileXFromWorldX(_x, _map, _tileWidth = 32)
ox = _x - ObjectX(_map)
Return ((ox + ObjectSizeX(_map)/2) / _tileWidth + 1)
EndFunction
Function GetTileYFromWorldY(_y, _map, _tileHeight = 32)
oy = _y - ObjectY(_map)
Return ((-oy + ObjectSizeY(_map)/2) / _tileHeight + 1)
EndFunction