Apua typejen kanssa

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Turtle Productions
Member
Posts: 91
Joined: Thu Dec 20, 2007 11:11 am
Location: Espoo

Apua typejen kanssa

Post by Turtle Productions »

Moi. Oon tässä tenhyt sellaista laudoilla ylöspäin hyppypeliä ja eteeni on tullut ongelma: en osaa tehdä komentoa jolla saisin lautojen määrän vähentymään ylöspäin mennessä, kauas asti tai sillain että niitä tehdään kokoajan lisää kun noustaan, mutta aina vähän vähemmän.
Siis minulla on koodit nyt jotenkin näin:

Code: Select all

For i=1 to 100
  objektin teen (typeillä)
  positionobject \obj,0,rand(0,3000)
next i
For i=1 to 70
  saman objektin teen (typeillä)
  positionobject obj\obj,0,rand(3010,4500)
next i
For i=1 to 30 määrä pienenee...
  saman objektin teen (typeillä)
  positionobject obj\obj,0,rand(4510,5000) alue pienenee kun määrä pienenee...
next i
Tuo on vain esimerkki, ei koko koodia koska olen eri koneella nyt. Eli haluan tuon yhdeksi jatkuvaksi komennoksi.
Uskon että tuo on mahdollista (siis mitä haluan mutten osaa).

TP
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
|T|u|r|t|l|e| |P|r|o|d|u|c|t|i|o|n|s|
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Apua typejen kanssa

Post by Awaclus »

Itse toteuttaisin suunnilleen näin:

Code: Select all

Level = Int(mistäikinäsenlasketkaan)

If Rand (1,Level) = 1 Then teeuusipalikka
Turtle Productions
Member
Posts: 91
Joined: Thu Dec 20, 2007 11:11 am
Location: Espoo

Re: Apua typejen kanssa

Post by Turtle Productions »

Siis tarkoitan, että aina ylöspäin mentäessä tulisi lautoja lisää, mutta aina hieman vähemmän.
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
|T|u|r|t|l|e| |P|r|o|d|u|c|t|i|o|n|s|
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Apua typejen kanssa

Post by Viltzu »

Turtle Productions wrote:Siis tarkoitan, että aina ylöspäin mentäessä tulisi lautoja lisää, mutta aina hieman vähemmän.
Haluat enemmän lautoja... Mutta silti vähemmän?
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Apua typejen kanssa

Post by Awaclus »

Viltzu wrote:
Turtle Productions wrote:Siis tarkoitan, että aina ylöspäin mentäessä tulisi lautoja lisää, mutta aina hieman vähemmän.
Haluat enemmän lautoja... Mutta silti vähemmän?
Niin, eli ylöspäin mentäessä lautoja tulee vähemmän lisää kuin alhaalla, mutta silti niitä tulee lisää. Tuo minun koodini tekee juuri sillä tavalla.
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Apua typejen kanssa

Post by DatsuniG »

Jotain tämän kaltaista?

Code: Select all

If PelaajaY > LastPalikkaY + Korkeus Then
    add.PALIKKA = New(PALIKKA)
    add\y = LastPalikkaY + Korkeus
    add\x = Rand(0, Screenwidth() - Palikkaleveys)
    Palikkamäärä + 1
    LastPalikkaY = LastPalikkaY + Korkeus
EndIf 

If Palikkamäärä > MaksimiPalikkaMäärä Then 
    add.PALIKKA = Last(PALIKKA)
    Delete add
    Palikkamäärä - 1
EndIf 
Hengität nyt manuaalisesti.
Turtle Productions
Member
Posts: 91
Joined: Thu Dec 20, 2007 11:11 am
Location: Espoo

Re: Apua typejen kanssa

Post by Turtle Productions »

Tuollaista meinasin mutta en vain osaa tehdä sitä toimivaksi. Yritin tuota asettamalla kaikki muuttujat oikeisiin koodini kohtiin, muttei onnistunut. Tein pikaisen lyhyen koodin pelistäni jos joku osaisi sen avulla auttaa.

Code: Select all

FrameLimit 40
ukko=LoadObject("media\tatti.bmp")
Const Grav = -0.1
yPlus#=0

