Vinnaren i pepparkakshustävlingen!
2011-06-12, 17:10
  #1
Avstängd
Tja håller på med en "läxa", igen, som jag inte förstår mig riktigt på O.o
kan någon kolla vad som fattas här?
b.la box2 är en del av uppgiften att sätta till en box som går i Y led medan den första boxen går i X led, men när jag får in min andra box att röra sig så blir min X-box osynlig?
sedan en annan grej är:
koden där nere som är:
Kod:
#lagg till en if-sats som kollar om box_x ar pa vag ut fran fonstret
    def checkBounds():        

det är för att kolla ifall den håller på gå utanför fönstret, hur får jag den att fungera? :S testat slå in allt möjligt där men den fortsätter ut som om koden inte fanns alls, fått till det så att if satsen under denna, If checkBounds > 0: box_x=0 men då rör inte boxen sig alls? hmm

Kod:
""" moveBox.py
    illustrates basic motion
    in the IDEA/ALTER framework
    moves a rect across the screen """

#Initialize
import pygame
pygame.init()

#Display
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("move a box")

#Entities
#yellow background
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((255, 255, 0))

#make a red 25 x 25 box
box = pygame.Surface((25, 25))
box = box.convert()
box.fill((255, 0, 0))

box2 = pygame.Surface((35, 35))
box2 = box2.convert()
box2.fill((255, 0, 0))

# set up some box variables
box_x = 0
box_y = 200
box2_x = 200
box2_y = 0

#ACTION

    #Assign 
clock = pygame.time.Clock()
keepGoing = True

    #Loop
while keepGoing:

    #Time
    clock.tick(30)

    #Events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            keepGoing = False

    #modify box value
    #lagg till en rad sa att box_x okar med 5 
    box_x=box_x+5
    box2_y=box2_y+5
    #check boundaries
    
    #lagg till en if-sats som kollar om box_x ar pa vag ut fran fonstret
    def checkBounds():        
        if box_x.rect.right >= get_width():
            self.dx = 0
        if box_x.rect.left <= 0:
            self.dx = 0
        if box_x.rect.bottom >= get_height():
            self.dy = 0
        if box_x.rect.top <= 0:
            self.dy = 0
        return checkBounds    
    #satt box_x till 0 om sa ar fallet, d.v.s. att boxen kommer fram pa andra sidan
    if checkBounds == 0:
        box_x=0
    
    #Refresh screen
    screen.blit(background, (0,0))
    screen.blit(box, (box_x, box_y))
    pygame.display.flip()
    
    screen.blit(background, (0,0))
    screen.blit(box2, (box2_x, box2_y))
    pygame.display.flip()               

Uppgiften är alltså:
Lägg till en box som går i Y-LED -> Gjort men min X-Box blir då osynlig?
Stoppa den så att den inte går utanför rutan och kommer till början igen, hur gör man detta?

btw om ni undrar varför det står :
if box_x.rect.top <= 0:
self.dy = 0
*self*.dy
det är för att koden är kopierad från en annan uppgift (färdig exempel) och har bytt ut, IF *self* mot IF box_x , ihopp om att det ska fungera men de gör de inte :/
__________________
Senast redigerad av niicz 2011-06-12 kl. 17:37.
Citera
2011-06-12, 17:47
  #2
Moderator
vhes avatar
Har aldrig använt pygame, så med risk för att min slutsats är fel, men jag tror att box1 försvinner p.g.a. den andra raden som säger:

Kod:
screen.blit(background, (0,0))

Jag antar att den fyller hela arean som innehåller båda boxarna med bakgrundsfärgen? I så fall är det ingen bra ide att göra det efter att du ritat ut din första box.


Anledningen till att din boundary check inte verkar ha någon effekt är att du aldrig anropar den. En funktion måste anropas, inte bara deklareras.
Citera
2011-06-12, 18:02
  #3
Avstängd
Citat:
Ursprungligen postat av vhe
Har aldrig använt pygame, så med risk för att min slutsats är fel, men jag tror att box1 försvinner p.g.a. den andra raden som säger:

Kod:
screen.blit(background, (0,0))

Jag antar att den fyller hela arean som innehåller båda boxarna med bakgrundsfärgen? I så fall är det ingen bra ide att göra det efter att du ritat ut din första box.


Anledningen till att din boundary check inte verkar ha någon effekt är att du aldrig anropar den. En funktion måste anropas, inte bara deklareras.

nja, tar jag bort min andra box, alltså det som är längst ner då för att få fram min box2 så fungerar box 1 med exakt samma kod, fast sätter jag in box2 så försvinner 1an, tror det är något där som gör att den inte pallar visa box1 samtidigt, för rör jag runt rutan som har boxarna i sig så visar den sig då och då :P

