আমি যখন মাউসটি সরিয়ে নিই তখন কেন আমার স্প্রাইট প্লেয়ার দ্রুত চলে?


17

আমি পাইগাম (পাইথন লাইব্রেরি) দিয়ে তৈরি একটি সাধারণ গেমটি বিকাশের চেষ্টা করছি।

আমার কাছে একটি spriteঅবজেক্ট রয়েছে যা এটি playerএবং আমি এ্যার কী ব্যবহার করে এটি সরিয়ে নিয়েছি। আমি যদি মাউসটি না সরাই, স্প্রাইটটি স্বাভাবিকভাবে সরানো হয় তবে আমি যখন মাউসটি সরিয়ে ফেলি তখন স্প্রাইটটি দ্রুত চলে যায় (x2 বা x3 এর মতো) like playerবস্তুর ভিতরে charsGroupVar।

আমি ডাব্লু 7 এবং উবুন্টুতে গেমটি চালিয়েছি। উভয় ওএসে একই জিনিস ঘটে।

আমার আরও সত্ত্বা রয়েছে যা এনপিসি এবং বুলেটের মতো চলে তবে তারা প্রভাবিত হয় না, কেবল প্লেয়ার। এটি দিয়েছি, আমি মনে করি যে সমস্যাটির সম্ভবত প্লেয়ার মুভিং সিস্টেমের সাথে সরাসরি সংযোগ রয়েছে (অ্যারো কীগুলি)।

এখানে অবজেক্টের update()পদ্ধতি player:

def update(self):

    for event in pygame.event.get():
        key = pygame.key.get_pressed()
        mouseX, mouseY = pygame.mouse.get_pos()
        if event.type == pygame.MOUSEBUTTONDOWN:
            self.bulletsGroup.add(Bullet(pygame.image.load("bullet.png"),
                                          self.rect.x + (self.image.get_width()/2),
                                           self.rect.y + (self.image.get_height()/2),
                                            mouseX, mouseY, 50, 50))

        if key[pygame.K_RIGHT]:
            if not self.checkCollision():
                self.rect.x += 10
            else:
                self.rect.x -= 10
        if key[pygame.K_LEFT]:
            if not self.checkCollision():
                self.rect.x -= 10
            else:
                self.rect.x += 10
        if key[pygame.K_UP]:
            if not self.checkCollision():
                self.rect.y -= 10
            else:
                self.rect.y += 10
        if key[pygame.K_DOWN]:
            if not self.checkCollision():
                self.rect.y += 10
            else:
                self.rect.y -= 10

এবং এখানে লুপটি এখানে:

while True:

    if PLAYER.healthBase <= 0:
        GAMEOVER = True

    if not GAMEOVER:
        mapTilesGroup.draw(SCREEN)
        charsGroup.update()
        charsGroup.draw(SCREEN)
        npcsGroup.update()
        npcsGroup.draw(SCREEN)
        drawBullets()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

    if GAMEOVER:
        myfont = pygame.font.SysFont("monospace", 30)
        label = myfont.render("GAME OVER!", 1, (255, 255, 0))
        SCREEN.blit(label, (400, 300))

    freq.tick(0)

    pygame.display.flip() 

আমাকে আরও সাহায্য করার জন্য আপনার আর কী প্রয়োজন হতে পারে তা আমি জানি না, তবে আপনার যা কিছু প্রয়োজন (আরও তথ্য বা কোড) কেবল এটির জন্য জিজ্ঞাসা করুন!


5
আপনার সঠিক ত্রুটি আসলে অনেকগুলি অ্যাপ্লিকেশনে বিদ্যমান। একটি বড় দস্তাবেজে নির্বাচন করে টানুন এবং আপনার কার্সারটিকে প্রান্ত থেকে সরানোর চেষ্টা করুন। সাধারণত প্রোগ্রামের প্রান্তের স্ক্রোলটি লাথি মেরে ধীরে ধীরে ডকুমেন্টটি আরও নির্বাচন করে। যদি আপনি আপনার মাউসকে পাশ থেকে অন্য দিকে সরিয়ে থাকেন তবে এটি সাধারণত খুব দ্রুত স্ক্রোল হয়ে যায়, কারণ তাদের স্ক্রোলের গতিটি তাদের ইভেন্টের লুপের সাথে আবদ্ধ থাকে এবং এক্স গতিগুলি বার বার তাদের ইভেন্টের লুপটি জাগায়।
বেন জ্যাকসন

2
@ বেনজ্যাকসন আমি দেখতে পেয়েছি যে স্ক্রোলিংটি শুরু করার জন্য মারাত্মকভাবে ধীরে ধীরে যখন একটি কার্যকর বাগ হতে পারে।
ব্যবহারকারী 253751