img=MakeImage(100,100)
    DrawToImage img
    For i=1 To 50
        Color cbblue
        Dot Rand(1,100),Rand(1,100)
    Next i
        Color cbred
        Circle Rand(1,100),Rand(1,100),3,ON
    DrawToScreen
        floor=MakeObjectFloor()
PaintObject floor,img

camera=MakeObject()

Repeat
PositionObject camera,0,ObjectY(ukko)

If LeftKey() Then x-1
If RightKey() Then x+1
If x>5 Then x-2
If x<-5 Then x+2

TranslateObject ukko,x,yPlus#
If yPlus>7 Then yPlus-4
If yPlus<-7 Then yPlus+4
yPlus=yPlus+Grav

CloneCameraPosition camera

DrawScreen
Forever
Kiitos
TP
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
|T|u|r|t|l|e| |P|r|o|d|u|c|t|i|o|n|s|
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
Turtle Productions
Member
Posts: 91
Joined: Thu Dec 20, 2007 11:11 am
Location: Espoo

Re: Apua typejen kanssa

Post by Turtle Productions »

Sori nyt tuplaposti, mutta kukaan ei taida jaksaa auttaa tuon koodini kanssa?
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
|T|u|r|t|l|e| |P|r|o|d|u|c|t|i|o|n|s|
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Apua typejen kanssa

Post by SPuntte »

Turtle Productions wrote:Sori nyt tuplaposti, mutta kukaan ei taida jaksaa auttaa tuon koodini kanssa?
Ymmärtääkseni yrität tehdä peliä, jossa hypitään askelmalta toiselle jatkuvasti ylöspäin edeten. Ennenkuin yrität ratkaista mainitsemaasi ongelmaa askelmien synnyttämisestä ruudun yläosaan sinulla tulisi olla jokin pohja itse askelmille ja muulle pelimekaniikalle. Onko sinulla mitään tällaista pohjaa?

Mikäli ei, yritä ensin toteuttaa pelihahmon kontrollointi, painovoima ja muu fysiikka yhden askelman kanssa. Tyyppikokoelmat ovat vain kehysrakenne, jolla on helppo käsitellä kasaa jotain olioita, mutta tästä rakenteesta ei ole mitään hyötyä, jos ei ole mitään listaan laitettavaa. Kun pelin perusmekaniikka on kasassa, voit alkaa miettiä vaikeampien asioiden toteutusta.

Joskus on hyvä lähteä ihan peruskysymyksistä: mikä on pelin tavoite? Miten pelin voi voittaa, tai voiko sitä? Mihin peli päättyy? Kuvauksesi kaltainen tasohyppely on mitä tylsin, mikäli siinä ei ole jotain tavoitetta, vaihtelua tai haastetta. Esimerkiksi jotain kerättäviä esineitä, ansoja ja vihollisia - tai vaikka alhaalta ylös vääjäämättömästi etenevä "maailmanloppu", jota on tarkoitus paeta.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Turtle Productions
Member
Posts: 91
Joined: Thu Dec 20, 2007 11:11 am
Location: Espoo

Re: Apua typejen kanssa

Post by Turtle Productions »

Siis minulla on kaikki muu valmiina paitsi se koodina.
Tässä koko koodini tähän asti

Code: Select all

FrameLimit 40
Type LAUDAT
    Field obj
    Field y
    Field x
EndType

Type PISTEET
    Field obj
EndType

Type JUMPERIT
    Field obj
EndType
Const PAINOVOIMA = -0.1
yPlus#=0
SetWindow "SuperJump"

kuolema=MakeObject()
kuolkuva=MakeImage(400,400)
DrawToImage kuolkuva
Color cbred
Box 0,0,400,400,1
DrawToScreen
PaintObject kuolema,-kuolkuva


mpiste=LoadObject("piste.bmp")
ShowObject mpiste,OFF
MaskObject mpiste,cbmagenta
mlauta=LoadObject("fartlaita.bmp")
ShowObject mlauta,OFF
bonus=LoadSound("bonus.wav")
jump=LoadSound("jump.wav")
jump2=LoadSound("jump2.wav")
start=LoadSound("start.wav")
hurt=LoadSound("hurt.wav")
hurt2=LoadSound("hurt2.wav")
jump3=LoadSound("jump3.wav")
PlaySound start
For i=1 To 10
piste.PISTEET=New(PISTEET)
piste\obj=CloneObject(mpiste)
PaintObject piste\obj,mpiste
PositionObject piste\obj,Rand(150,-150),Rand(0,8000)
ShowObject piste\obj,ON
Next i