hmm hur anropar jag den? return checkBoundaries?
hur gör jag för att få den att fungera då?
Citera
2011-06-12, 18:49
  #4
Moderator
vhes avatar
Citat:
Ursprungligen postat av niicz
nja, tar jag bort min andra box, alltså det som är längst ner då för att få fram min box2 så fungerar box 1 med exakt samma kod, fast sätter jag in box2 så försvinner 1an, tror det är något där som gör att den inte pallar visa box1 samtidigt, för rör jag runt rutan som har boxarna i sig så visar den sig då och då :P

Vad menar du med "tar bort min andra box"? Tar du möjligen bort den andra raden som säger "screen.blit(background, (0,0))" då också?

Citat:
Ursprungligen postat av niicz
hmm hur anropar jag den? return checkBoundaries?
hur gör jag för att få den att fungera då?

Det vet du redan, du har anropat massvis med funktioner i din kod :) Du anropar den genom att skriva dess namn, och ett par parenteser efter.

Kod:
checkBounds()

Nu lär den iofs inte fungera, eftersom den är stulen någon helt annan stans ifrån, men då har du något att börja med i alla fall.
Citera
2011-06-12, 19:20
  #5
Avstängd
Citat:
Ursprungligen postat av vhe
Vad menar du med "tar bort min andra box"? Tar du möjligen bort den andra raden som säger "screen.blit(background, (0,0))" då också?



Det vet du redan, du har anropat massvis med funktioner i din kod Du anropar den genom att skriva dess namn, och ett par parenteser efter.

Kod:
checkBounds()

Nu lär den iofs inte fungera, eftersom den är stulen någon helt annan stans ifrån, men då har du något att börja med i alla fall.

Kod:
    #Refresh screen
    screen.blit(background, (0,0))
    screen.blit(box, (box_x, box_y))
    pygame.display.flip()
    
>  screen.blit(background, (0,0))
>  screen.blit(box2, (box2_x, box2_y))
>  pygame.display.flip() 

de med ">" är borttaget, då syns inte min andra box.

hittade checkbound koden i en annan uppgift också där den inte skiljer sig så mycket från denna... men hur får jag den att "stoppa" då precis innan den ska gå utanför rutan?
jag måste göra en If-sats som håller koll ifall rutan håller på gå utanför, fine.
då måste jag alltså göra en räknare som gör att den åker från punkt A till B
A är 0 och 480 är B eftersom det är så bred rutan är, och när den når 480 ska den stanna/komma till början igen.

antagligen If box_x = 480 något i den stilen då ska den stanna, eller blir det mer avancerat än detta?

edit:
i uppgiften står det:
Tips använd: box_xscreen.get_width(): i If Satsen.
Kod:
if box_x = box_xscreen.get_width():
       box_x=0

vet inte hur xscreen fungerar men på något sätt på detta vis skall det bli nog?
__________________
Senast redigerad av niicz 2011-06-12 kl. 19:24.
Citera
2011-06-13, 13:56
  #6
Medlem
jonthe12s avatar
Kod:
screen.blit(background, (0,0)) #ritar över allt som finns med bakgrundsfärgen, ska bara köras en gång

screen.blit(box, (box_x, box_y)) #blittar boxen på screensurfacen
screen.blit(box2, (box2_x, box2_y)) #blittar boxen på screensurfacen

#alla andra blits som du ev vill ha ska ligga här

pygame.display.flip() #skall bara köras en gång i slutet av whileloopen

Sådär ska det se ut Det du gjort är fel eftersom du suddar ut allt från förra framen, ritar ut box1, sen suddar du ut allt igen (inkl box1), sen ritar du box2 och clock.tick() körs. Eftersom det är under tiden clock.tick() körs som vi faktiskt uppfattar det som är på skärmen så kommer inte box1 synas.

Det du gör när du blittar backgrunden är att du rensar hela skärmen från objekt från förra framen, när du börjar jobba med sprite-objekt kommer du ha clear()-funktionen att jobba med istället för detta.

Din checkbounds() kommer inte heller funka eftersom du inte använder dig av rects ännu. I ditt fall skulle jag nog inte ens använda en funktion, bara skriva
if box_x > get_width(): box_x = 0
if box2_y > get_height(): box2_y = 0
__________________
Senast redigerad av jonthe12 2011-06-13 kl. 14:09.
Citera
2011-06-14, 00:17
  #7
Avstängd
Citat:
Ursprungligen postat av jonthe12
Kod:
screen.blit(background, (0,0)) #ritar över allt som finns med bakgrundsfärgen, ska bara köras en gång

