Page 8 of 23

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 9:40 am
by skorpioni-cb
Latexi95 wrote:
Konstaduck wrote:Olen tässä taas mietiskellyt syvällisiä, ja yksi, mikä jäi kiusaamaan on animaatio avatarissa.

Kokeilin haulla etsiä, mutta löytyi vaan sen avatarin muilta sivuilta lataamis estojuttui jne jne.

Eli miten saisin animaation avatariini? Meneekö se samalla tavalla, kuin tuo CB:n animaatiokuva?

vastauksia odotellen, Konstaduck
Laitoin kyllä tämän vastauksen jo offtopiciin, mutta ilmeisesti se meni sinulta ohi.

Sinun pitää tehdä gif-kuva, siihen saat laitettua animaation. Sitten vaan laitat sen samanlailla avatariksesi kuin tavallisenkin kuvan.
Minuakin ihmetyttää se, miten GIF-formaattiin voi tehdä animaatioita, ja voiko niitä tehdä sinun Animaattori v.3 ?

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 9:44 am
by axu
Konstaduck wrote:Olen tässä taas mietiskellyt syvällisiä, ja yksi, mikä jäi kiusaamaan on animaatio avatarissa.

Kokeilin haulla etsiä, mutta löytyi vaan sen avatarin muilta sivuilta lataamis estojuttui jne jne.

Eli miten saisin animaation avatariini? Meneekö se samalla tavalla, kuin tuo CB:n animaatiokuva?

vastauksia odotellen, Konstaduck
Ja jos ihmettelet, miten GIF-kuvia tehdään, siihen löytyy ilmaisia ohjelmia. En voi olla mainostamatta omaa ratkaisuani: GIF-kuvan tallennin :D
Oma avatarini on koodaamalla animoitu ja tallennettu tuolla funktiolla.

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 9:54 am
by Latexi95
skorpioni-cb wrote:...ja voiko niitä tehdä sinun Animaattori v.3 ?
Valitettavasti ei.

Pitäisi jossain vaiheessa sitäkin taas jatkaa (tai aloittaa koodaaminen alusta), mutta nyt kyllä cbEnchanted menee edelle (Typet voisi ehkä saada toimimaan tänään).

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 1:38 pm
by Akuji
Miksi tässä koodissa toimii vain toinen kohdista 1 ja 2. Eli jos esimerkiksi otan kohdan yksi pois, toimii kohta 2 ja toisinpäin, mutta yhdessä ne eivät toimi. Tämän siis pitäisi toimia niin, että kun liikutat hiirtä joko oikealle tai vasemmalle, ohjelma sammuu.

Code: Select all

#1
If MouseMoveX()=1 Then
End
EndIf

#2
If MouseMoveX()=-1 Then
End
EndIf

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 2:25 pm
by Latexi95
Akuji wrote:Miksi tässä koodissa toimii vain toinen kohdista 1 ja 2. Eli jos esimerkiksi otan kohdan yksi pois, toimii kohta 2 ja toisinpäin, mutta yhdessä ne eivät toimi. Tämän siis pitäisi toimia niin, että kun liikutat hiirtä joko oikealle tai vasemmalle, ohjelma sammuu.

Code: Select all

#1
If MouseMoveX()=1 Then
End
EndIf