'tässä on se mitä pitäisi muuttaa------------
For i=1 To 100
lauta.LAUDAT=New(LAUDAT)
lauta\obj=CloneObject(mlauta)
PaintObject lauta\obj,mlauta
PositionObject lauta\obj,Rand(150,-150),Rand(0,3000)
ShowObject lauta\obj,ON
Next i
For i=1 To 65
lauta.LAUDAT=New(LAUDAT)
lauta\obj=CloneObject(mlauta)
PaintObject lauta\obj,mlauta
PositionObject lauta\obj,Rand(150,-150),Rand(3010,5000)
ShowObject lauta\obj,ON
Next i
For i=1 To 45
lauta.LAUDAT=New(LAUDAT)
lauta\obj=CloneObject(mlauta)
PaintObject lauta\obj,mlauta
PositionObject lauta\obj,Rand(150,-150),Rand(5010,6000)
ShowObject lauta\obj,ON
Next i
For i=1 To 28
lauta.LAUDAT=New(LAUDAT)
lauta\obj=CloneObject(mlauta)
PaintObject lauta\obj,mlauta
PositionObject lauta\obj,Rand(150,-150),Rand(6010,6700)
ShowObject lauta\obj,ON
Next i
For i=1 To 15
lauta.LAUDAT=New(LAUDAT)
lauta\obj=CloneObject(mlauta)
PaintObject lauta\obj,mlauta
PositionObject lauta\obj,Rand(150,-150),Rand(6710,7300)
ShowObject lauta\obj,ON
Next i
For i=1 To 10
lauta.LAUDAT=New(LAUDAT)
lauta\obj=CloneObject(mlauta)
PaintObject lauta\obj,mlauta
PositionObject lauta\obj,Rand(150,-150),Rand(7310,7650)
ShowObject lauta\obj,ON
Next i
'tähän asti-------------------------

mjumper=LoadAnimObject("jumper.bmp",30,30,0,3)
MaskObject mjumper,cbmagenta
ShowObject mjumper,OFF

For i=1 To 3
jumper.JUMPERIT=New(JUMPERIT)
jumper\obj=CloneObject(mjumper)
PaintObject jumper\obj,mjumper
PositionObject jumper\obj,Rand(-100,100),Rand(500,8000)
ShowObject jumper\obj,ON
Next i


ukko=LoadObject("PALLO.bmp")
MaskObject ukko,cbmagenta
camera=MakeObject()
a=1
ky=-400
elkut=3
elkku1=MakeObject()
PaintObject elkku1,ukko
ScreenPositionObject elkku1,-15,18
ShowObject elkku1,ON
elkku2=MakeObject()
PaintObject elkku2,ukko
ScreenPositionObject elkku2,-12,18
ShowObject elkku2,ON
elkku3=MakeObject()
PaintObject elkku3,ukko
ScreenPositionObject elkku3,-9,18
ShowObject elkku3,ON

korkeus=5
maksimipalikkamäärä=10
palikkamäärä=5
palikkaleveys=5
         Repeat
pelaajaY=ObjectY(ukko)

If PelaajaY > LastPalikkaY + Korkeus Then
    lauta.LAUDAT = New(LAUDAT)
    lauta\y = LastPalikkaY + Korkeus
    lauta\obj=CloneObject(mlauta)
    PaintObject lauta\obj,mlauta
    ShowObject lauta\obj,ON
    lauta\x = Rand(0, ScreenWidth() - Palikkaleveys)
    Palikkamäärä + 1
    LastPalikkaY = LastPalikkaY + Korkeus
EndIf

If Palikkamäärä > MaksimiPalikkaMäärä Then
    lauta.LAUDAT = Last(LAUDAT)
    Delete lauta
    Palikkamäärä - 1
EndIf 

