Re: Tyhmät kysymykset (I/2010)
Posted: Thu Oct 14, 2010 10:25 pm
En ole nyt täysin varma, mutta muistaakseni komento ResetObjectCollision obj, tjs. poistaa kaikki törmäystunnistukset jotka on asetettu objektille obj.
Game Making Should Be Easy...
https://www.coolbasic.com/phpBB3/
Onko raato objekti klooni?Akuji wrote:Oikeastaan koitin myös juuri tuota tekniikkaa eikä se toiminut. Se juuri onkin kumma, että raatoon törmää, vaikkei sille ole annettu mitään törmäystunnistetta.
Code: Select all
SCREEN 800,600,0,1
FrameLimit 40
playerpoints = 0
font = LoadFont("Verdana",32,1,1)
SetFont font
// Luodaan tyyppikokoelma ammuksia varten
Type BULLETS
Field obj
End Type
// Ladataan media
GoSub LoadMedia
// Määritetään tyyppikokoelma vihollisille ja luodaan pari vihollista
Type ENEMIES
Field obj
Field energy
End Type
GoSub MakeEnemies
/////// PÄÄSILMUKKA ///////
Repeat
GoSub CheckButtons
GoSub EnemyAI
GoSub CheckBullets
GoSub DrawGUI
// Siirretään kameraa pelaajan mukana
CloneCameraPosition player
// Tarkistetaan onko taustamusiikki pysähtynyt ja käynnistetään tarvittaessa uudelleen
If SoundPlaying(backgroundmusic) = 0 Then
backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
EndIf
DrawScreen
Until EscapeKey()
/////// ALIOHJELMAT ///////
// Aliohjelma jossa ladataan pelissä tarvittava media
LoadMedia:
// Ladataan kartta ja animoidaan se
map = LoadMap("Media\cdm2.til", "Media\Tileset.bmp")
PlayObject map,0,0,0.5
fireball=LoadObject("media\fireball.bmp",72)
ShowObject fireball,OFF
// Ladataan panosobjektin grafiikat ja piilotetaan objekti
bulletobject = LoadObject("Media\bullet.bmp", 72)
ShowObject bulletobject, OFF
// Ladataan pelaaja ja asetetaan törmäyksentunnistus kartan seinien ja pelaaja välille
player = LoadObject("Media\soldier.bmp", 72)
SetupCollision player,map,2,4,2
// Ladataan vihollinen ja piilotetaan objekti
enemyobject = LoadObject("Media\guy.bmp", 72)
ShowObject enemyobject, OFF
// Ladataan äänet
backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
shot = LoadSound("Media\gun 1.wav")
scream = LoadSound("Media\scream1.wav")
Return
// Aliohjelma joka tarkistaa näppäinpainallukset
CheckButtons:
If UpKey() Then MoveObject player,4
If DownKey() Then MoveObject player,-4
If LeftKey() Then TurnObject player,5
If RightKey() Then TurnObject player,-5
// Tarkistetaan painetaanko ampumisnäppäintä ja jos,
// niin luodaan ammus ja törmäystunnistus sille
If KeyHit(cbkeySpace) Then
PlaySound shot, 40
blt.BULLETS = New(BULLETS)
blt\obj = CloneObject(bulletobject)
CloneObjectPosition blt\obj, player
CloneObjectOrientation blt\obj, player
MoveObject blt\obj,15
SetupCollision blt\obj,map,2,4,1
ResetObjectCollision blt\obj
EndIf
Return
// Aliohjelma, jossa tehdään viholliselle alkeellinen tekoäly
EnemyAI:
For enem.ENEMIES = Each ENEMIES
// Tarkistetaan näkeekö vihollisobjekti pelaajaobjekti ja
// jos näkee niin aloitetaan liikuttamaan pelaajaa kohti
If ObjectSight(enem\obj,player) Then
PointObject enem\obj, player
MoveObject enem\obj, 2
EndIf
Next enem
Return
// Aliohjelma, jossa läpikäydään ammukset
CheckBullets:
For blt.BULLETS = Each BULLETS
MoveObject blt\obj, 10
For enem.ENEMIES = Each ENEMIES
// Tarkistetaan osuuko ammus viholliseen
If ObjectsOverlap(blt\obj, enem\obj, 2) Then
deleteobj = 1
enem\energy = enem\energy -20
playerpoints = playerpoints + 5
EndIf
Next enem
bulcollisions = CountCollisions(blt\obj)
For i = 1 To bulcollisions
// Tarkistetaan onko ammus osunut seinään
If GetCollision(blt\obj, i) > 1 Then deleteobj = 1
Next i
If deleteobj = 1 Then
DeleteObject blt\obj
Delete blt
deleteobj = 0
EndIf
Next blt
Return
// Aliohjelma jossa piirretään "käyttöliittymä"
DrawGUI:
DrawGame
DrawToWorld ON
// Käydään viholliset läpi
For enem.ENEMIES = Each ENEMIES
PosX = ObjectX(enem\obj) - (ObjectSizeX(enem\obj)/2)
PosY = ObjectY(enem\obj) + ObjectSizeY(enem\obj)
EnWidth = enem\energy / 3
Color cbWhite
Box PosX,PosY,33,6
Color cbRed
Box PosX+1,PosY-1,EnWidth-2,4
If enem\energy <= 0 Then
// Jos energia nollassa, niin toistetaan huuto ja poistetaan vihollistyyppi
PlaySound scream,40
PaintObject enem\obj,fireball 'HUOMIOI TÄMÄ
Delete enem
EndIf
Next enem
DrawToWorld OFF
// Kirjoitetaan pisteet näytölle (ensimmäinen on varjostus)
Color cbBlack : Text 12,12, playerpoints
Color cbWhite : Text 10,10, playerpoints
Return
// Aliohjelma, jossa määritetään kaksi vihollista ja niiden energia
MakeEnemies:
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,-500
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,500
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,-800
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,800
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
Return
Sun _PITÄÄ_ poistaa se objekti kokonaan, jos haluat ettei törmäystunnistus vaikuta siihen. Jotta saisit raadon näkymään kuitenkin samoissa koordinaateissa, niin kloonaa siitä master-objekti-raadosta uusi objekti ja aseta se kuolleen enem\obj objektin koordinaatteihin. Näin selviät yksinkertaisesti törmäystunnistuksista ja muista elossa olevien vihujen jutuista. Asiaa selkeyttämään voit jopa luoda kokonaan toisen tyyppikokoelman, joka sisältää vain raatojen objektit, jolloin ne eivät häiritse muuta vihollisia koskevia pelimekaniikkoja.Akuji wrote:Sitten vain muutan ohjelman loppupuolella olevan Deleteobject enem\obj -komennon Paintobject enem\obj.
Olenko siis tässä tehnyt jotain väärin, vai pystyykö tuosta jotenkin poistamaan törmäystunnistuksen?
Code: Select all
Type ENEMIES
Field obj
EndType
Type RAADOT
Field obj
EndType
// Tämä olkoon se master-objekti-raato
master_raato = LoadObject("Media/fireball.bmp")
ShowObject master_raato, OFF
For enem.ENEMIES = Each ENEMIES
// Käydään kaikki vihut läpi
// .....
// Noniin, nyt vihollinen kuolee.
// Luodaan uusi raato kokoelmaan RAADOT.
newRaato.RAADOT = New(RAADOT)
newRaato\obj = CloneObject( master_raato )
// Siirretään raato samaan paikkaan kuin kuoleva vihollinen.
CloneObjectPosition enem\obj, newRaato\obj
// käännetään raato samaan suuntaan myös :P
CloneObjectOrientation enem\obj, newRaato\obj
// Noin, nyt on luotu raato, joten kuollut vihollinen
// voidaan poistaa pelistä.
DeleteObject enem\obj
Delete enem
Next enem
Aha hupsista että sellanen moka, mutta hyvä kun huomasit. Tuohon pelaajan päälle jäämiseen, niin vilkaiseppas manuaalista komento ObjectOrder. Sen pitäisi auttaa.Akuji wrote:Kiitti. Toi toimi
Huomasin muuten pienen virheen: Cloneobjectpositionissa oli newRaato\obj ja enem\obj väärin päin. Korjasin ja alkoi toimia.
Anteeks kauheesti tämä kyseleminen, mutta miten saisi vielä pelihahmon kävelemään raadon päältä, kun nyt se jää pelaajan päälle.
Latausjärjestys ja objectorder ei nimittäin auta.
Muuten alkaa hommat olla suht koht OK.
Huomaa että ObjectOrder siirtää objektin joko "alimmaiseksi" - eli objekti saatetaan piirtää mm. ennen tilekarttaa tai päällimmäiseksi. Aina kun luot uusia objekteja ne ovat oletuksellisesti "päälimmäisiä" eli ne piirretään viimeisenä ja piirtyvät siis muiden objektien päälle.Akuji wrote:Sillä yritin, mutta ei vaikuttanut mitenkään.
Tee joku tiedosto, johon kirjoitat toisella ohjelmalla ja josta luet toisella ohjelmalla. Jos taas tartteet nopeampaa tiedonsiirtoa, niin kyllä se cbNetwork toimii ihan hyvin niinkin, ettei siihen tartte olla internet-yhteyttä olemassa. Sillon vaan muut koneet ei pääse ohjelmien väliin lukemaan/lähettämään dataa.timpe99 wrote:Miten sais ohjelman lähettämään tietoa toiseen samaan ohjelmaan ilman internet yhteyttä?
Tuota olenkin yrittänyt, mutta ei toimi. Pitäisiköhän siirtää jotain muutaRatkaisu tähän on siirtää pelihahmo päälimmäiseksi kun uusia objekteja luodaan.
Avaat kuuntelevan socketin johonkin porttiin ja yhdistät toisesta ohjelmasta siihen osoitteena localhost ja porttina ko. portti.timpe99 wrote:Miten sais ohjelman lähettämään tietoa toiseen samaan ohjelmaan ilman internet yhteyttä?
Hmm.. tarkennatko kuinka yrität siirää pelihahmon ObjectOrderilla?Akuji wrote:Tuota olenkin yrittänyt, mutta ei toimi. Pitäisiköhän siirtää jotain muutaRatkaisu tähän on siirtää pelihahmo päälimmäiseksi kun uusia objekteja luodaan.
Code: Select all
SCREEN 800,600,0,1
FrameLimit 40
playerpoints = 0
font = LoadFont("Verdana",32,1,1)
SetFont font
// Tyyppikokoelma ammuksia varten
Type BULLETS
Field obj
End Type
// Ladataan media
GoSub LoadMedia
// Määritetään tyyppikokoelma vihollisille ja luodaan 4 vihollista
Type ENEMIES
Field obj
Field energy
End Type
GoSub MakeEnemies
Type RAADOT
Field obj
EndType
/////// PÄÄSILMUKKA ///////
Repeat
GoSub CheckButtons
GoSub EnemyAI
GoSub CheckBullets
GoSub DrawGUI
// Siirretään kameraa pelaajan mukana
CloneCameraPosition player
// Tarkistetaan onko taustamusiikki pysähtynyt ja käynnistetään tarvittaessa uudelleen
If SoundPlaying(backgroundmusic) = 0 Then
backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
EndIf
DrawScreen
Until EscapeKey()
/////// ALIOHJELMAT ///////
// Aliohjelma jossa ladataan pelissä tarvittava media
LoadMedia:
// Ladataan kartta ja animoidaan se
map = LoadMap("Media\cdm2.til", "Media\Tileset.bmp")
PlayObject map,0,0,0.5
// Ladataan panosobjektin grafiikat ja piilotetaan objekti
bulletobject = LoadObject("Media\bullet.bmp", 72)
ShowObject bulletobject, OFF
// Ladataan pelaaja ja asetetaan törmäyksentunnistus kartan seinien ja pelaaja välille
player = LoadObject("Media\soldier.bmp", 72)
SetupCollision player,map,2,4,2
// Ladataan vihollinen ja piilotetaan objekti
enemyobject = LoadObject("Media\guy.bmp", 72)
ShowObject enemyobject, OFF
// Tämä olkoon se master-objekti-raato
master_raato = LoadObject("Media/fireball.bmp")
ShowObject master_raato, OFF
// Ladataan äänet
backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
shot = LoadSound("Media\gun 1.wav")
scream = LoadSound("Media\scream1.wav")
Return
// Aliohjelma joka tarkistaa näppäinpainallukset
CheckButtons:
If UpKey() Then MoveObject player,4
If DownKey() Then MoveObject player,-4
If LeftKey() Then TurnObject player,5
If RightKey() Then TurnObject player,-5
// Tarkistetaan painetaanko ampumisnäppäintä ja jos,
// niin luodaan ammus ja törmäystunnistus sille
If KeyHit(cbkeySpace) Then
PlaySound shot, 40
blt.BULLETS = New(BULLETS)
blt\obj = CloneObject(bulletobject)
CloneObjectPosition blt\obj, player
CloneObjectOrientation blt\obj, player
MoveObject blt\obj,15
SetupCollision blt\obj,map,2,4,1
ResetObjectCollision blt\obj
EndIf
Return
// Tehdään viholliselle alkeellinen tekoäly
EnemyAI:
For enem.ENEMIES = Each ENEMIES
// Tarkistetaan näkeekö vihollisobjekti pelaajaobjektin ja
// aloitetaan liikuttamaan pelaajaa kohti
If ObjectSight(enem\obj,player) Then
PointObject enem\obj, player
MoveObject enem\obj, 2
EndIf
Next enem
Return
// Läpikäydään ammukset
CheckBullets:
For blt.BULLETS = Each BULLETS
MoveObject blt\obj, 10
For enem.ENEMIES = Each ENEMIES
// Tarkistetaan osuuko ammus viholliseen
If ObjectsOverlap(blt\obj, enem\obj, 2) Then
deleteobj = 1
enem\energy = enem\energy -20
playerpoints = playerpoints + 5
EndIf
Next enem
bulcollisions = CountCollisions(blt\obj)
For i = 1 To bulcollisions
// Tarkistetaan onko ammus osunut seinään
If GetCollision(blt\obj, i) > 1 Then deleteobj = 1
Next i
If deleteobj = 1 Then
DeleteObject blt\obj
Delete blt
deleteobj = 0
EndIf
Next blt
Return
// Piirretään "käyttöliittymä"
DrawGUI:
DrawGame
DrawToWorld ON
// Käydään viholliset läpi
For enem.ENEMIES = Each ENEMIES
PosX = ObjectX(enem\obj) - (ObjectSizeX(enem\obj)/2)
PosY = ObjectY(enem\obj) + ObjectSizeY(enem\obj)
EnWidth = enem\energy / 3
Color cbWhite
Box PosX,PosY,33,6
Color cbRed
Box PosX+1,PosY-1,EnWidth-2,4
If enem\energy <= 0 Then
// Jos energia nollassa, niin toistetaan huuto ja deletoidaan vihollistyyppi
PlaySound scream,40
// Vihollinen kuolee.
// Uusi raato kokoelmaan RAADOT.
newRaato.RAADOT = New(RAADOT)
newRaato\obj = CloneObject( master_raato )
// Raato samaan paikkaan kuin kuoleva vihollinen.
CloneObjectPosition newRaato\obj,enem\obj
// käännetään raato samaan suuntaan.
CloneObjectOrientation enem\obj, newRaato\obj
DeleteObject enem\obj
Delete enem
EndIf
Next enem
DrawToWorld OFF
// Kirjoitetaan pisteet näytölle (ensimmäinen on varjostus)
Color cbBlack : Text 12,12, playerpoints
Color cbWhite : Text 10,10, playerpoints
Return
// Aliohjelma, jossa määritetään kaksi vihollista ja niiden energia
MakeEnemies:
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,-500
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,500
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,-800
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
enem.ENEMIES = New(ENEMIES)
enem\obj = CloneObject(enemyobject)
PositionObject enem\obj,0,800
SetupCollision enem\obj,map,2,4,1
SetupCollision enem\obj,player,2,2,2
SetupCollision player,enem\obj,2,2,2
ResetObjectCollision enem\obj
enem\energy = 100
Return
Code: Select all
Repeat
Cx = Cx + KeyDown(32) - KeyDown(30) // A- ja D -näppäimistä liikutaan sivulle
Cy = Cy + KeyDown(200) - KeyDown(208) // Ylä- ja alanuolista muutetaan kameran korkeutta ylös/alaspäin
Cz = Cz + KeyDown(17) - KeyDown(31) // W- ja S -näppäimistä liikutaan eteen/taakse
DrawScreen
Forever
Code: Select all
x# = 100
y# = 50
z# = 100
Repeat
ClearText
AddText "Liikuta kameraa nuolilla"
AddText "Liiuta pistettä W,A,S,D"
AddText "Pisteen Syvyys Z,X"
x# = x# + 2*(KeyDown(cbkeyd) - KeyDown(cbkeya))
y# = y# + 2*(KeyDown(cbkeyw) - KeyDown(cbkeys))
z# = z# + 2*(KeyDown(cbkeyz) - KeyDown(cbkeyx))
MoveCamera 2*(RightKey() - LeftKey()), 2*(UpKey() - DownKey())
s_z# = (1 / z#) 'z-akseli skaalain.
s_x# = ScreenWidth() / 2 + ((x - CameraX()) * s_z * 100)
s_y# = ScreenHeight() / 2 - ((y + CameraY()) * s_z * 100)
Dot s_x#, s_y#
DrawScreen
Until EscapeKey()
Code: Select all
x# = 100
y# = 50
z# = 100
Repeat
ClearText
AddText "Liikuta kameraa nuolilla"
AddText "Liiuta pistettä W,A,S,D"
AddText "Pisteen Syvyys Z,X"
x# = x# + 2*(KeyDown(cbkeyd) - KeyDown(cbkeya))
y# = y# + 2*(KeyDown(cbkeyw) - KeyDown(cbkeys))
z# = z# + 2*(KeyDown(cbkeyz) - KeyDown(cbkeyx))
MoveCamera 2*(RightKey() - LeftKey()), 2*(UpKey() - DownKey())
s_z# = (1 / z#) 'z-akseli skaalain.
s_x# = ScreenWidth() / 2 + ((x - CameraX()) * s_z * 100)
s_y# = ScreenHeight() / 2 - ((y + CameraY()) * s_z * 100)
Box s_x#, s_y#, 10 * s_z * 100, 10 * s_z * 100
DrawScreen
Until EscapeKey()
Yeah! Kiitti!MaGetzUb wrote:
Entäs sitten kameran kääntäminen?