1
এটি আপনার বাগের সাথে সম্পর্কিত নয়, তবে আমি একবারে ছবিটি লোড করার এবং এটি কোনও বস্তুতে সঞ্চয় করার পরামর্শ দেব। BULLET_IMAGE = pygame.image.load("bullet.png")এবং তারপরেself.bulletsGroup.add(Bullet(BULLET_IMAGE...
DJMcMayhem

@ ডিজেএমসিএমহেম আপনি সম্পূর্ণরূপে ঠিক বলেছেন, আমি বাকী চিত্রগুলি দিয়ে এটি করেছি তবে আমি এটি দিয়ে এটি মিস করেছি .. ধন্যবাদ! :)
ড্রামববাস 23'15

উত্তর:


42

tl; dr আপনার ইভেন্টের লুপটি আপনার সাথে মিশ্রিত করবেন না গেমের লুপের

আপনি যখন মাউসটি সরান, গেমটি pygame.MOUSEMOTIONইভেন্টগুলির একটি লোড পায় । আপনি আপনার মাউসের অবস্থান আপডেট করার জন্য এই ইভেন্টগুলি বাস্তবে ব্যবহার করবেন না যদিও আপনি মাউসের ব্যবহারের বর্তমান অবস্থাটি ব্যবহার করছেনpygame.mouse.get_pos() । এটি অদক্ষ, তবে এটি সমস্যা নয়।

সমস্যাটি হল আপনি প্লেয়ারের অবস্থান আপডেট করছেন upd ইভেন্ট লুপের অভ্যন্তরে !

এটিই হবার কথা ছিল:

game loop:
    event loop # get key presses, mouse moves etc.)
    if key pressed in the event loop:
        move the player

আপনার কোড এটি করে:

game loop:
    event loop:
        if key pressed:
            move the player

আপনি যখন মাউসটি সরান, ইভেন্ট লুপটি ফ্রেম প্রতি বহুবার চালিত হয়। তবে যখন আপনি কীগুলি টিপুন তা পরীক্ষা করেনpygame.key.get_pressed() , কিছুক্ষণ পরে, আপনাকে ছেড়ে না দেওয়া পর্যন্ত সেগুলি চাপা থাকে। সুতরাং আপনার ইভেন্টের লুপটি মাউস মুভ ইভেন্টগুলির মাধ্যমে মন্থন করায় এটি প্লেয়ারের চালগুলি বারবার প্রয়োগ করবে।

সমাধানটি সহজ: প্লেয়ারটিকে ইভেন্ট লুপের বাইরে নিয়ে যান।


1
ধন্যবাদ! এটি এখন নিখুঁতভাবে কাজ করে এবং সম্ভবত আমি বুঝতে পারিনি যে কি হচ্ছে! বিটিডব্লিউ, আপনি কেন pygame.mouse.get_pos()এটি অদক্ষ বলে? আমার কী বিকল্প আছে?
ড্রামববাস

হাই কংগাসবঙ্গাস, আপনি কি আমাকে তা ব্যাখ্যা করতে পারেন? ধন্যবাদ।
ড্রামনবাস 24'15

@ ড্রামনবাস pygame.mouse.get_pos()ইভেন্টের সারি নির্বিশেষে মাউসের সর্বশেষতম অবস্থান অর্জন করবে, সুতরাং ইভেন্ট লুপের ভিতরে এটি রাখার দরকার নেই। বিকল্পটি হ'ল প্রত্যেককে pygame.MOUSEMOTIONনিজেরাই প্রক্রিয়া করা হবে , তবে যতক্ষণ না আপনার প্রতিটি ইভেন্টের প্রয়োজন হয় (উদাহরণস্বরূপ আপনি কোনও চিত্রকলার প্রোগ্রাম লিখছেন), সর্বশেষ অবস্থানটি করবে।
কংগ্রেসবঙ্গাস

3

বিদ্যমান উত্তরের পরিপূরক করতে এখানে আরও কিছু চিন্তাভাবনা দেওয়া হল

গ্যাফার অন গেমসে গেম লুপগুলির বিষয়ে একটি দুর্দান্ত নিবন্ধ রয়েছে যা সর্বত্র উল্লেখ করা হয়েছে।

আপনার গেম লুপের বিভিন্ন স্বতন্ত্র পর্যায়ে থাকতে হবে: ইনপুট, আপডেট, রেন্ডার।

আপনি উদাহরণস্বরূপ ইনপুটগুলি প্রতি সেকেন্ডে 30 বার পড়তে পারেন (বা রিয়েল-টাইমে আরও ভাল প্রতিক্রিয়াশীলতার জন্য), প্রতি সেকেন্ডে 30 আপডেট করে প্রতি সেকেন্ডে 60 ফ্রেম সরবরাহ করতে পারেন, বা যা কিছু মান আপনার গেমের জন্য ভাল কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.