ScreenPositionObject elkku1,30,40        
ScreenPositionObject elkku2,60,40
ScreenPositionObject elkku3,90,40
If elkut=3 Then ShowObject elkku1,ON : ShowObject elkku2,ON : ShowObject elkku3,ON
If elkut=2 Then ShowObject elkku1,ON : ShowObject elkku2,ON : ShowObject elkku3,OFF
If elkut=1 Then ShowObject elkku1,ON : ShowObject elkku2,OFF : ShowObject elkku3,OFF
If elkut=0 Then ShowObject elkku1,OFF : ShowObject elkku2,OFF : ShowObject elkku3,OFF

If a=1 Then yPlus+6 : a-1
Text 10,10,"Score: "+score
PositionObject kuolema,0,ky
PositionObject camera,0,ObjectY(ukko)
ukkx=ObjectX(ukko)
ukky=ObjectY(ukko)

ky=ky+2
soundrand=Rand(1,2)
For lauta.LAUDAT =Each LAUDAT
    If ObjectsOverlap(ukko,lauta\obj,3) And Timer()>reload+500 Then 
    yPlus#=yPlus#+Rand(4,7) 
    reload=Timer()
    score+10 
    If soundrand=1 Then PlaySound jump
    If soundrand=2 Then PlaySound jump2
EndIf
Next lauta
For piste.PISTEET =Each PISTEET
    If ObjectsOverlap(ukko,piste\obj,3) Then score+50 : DeleteObject piste\obj : Delete piste : PlaySound bonus
Next piste

If ObjectsOverlap(ukko,kuolema,3) And elkut=0 Then PlaySound hurt : MakeError "Game over, score: "+score
If ObjectsOverlap(ukko,kuolema,3) And elkut>0 And Timer()>reload+500 Then PlaySound hurt2 : elkut-1 : yPlus#+10 : reload=Timer()

For jumper.JUMPERIT=Each JUMPERIT
PlayObject jumper\obj,0,3,0.15
If ObjectsOverlap(ukko,jumper\obj,1) Then yPlus+15 : PlaySound jump3
Next jumper

TranslateObject ukko,x,yPlus#
If yPlus>7 Then yPlus-4
If yPlus<-7 Then yPlus+4
yPlus=yPlus+PAINOVOIMA
If KeyHit(cbkeyspace) Then yPlus#=yPlus#+4
If LeftKey() Then MoveObject ukko,-4
If RightKey() Then MoveObject ukko,4
If ukkx<-200 Then PositionObject ukko,200,ukky
If ukkx>200 Then PositionObject ukko,-200,ukky

CloneCameraPosition camera

DrawScreen
Forever
Se toimii tuollakin tavalla muttei siinä pääse loputtomiin asti ylöspäin.

Kiitos
TP
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
|T|u|r|t|l|e| |P|r|o|d|u|c|t|i|o|n|s|
+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Apua typejen kanssa

Post by SPuntte »

Tuli mieleen tällainen idea: pelin alussa asetetaan vaikeustason perusteella, jokin arvo, joka kuvaa korkeutta, joka pelihahmon on noustava, että luodaan uusi askelma. Kun pelihahmo nousee riittävästi, luodaan uusi askelma ja astetaan uusi korekusero, joka tulee ylittää, että seuraava askelma luodaan. Näin jatketaan loputtomiin. Mikäli korkeuseroa lisätään kokoajan saman verran, vaikeustaso nousee lineaarisesti, mutta toki sen voi tehdä myös kiihtyväksi.

puolipseudokoodina edellinen voisi olla jotain tällaista:

Code: Select all

luoEnsimäisetAskelmat()
korkeusLisä = *jotain*
wanhaKorkeus = pelaajaY
Repeat
    If pelaajaY > wanhaKorkeus + korkeusLisä Then
        wanhaKorkeus = pelaajaY
        korkeusLisä = korkeusLisä + *jotain*
        askelma = New(LAUDAT)
        PositionObject askelma, cameraX() + Rand(-ScreenW/2, ScreenW), CameraY + ScreenH/2 + *jokin vakioarvo* + Rand(*jokin pieni arvo*)
    Endif
    *muu toiminnallisuus tähän*
Forever
Ruudun alareunasta poistuneet askelmat tulee tietysti poistaa, ettei askelmia keräänny muistiin ja peli hidastu ;]
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Post Reply