#2
If MouseMoveX()=-1 Then
End
EndIf
Se johtuu siitä, että MouseMove* vertaa liikettä edelliseen saman funktion kutsuun taikka DrawScreeniin. Eli MouseMoveX kannattaa yleensä laittaa muuttujaan silmukan alussa. (Ja sitten varmaan kannattaa vaihtaa yhtäsuuruusmerkit suurempi-kuin- ja pienempi-kuin -merkkeihin.

Code: Select all

mx = MouseMoveX()
#1
If mx>0 Then
End
EndIf

#2
If mx<0 Then
End
EndIf
[/quote]

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 5:32 pm
by axu
Latexi95 wrote:Se johtuu siitä, että MouseMove* vertaa liikettä edelliseen saman funktion kutsuun taikka DrawScreeniin. Eli MouseMoveX kannattaa yleensä laittaa muuttujaan silmukan alussa. (Ja sitten varmaan kannattaa vaihtaa yhtäsuuruusmerkit suurempi-kuin- ja pienempi-kuin -merkkeihin.
Muistaakseni MouseMove-komennot vertailevat pelkästään edelliseen kutsumiskertaan eikä DrawScreeniin. Jos jollakin kierroksella ei tarvitse tietää MouseMoven arvoa, kannattaa sitä kutsua, ettei seuraavalla kutsumiskerralla rekisteröidä tarpeettoman suurta liikettä (kirjoita vaikka tmp = MouseMoveX() + MouseMoveY()).

Re: Tyhmät kysymykset (I/2011)

Posted: Thu Mar 15, 2012 5:39 pm
by Latexi95
axu wrote: Muistaakseni MouseMove-komennot vertailevat pelkästään edelliseen kutsumiskertaan eikä DrawScreeniin. Jos jollakin kierroksella ei tarvitse tietää MouseMoven arvoa, kannattaa sitä kutsua, ettei seuraavalla kutsumiskerralla rekisteröidä tarpeettoman suurta liikettä (kirjoita vaikka tmp = MouseMoveX() + MouseMoveY()).
Totta. No niinhän tuo meneekin.

Ammusta tuhotessa MAV

Posted: Thu Mar 22, 2012 6:43 pm
by VerkkoGuru
Olen tekemässä peliä, jossa vihollinen jahtaa pelaaja, ja pelaaja puolustautuu aseella. Ongelmaksi kuitenkin tuli, että kun kuvittelin viimein saavani pelin perusidean toimimaan, niin peli alkoi MAVittamaan luotien poistovaiheessa?

Koodi tässä:

Code: Select all

Type LUODIT
Field obj
EndType

FrameLimit 60

health%=100
pisteet%=0
VihunHealth%=100

ukko=LoadObject("Media/guy.bmp",360)
pati=LoadObject("Media/bullet.bmp")
vihollinen=LoadObject("media/soldier.bmp",180)

ShowObject pati, OFF
PositionObject vihollinen,ObjectX(ukko)+100,ObjectY(ukko)+100

ObjectInteger ukko,health
ObjectInteger vihollinen,VihunHealth

Repeat

PointObject vihollinen,ukko

If ObjectsOverlap(vihollinen,ukko,3) Then health=health-1   
MoveObject vihollinen,+1

    If LeftKey() Then TurnObject ukko,-1
    If RightKey() Then TurnObject ukko,+1
    
    If DownKey() Then MoveObject ukko,Float(-1.25) 
    If UpKey() Then MoveObject ukko,Float(+1.5)
    
    If KeyDown(cbkeyA) Then MoveObject ukko,0,-1
    If KeyDown(cbkeyD) Then MoveObject ukko,0,+1
    
        If KeyDown(57) And reload=0 Then
   ammus.LUODIT = New(LUODIT)
   ammus\obj=CloneObject(pati)
           CloneObjectOrientation ammus\obj,ukko
        CloneObjectPosition ammus\obj,ukko        

        reload=4        
        EndIf 
        
        For ammus.LUODIT = Each LUODIT 
        MoveObject ammus\obj,+1
        If Distance2(ammus\obj,ukko)>200 Then
            DeleteObject ammus\obj
            Delete ammus.LUODIT 
        EndIf 

            If ObjectsOverlap(ammus\obj,vihollinen) Then
            VihunHealth=-1
                        DeleteObject ammus\obj
            Delete ammus.LUODIT 
            EndIf 
        
        Next ammus.LUODIT 
         
   If reload>0 Then reload=reload-1
   
If VihunHealth=0 Then
pisteet=pisteet+100   
PositionObject vihollinen,Rand(0,400),Rand(0,600)
EndIf

If health=0 Then
pisteet=pisteet-20
health=100
PositionObject ukko,0,0
EndIf

Text 0,0,"Pelaajan elämät:"+health
Text 0,16,"Vihollisen elämät:"+VihunHealth
Text 0,32,"Pisteet:"+pisteet

Box 160,0,health,16,1
Box 160,17,VihunHealth,16,1

        DrawScreen
   
Until EscapeKey()

Re: Ammusta tuhotessa MAV

Posted: Thu Mar 22, 2012 7:03 pm
by Latexi95
VerkkoGuru wrote:Olen tekemässä peliä, jossa vihollinen jahtaa pelaaja, ja pelaaja puolustautuu aseella. Ongelmaksi kuitenkin tuli, että kun kuvittelin viimein saavani pelin perusidean toimimaan, niin peli alkoi MAVittamaan luotien poistovaiheessa?

Koodi tässä:

Code: Select all

Type LUODIT
Field obj
EndType

FrameLimit 60

health%=100
pisteet%=0
VihunHealth%=100

ukko=LoadObject("Media/guy.bmp",360)
pati=LoadObject("Media/bullet.bmp")
vihollinen=LoadObject("media/soldier.bmp",180)

ShowObject pati, OFF
PositionObject vihollinen,ObjectX(ukko)+100,ObjectY(ukko)+100

ObjectInteger ukko,health
ObjectInteger vihollinen,VihunHealth

Repeat

PointObject vihollinen,ukko

If ObjectsOverlap(vihollinen,ukko,3) Then health=health-1   
MoveObject vihollinen,+1

    If LeftKey() Then TurnObject ukko,-1
    If RightKey() Then TurnObject ukko,+1
    
    If DownKey() Then MoveObject ukko,Float(-1.25) 
    If UpKey() Then MoveObject ukko,Float(+1.5)
    
    If KeyDown(cbkeyA) Then MoveObject ukko,0,-1
    If KeyDown(cbkeyD) Then MoveObject ukko,0,+1
    
        If KeyDown(57) And reload=0 Then
   ammus.LUODIT = New(LUODIT)
   ammus\obj=CloneObject(pati)
           CloneObjectOrientation ammus\obj,ukko
        CloneObjectPosition ammus\obj,ukko        

        reload=4        
        EndIf 
        
        For ammus.LUODIT = Each LUODIT 
        MoveObject ammus\obj,+1
        If Distance2(ammus\obj,ukko)>200 Then
            DeleteObject ammus\obj
            Delete ammus.LUODIT 
        EndIf 

            If ObjectsOverlap(ammus\obj,vihollinen) Then
            VihunHealth=-1
                        DeleteObject ammus\obj
            Delete ammus.LUODIT 
            EndIf 
        
        Next ammus.LUODIT 
         
   If reload>0 Then reload=reload-1
   
If VihunHealth=0 Then
pisteet=pisteet+100   
PositionObject vihollinen,Rand(0,400),Rand(0,600)
EndIf

If health=0 Then
pisteet=pisteet-20
health=100
PositionObject ukko,0,0
EndIf

Text 0,0,"Pelaajan elämät:"+health
Text 0,16,"Vihollisen elämät:"+VihunHealth
Text 0,32,"Pisteet:"+pisteet

Box 160,0,health,16,1
Box 160,17,VihunHealth,16,1

        DrawScreen
   
Until EscapeKey()
Kun poistat luodin, kun se menee liian kauas, niin tarkistat sen jälkeen onko luoti vihollisen päällä. Siinä tuolee MAV. Laita ElseIf, niin että et tarkista törmäyksiä vihollisten kanssa, kun olet jo poistanut luodin.

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 6:19 pm
by skorpioni-cb
Minä en tiedä onko tämä kysymys oikeastaan tyhmä, mutta tämä liittyy cbNetworkkiin:
olen tekemässä peliä nimeltään Pong Reloaded, nimestä voi jo päätellä minkälainen nimi on kyseessä, mutta kun mä oon tehnyt infotavut ylös ja alas liikkumiseen, niin herää kysymys, mistä tiedän kumpi/mikä(koska yritän tehdä semmoista tournment-tyylistä PONG-moninpeliä) clientti sen lähetti, olen tehnyt tyypin pelaajalle, joka sisältää ainakin usernamen, ID:n, pisteet, koordinaatit ja vastustajan ID:n

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 6:34 pm
by valscion
skorpioni-cb wrote:Minä en tiedä onko tämä kysymys oikeastaan tyhmä, mutta tämä liittyy cbNetworkkiin:
olen tekemässä peliä nimeltään Pong Reloaded, nimestä voi jo päätellä minkälainen nimi on kyseessä, mutta kun mä oon tehnyt infotavut ylös ja alas liikkumiseen, niin herää kysymys, mistä tiedän kumpi/mikä(koska yritän tehdä semmoista tournment-tyylistä PONG-moninpeliä) clientti sen lähetti, olen tehnyt tyypin pelaajalle, joka sisältää ainakin usernamen, ID:n, pisteet, koordinaatit ja vastustajan ID:n
Palvelimen puolella voit katsoa clientin ID:n muuttujasta NET_ClientId$ ServerRead() funktion kutsun jälkeen ja sitten verrata sitä tyyppisi jäseniin. Näin saat tietoosi sen, että keneltä sitä dataa tulee.

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 7:19 pm
by skorpioni-cb
VesQ wrote:
skorpioni-cb wrote:Minä en tiedä onko tämä kysymys oikeastaan tyhmä, mutta tämä liittyy cbNetworkkiin:
olen tekemässä peliä nimeltään Pong Reloaded, nimestä voi jo päätellä minkälainen nimi on kyseessä, mutta kun mä oon tehnyt infotavut ylös ja alas liikkumiseen, niin herää kysymys, mistä tiedän kumpi/mikä(koska yritän tehdä semmoista tournment-tyylistä PONG-moninpeliä) clientti sen lähetti, olen tehnyt tyypin pelaajalle, joka sisältää ainakin usernamen, ID:n, pisteet, koordinaatit ja vastustajan ID:n
Palvelimen puolella voit katsoa clientin ID:n muuttujasta NET_ClientId$ ServerRead() funktion kutsun jälkeen ja sitten verrata sitä tyyppisi jäseniin. Näin saat tietoosi sen, että keneltä sitä dataa tulee.
Kiitti, täytynee kattoo kunhan pääsen niin pitkälle koodauksessa, mutta nyt kun olen saanut clientin yhdistämään servuun, niin tulee ongelma, nimittäin kun yhden kerran yksi client yhdistää mun servuun, niin servun "konsoli-ikkunaan" tulee floodina viestejä, että uusi client on yhdistänyt, ja silleen, tässä clientin ja serverin koodit tähän asti, clientin käynnistykseen tarvitsee testimielessä komentorivi-parametreja:

Serveri:

Code: Select all

Include "Libs\cbNetwork.cb" //Includes networking stuff
Include "Libs\Nettivakiot.cb" //Includes some constans what you can use in networking

Type PELAAJA //Määritellään Clientin muuttujia
	Field id As String
	Field points As Byte
	Field name As String
	Field x As integer
	Field y As integer
	Field opponent As String
EndType

SAFEEXIT OFF
//tarkistetaan onko komento validi
//jos ei, poistutaan
//jos on, aloitetaan serveri
If Len(CommandLine())=0 Then
	MakeError "Usage: Server.exe <PORT>"
	End
ElseIf Int(CommandLine())=0 Then
	MakeError "You had been used incorrct parameter into port!"
	End
Else 
	infoByte = 0
	InitServer( Int(CommandLine()), 200 )
	SetWindow "Server"
	_Net_InitMemBlock()
	Repeat
		rtn = ServerRead()
		// Jos datan vastaanotto onnistui
		If rtn = 0 Then
			// Luetaan "turha" muistipalan koko
			_Net_GetInt()
			
			// Luetaan dataa
			infoByte = _Net_GetByte()
		EndIf
		If infoByte = INFO_STARTING_CONNECTION Then
			// Uusi käyttäjä linjoilla
			
			user.PELAAJA = New(PELAAJA)
			user\id = Net_ClientId
			user\name = _Net_getString()
			user\x = 0
			user\y = 0
			user\opponent = ""
			Print "Server: New user was connected succesfully"
			
		ElseIf infoByte = INFO_CLOSING_CONNECTION Then
			// Client on sulkemassa yhteyttä
			Print "Server: User was loged out"
		ElseIf infoByte = INFO_GET_PLAYERLIST Then
			// Client haluaa pelaajalistan
			Print "Server: User wants playerlist, let's send it To him/her"
			
		ElseIf infoByte = INFO_MOVE_UP Then
			//Client liikkuu ylös, miten reagoidaan
			aktiivinen.PELAAJA = 0
			For user.PELAAJA = Each PELAAJA
				If user\id = NET_ClientId Then
					aktiivinen=user
				EndIf
			Next user
			aktiivinen\y = aktiivinen\y - 2
		ElseIf infoByte = INFO_MOVE_DOWN Then
			//Kuten yllä mutta vain silloin kun liikutaan alas
			aktiivinen.PELAAJA = 0
			For user.PELAAJA = Each PELAAJA
				If user\id = NET_ClientId Then
					aktiivinen=user
				EndIf
			Next user
			aktiivinen\y = aktiivinen\y + 2
		EndIf
	Forever
EndIf
Client:

Code: Select all

Include "Libs\cbNetwork.cb" //Includes networking stuff
Include "Libs\Nettivakiot.cb" //Includes some constans what you can use in networking

FrameLimit 40
//Player 1 variables
pelaajay=0
pelaajakorkeus=0
pelaajaleveys=0
//Player 2 variables(oppoment)
pelaaja2y=0
pelaaja2korkeus=0
pelaaja2leveys=0

//Networking stuff
Dim rtn As Integer
rtn = InitClient(GetWord(CommandLine(),1),Int(GetWord(CommandLine(),2)))
If rtn <> 0 Then MakeError GetNetErrorString( rtn )

// Alustetaan muistipala
_Net_InitMemBlock()

// Lähetetään serverille tavu, josta se tietää, että client on uusi. 
// INFO_STARTING_CONNECTION = 255
_Net_PutByte( INFO_STARTING_CONNECTION )
ClientSend()

rtn = ClientRead()

// Jos tietojen luku onnistui
If rtn = 0 Then
    // Luetaan muistipalan alusta sen koko
    _Net_GetInt()

    // Luetaan "infotavu"
    infoByte = _Net_GetByte()
    
    If infoByte = INFO_STARTING_CONNECTION Then
        // Serveri hyväksyi yhteyden
		_Net_PutByte( INFO_IDLE )
		ClientSend()
    ElseIf infoByte = INFO_CLOSING_CONNECTION Then
        // Serveri vastasi "quit"-viestiin
    ElseIf infoByte = INFO_GET_PLAYERLIST Then
        // Pelaajalista tulossa
        // Tässä kohtaa serveriltä tulisi myös pelaajalista
    EndIf
EndIf 
BTW. jos haluutte testata serveriä, niin teidän pitää tehdä siitä .exe jotta se ja clientti voitaisiin ajaa samaan aikaan :D

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 7:28 pm
by valscion
Unohdat klientin puolella tyhjentää ClientSend() funktion jälkeen muistipalan sisällön komennolla _Net_InitMemBlock(), joten vanha sisältö lähetetään uudelleen palvelimelle ja se INFO_STARTING_CONNECTION paketti siis lähtee aina vaan uudelleen.

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 7:37 pm
by skorpioni-cb
VesQ wrote:Unohdat klientin puolella tyhjentää ClientSend() funktion jälkeen muistipalan sisällön komennolla _Net_InitMemBlock(), joten vanha sisältö lähetetään uudelleen palvelimelle ja se INFO_STARTING_CONNECTION paketti siis lähtee aina vaan uudelleen.
Mihin mä sen _Net_InitMemBlock()-funkkarin oikein laitan tarkalleen, sinne paikkaan mikä on se missä lähetän sen Info_IDLE-jutun

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 7:41 pm
by valscion
skorpioni-cb wrote:
VesQ wrote:Unohdat klientin puolella tyhjentää ClientSend() funktion jälkeen muistipalan sisällön komennolla _Net_InitMemBlock(), joten vanha sisältö lähetetään uudelleen palvelimelle ja se INFO_STARTING_CONNECTION paketti siis lähtee aina vaan uudelleen.
Mihin mä sen _Net_InitMemBlock()-funkkarin oikein laitan tarkalleen, sinne paikkaan mikä on se missä lähetän sen Info_IDLE-jutun
Vastaanpa lainaamalla omasta viestistäni tärkeän kohdan.
Unohdat klientin puolella tyhjentää ClientSend() funktion jälkeen muistipalan sisällön komennolla _Net_InitMemBlock()

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 8:29 pm
by skorpioni-cb
VesQ wrote:
skorpioni-cb wrote:
VesQ wrote:Unohdat klientin puolella tyhjentää ClientSend() funktion jälkeen muistipalan sisällön komennolla _Net_InitMemBlock(), joten vanha sisältö lähetetään uudelleen palvelimelle ja se INFO_STARTING_CONNECTION paketti siis lähtee aina vaan uudelleen.
Mihin mä sen _Net_InitMemBlock()-funkkarin oikein laitan tarkalleen, sinne paikkaan mikä on se missä lähetän sen Info_IDLE-jutun
Vastaanpa lainaamalla omasta viestistäni tärkeän kohdan.
Unohdat klientin puolella tyhjentää ClientSend() funktion jälkeen muistipalan sisällön komennolla _Net_InitMemBlock()
Joojoo, mutta se silti lähettää sitä pakettia mitä ilmeisimmin kun se jatkaa sitä kokoajan sitä viestin tulostusta

Re: Tyhmät kysymykset (I/2011)

Posted: Tue Mar 27, 2012 10:54 pm
by valscion
Et muuta palvelimen puolella infoByte muuttujaa enää sen jälkeen, kun olet kerran sen lukenut. Aseta infoByte vaikkapa nollaksi ennen kuin kutsut funktiota ServerRead() niin ei tule vääriä ilmoituksia.

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 28, 2012 7:03 am
by skorpioni-cb
VesQ wrote:Et muuta palvelimen puolella infoByte muuttujaa enää sen jälkeen, kun olet kerran sen lukenut. Aseta infoByte vaikkapa nollaksi ennen kuin kutsut funktiota ServerRead() niin ei tule vääriä ilmoituksia.
Joo täytynee kokeilla, mä taidan tehä ekan julkasuversion jälkeen node.js-version servusta, miten se ajetaan sitten kun se on tehty?

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 28, 2012 8:43 am
by Latexi95
skorpioni-cb wrote: Joo täytynee kokeilla, mä taidan tehä ekan julkasuversion jälkeen node.js-version servusta, miten se ajetaan sitten kun se on tehty?
Itse en ole ikinä käyttänyt node.js:ssää, mutta googlettamalla "node.js" tuo selvisi. Eli lataa tuo node.js ja sitten vain konsolilta: "node <tiedosto jossa koodi on>". Suosittelen googlen käyttöä. Tuollaiseen kysymykseen löytää vastauksen nopeammin googlen avulla kuin kysymällä foorumeilta.

Re: Tyhmät kysymykset (I/2011)

Posted: Wed Mar 28, 2012 3:29 pm
by Viltzu
skorpioni-cb wrote:
VesQ wrote:Et muuta palvelimen puolella infoByte muuttujaa enää sen jälkeen, kun olet kerran sen lukenut. Aseta infoByte vaikkapa nollaksi ennen kuin kutsut funktiota ServerRead() niin ei tule vääriä ilmoituksia.
Joo täytynee kokeilla, mä taidan tehä ekan julkasuversion jälkeen node.js-version servusta, miten se ajetaan sitten kun se on tehty?
viewtopic.php?p=58213#p58213
Tähän tapaan varmaan onnistuu.