screen.blit(box, (box_x, box_y)) #blittar boxen på screensurfacen
screen.blit(box2, (box2_x, box2_y)) #blittar boxen på screensurfacen

#alla andra blits som du ev vill ha ska ligga här

pygame.display.flip() #skall bara köras en gång i slutet av whileloopen

Sådär ska det se ut Det du gjort är fel eftersom du suddar ut allt från förra framen, ritar ut box1, sen suddar du ut allt igen (inkl box1), sen ritar du box2 och clock.tick() körs. Eftersom det är under tiden clock.tick() körs som vi faktiskt uppfattar det som är på skärmen så kommer inte box1 synas.

Det du gör när du blittar backgrunden är att du rensar hela skärmen från objekt från förra framen, när du börjar jobba med sprite-objekt kommer du ha clear()-funktionen att jobba med istället för detta.

Din checkbounds() kommer inte heller funka eftersom du inte använder dig av rects ännu. I ditt fall skulle jag nog inte ens använda en funktion, bara skriva
if box_x > get_width(): box_x = 0
if box2_y > get_height(): box2_y = 0

super, det där visste jag inte att display.flip å blip ska bara köras engång, dock får jag inte if_box saken att fungera alls :S
Citera
2011-06-14, 13:21
  #8
Medlem
jonthe12s avatar
Citat:
Ursprungligen postat av niicz
super, det där visste jag inte att display.flip å blip ska bara köras engång, dock får jag inte if_box saken att fungera alls :S

Skicka hela koden så får vi se vad du gjort för fel =)
Citera
2011-06-14, 16:42
  #9
Avstängd
Citat:
Ursprungligen postat av jonthe12
Skicka hela koden så får vi se vad du gjort för fel =)
Kod:
""" moveBox.py
    illustrates basic motion
    in the IDEA/ALTER framework
    moves a rect across the screen """


#Initialize
import pygame, random
pygame.init()

mySpeeds = []


#Display
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("move a box")

#Entities
#yellow background
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((255, 255, 0))

#make a red 25 x 25 box
box = pygame.Surface((25, 25))
box = box.convert()
box.fill((255, 0, 0))

box2 = pygame.Surface((35, 35))
box2 = box.convert()
box2.fill((255, 0, 0))

# set up some box variables
box_x = 0
box_y = 200
box2_x = 200
box2_y = 0

#ACTION

    #Assign 
clock = pygame.time.Clock()
keepGoing = True

    #Loop
while keepGoing:

    #Time
    clock.tick(30)

    #Events
    for event in pygame.event.get():
        speed = [random.randint(-5,5), random.randint(-5,5)]
        mySpeeds.append(speed)
        if event.type == pygame.QUIT:
            keepGoing = False

    #modify box value
    #lagg till en rad sa att box_x okar med 5 
    box_x=box_x+5
    box2_y=box2_y+5
    
    
    
    #lagg till en if-sats som kollar om box_x ar pa vag ut fran fonstret 
    #if box_x > get_width():
    #    box_x = 0
    #if box2_y > get_height():
    #    box2_y = 0


    #satt box_x till 0 om sa ar fallet, d.v.s. att boxen kommer fram pa andra sidan
  
    
    #Refresh screen
    screen.blit(background, (0,0))
    screen.blit(box, (box_x, box_y)) #blittar boxen på screensurfacen
    screen.blit(box2, (box2_x, box2_y)) #blittar boxen på screensurfacen
    pygame.display.flip()   

där är hela koden =) början till slut

kolla där koden du gav tipset om

#lagg till en if-sats som kollar om box_x ar pa vag ut fran fonstret
#if box_x > get_width():
# box_x = 0
#if box2_y > get_height():
# box2_y = 0

sen under står de, #satt box_x till 0 om sa ar fallet, d.v.s. att boxen kommer fram pa andra sidan

uppgiften står i koden med '#', kinda =)

edit: har # framför din kod eftersom den visar rött, nu fungerar den förutom att boxarna inte stannar :P "aktivera" dom igen bara =)
Citera
2011-06-14, 17:44
  #10
Medlem
jonthe12s avatar
Ah du måste skriva screen.get_width() och screen.get_height()
Citera
2011-06-14, 18:40
  #11
Avstängd
Citat:
Ursprungligen postat av jonthe12
Ah du måste skriva screen.get_width() och screen.get_height()
var det allt O.o hahaha tack :P hmm sorry kan inge vidare pygame än eftersom läraren hade planerat in det men det var så få som var "beredda" inför pygame så vi har kanske haft en max två genomgångar på det :P
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback